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