sql >> Database teknologi >  >> RDS >> Mysql

Forskellen mellem real_escape_string og prepare()?

Escape er lige så effektivt til SQL-injektionsforsvar som at bruge forespørgselsparametre.

Begge metoder er også mindre effektive, hvis du undlader at gøre dem konsekvent.

Begge metoder er kun nyttige til at beskytte individuelle værdier i SQL-udtryk. De understøtter ikke andre dynamiske dele af forespørgslen. For eksempel hvis du ønsker at BESTILLE EFTER en brugerspecificeret kolonne. Hverken forespørgselsparametre eller escape-funktioner håndterer det.

Så dybest set er det et spørgsmål om stil og personlige præferencer.

Jeg foretrækker forespørgselsparametre, fordi jeg mener dette:

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

Er mere tydeligt end dette:

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

Du kan ikke seriøst sige, at det at rode med alle de åbne citater/lukke-citater og . strengsammenkædning er nemmere end at bruge prepare() med forespørgselsparametre.

Gentag dine kommentarer om en hypotetisk query() funktion med parametre.

Først og fremmest er det ikke nødvendigt. At bruge prepare() og execute() sammen er en lille pris at betale for at skrive sikker kode, og ved at insistere på at gøre det med en enkelt funktion, lyder du bare doven. Jeg formoder, at du ikke tjekker returværdien af ​​funktioner, der returnerer false enten ved fejl?

For hvad det er værd, ville det være nemt at skrive en indpakningsfunktion til at gøre begge dele, fordi PHP understøtter varargs implicit.

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. PHP Ingen database valgt

  2. Databasedesign til brugerdefineret formularbygger (og lagring af resultater)

  3. SAMLING 'utf8_general_ci' er ikke gyldig for CHARACTER SET 'latin1'

  4. Sådan får du dagen fra en date i T-SQL