Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Różnica między real_escape_string i Prepare()?

Ucieczka jest tak samo skuteczna w ochronie przed wstrzyknięciem SQL, jak przy użyciu parametrów zapytania.

Obie metody są również mniej skuteczne, jeśli nie stosujesz ich konsekwentnie.

Obie metody są przydatne tylko do ochrony poszczególnych wartości w wyrażeniach SQL. Nie obsługują innych dynamicznych części zapytania. Na przykład, jeśli chcesz ZAMÓWIĆ WEDŁUG kolumny określonej przez użytkownika. Ani parametry zapytania, ani funkcje ucieczki nie obsługują tego.

Zasadniczo jest to więc kwestia stylu i osobistych preferencji.

Preferuję parametry zapytania, ponieważ uważam, że:

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

Jest bardziej jasne niż to:

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

Nie możesz poważnie tego mówić, bawiąc się tymi wszystkimi otwartymi cytatami/zamkniętymi cytatami i . łączenie ciągów jest łatwiejsze niż używanie metody przygotowywania() z parametrami zapytania.

Sprawdź swoje komentarze na temat hipotetycznego query() funkcja z parametrami.

Przede wszystkim nie jest to konieczne. Używanie razem metody Prepare() i execute() to niewielka cena za napisanie bezpiecznego kodu, a naleganie na zrobienie tego za pomocą jednej funkcji brzmi po prostu na leniwego. Przypuszczam, że nie sprawdzasz wartości zwracanej funkcji, które zwracają false w przypadku błędu?

Jeśli jest to warte, łatwo byłoby napisać funkcję opakowującą, która wykona obie te czynności, ponieważ PHP obsługuje niejawnie 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.
}



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Połączenie gniazda Unix do MySql z Javą, aby uniknąć obciążenia JDBC TCP/IP?

  2. MySql — narzędzie do monitorowania replikacji

  3. Projektowanie bazy danych przepisów, która musi zawierać zarówno składniki, jak i podprzepisy

  4. Railsy 3.2.6 i tworzenie widoków baz danych poprzez migracje

  5. Elokwentny wiele-do-wielu-do-wielu - jak łatwo załadować odległą relację