sql >> Database >  >> RDS >> Mysql

Verschil tussen real_escape_string en prepare()?

Escaping is net zo effectief bij de verdediging van SQL-injectie als het gebruik van queryparameters.

Beide methoden zijn ook minder effectief als u ze niet consequent toepast.

Beide methoden zijn alleen nuttig voor het beschermen van individuele waarden in SQL-expressies. Ze ondersteunen geen andere dynamische delen van de query. Als u bijvoorbeeld wilt BESTELLEN OP een door de gebruiker opgegeven kolom. Noch queryparameters noch escape-functies behandelen dat.

Dus eigenlijk is het een kwestie van stijl en persoonlijke voorkeur.

Ik geef de voorkeur aan queryparameters omdat ik dit denk:

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

Is duidelijker dan dit:

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

Dat kun je toch niet serieus zeggen met al die aanhalingstekens openen/sluiten en . tekenreeksaaneenschakeling is gemakkelijker dan het gebruik van prepare() met queryparameters.

Over uw opmerkingen over een hypothetische query() functie met parameters.

Ten eerste is het niet nodig. Het samen gebruiken van prepare() en execute() is een kleine prijs om te betalen voor het schrijven van veilige code, en door erop aan te dringen dit met een enkele functie te doen, klink je gewoon lui. Ik neem aan dat je de geretourneerde waarde niet controleert van functies die false retourneren ook bij een fout?

Voor wat het waard is, zou het gemakkelijk zijn om een ​​wrapper-functie te schrijven om beide te doen, omdat PHP varargs impliciet ondersteunt.

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



  1. Kan ik de datum in mySQL invoegen in DD-Mon-YY-formaat?

  2. Stel de tekenset en sortering van een database in MariaDB in

  3. Hoe kan ik meerdere tabellen samenvoegen in symfony2?

  4. XAMPP MySQL-service crasht na opnieuw opstarten