Ściśle mówiąc, nie ma właściwie potrzeby ucieczki, ponieważ wartość parametru nigdy nie jest interpolowana do ciągu zapytania.
Sposób działania parametrów zapytania polega na tym, że zapytanie jest wysyłane do serwera bazy danych po wywołaniu prepare()
, a wartości parametrów są wysyłane później, po wywołaniu execute()
. Są więc oddzielone od tekstowej formy zapytania. Nigdy nie ma możliwości wstrzyknięcia SQL (pod warunkiem, że PDO::ATTR_EMULATE_PREPARES
jest fałszywe).
Tak, parametry zapytania pomagają uniknąć tej luki w zabezpieczeniach.
Czy są one w 100% odporne na wszelkie luki w zabezpieczeniach? Nie, oczywiście nie. Jak być może wiesz, parametr zapytania zajmuje tylko miejsce pojedynczej wartości literowej w wyrażeniu SQL. Nie można zrobić jednego parametru zastępczego dla listy wartości, na przykład:
SELECT * FROM blog WHERE userid IN (?);
nie można użyć parametru, aby nazwy tabel lub nazwy kolumn dynamiczna:
SELECT * FROM blog ORDER BY ?;
Można „t użyć parametru dla innego rodzaju składni SQL:
SELECT EXTRACT(? FROM datetime_column) AS variable_datetime_element FROM blog;
Tak więc istnieje sporo przypadków, w których trzeba manipulować kwerendy jako ciąg, przed wywołaniem prepare()
. W takich przypadkach nadal trzeba napisać kod ostrożnie, aby uniknąć iniekcji SQL.
to była bardzo dobra informacja. Dziękuję Ci! – sqram
Również "LIKE?" Jest poprawne, ale powinieneś unikać znaków używanych do dopasowywania. –
Jeśli chodzi o "Nigdy nie ma możliwości wstrzyknięcia SQL (pod warunkiem, że PDO :: ATTR_EMULATE_PREPARES jest fałszywe).", Czy oznacza to, że emulowane emulacje PDO NIE są tak bezpieczne, jak natywne przygotowanie sterownika db? Jeśli tak, dlaczego? –