Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Unterschied zwischen "real_escape_string" und "prepare()"?

Escaping ist beim SQL-Injection-Schutz genauso effektiv wie die Verwendung von Abfrageparametern.

Beide Methoden sind auch weniger effektiv, wenn Sie sie nicht konsequent anwenden.

Beide Methoden sind nur zum Schutz einzelner Werte sinnvoll in SQL-Ausdrücken. Sie unterstützen keine anderen dynamischen Teile der Abfrage. Zum Beispiel, wenn Sie ORDER BY einer benutzerdefinierten Spalte verwenden möchten. Weder Abfrageparameter noch Escape-Funktionen handhaben das.

Im Grunde ist es also eine Frage des Stils und der persönlichen Vorlieben.

Ich bevorzuge Abfrageparameter, weil ich Folgendes denke:

$sql = "INSERT INTO mytable (columna, columnb, columnc) VALUES (?, ?, ?)";
$stmt = $pdo->prepare($sql);
$stmt->execute([$a, $b, $c]);

Ist klarer als das:

$sql = "INSERT INTO mytable (columna, columnb, columnc) VALUES ('".mysqli_real_escape_string($conn, $a)."', '".mysqli_real_escape_string($conn, $b)."', '".mysqli_real_escape_string($conn, $c)."')";
mysqli_query($conn, $sql);

Sie können nicht ernsthaft sagen, dass Sie mit all diesen offenen Anführungszeichen / geschlossenen Anführungszeichen und . herumspielen Die Verkettung von Strings ist einfacher als die Verwendung von Prepare() mit Abfrageparametern.

Beziehen Sie sich auf Ihre Kommentare zu einer hypothetischen query() Funktion mit Parametern.

Zunächst einmal ist es nicht notwendig. Die gemeinsame Verwendung von Prepare() und Execute() ist ein kleiner Preis für das Schreiben von sicherem Code, und wenn Sie darauf bestehen, dies mit einer einzigen Funktion zu tun, klingen Sie einfach faul. Ich nehme an, Sie überprüfen nicht den Rückgabewert von Funktionen, die false zurückgeben auf Fehler, entweder?

Für das, was es wert ist, wäre es einfach, eine Wrapper-Funktion zu schreiben, die beides tut, weil PHP varargs implizit unterstützt.

function myquery() {
  global $pdo;
  $params = func_get_args();
  $sql = array_shift($params);
  $stmt = $pdo->prepare($sql);
  $stmt->execute($params);
  return $stmt; // so we can fetch(), etc.
}