Mysql
 sql >> Base de données >  >> RDS >> Mysql

Différence entre real_escape_string et prepare() ?

L'échappement est tout aussi efficace pour la défense contre l'injection SQL que l'utilisation de paramètres de requête.

Les deux méthodes sont également moins efficaces si vous ne les appliquez pas systématiquement.

Les deux méthodes ne sont utiles que pour protéger les valeurs individuelles dans les expressions SQL. Ils ne prennent pas en charge les autres parties dynamiques de la requête. Par exemple, si vous souhaitez ORDER BY une colonne spécifiée par l'utilisateur. Ni les paramètres de requête ni les fonctions d'échappement ne gèrent cela.

Donc, fondamentalement, c'est une question de style et de préférence personnelle.

Je préfère les paramètres de requête car je pense que :

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

C'est plus clair que ça :

$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);

Vous ne pouvez pas sérieusement dire cela en jouant avec tous ces guillemets ouverts/fermés et . la concaténation de chaînes est plus facile que d'utiliser prepare() avec des paramètres de requête.

Re vos commentaires sur une hypothétique query() fonction avec des paramètres.

A priori, ce n'est pas nécessaire. Utiliser prepare() et execute() ensemble est un petit prix à payer pour écrire du code sécurisé, et en insistant pour le faire avec une seule fonction, vous semblez paresseux. Je suppose que vous ne vérifiez pas la valeur de retour des fonctions qui renvoient false en cas d'erreur non plus ?

Pour ce que ça vaut, il serait facile d'écrire une fonction wrapper pour faire les deux, car PHP supporte implicitement les varargs.

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.
}