Ściśle mówiąc, w rzeczywistości nie ma potrzeby stosowania 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, gdy wywołasz execute()
. Dlatego są one oddzielone od tekstowej formy zapytania. Nigdy nie ma możliwości wstrzyknięcia SQL (pod warunkiem, że PDO::ATTR_EMULATE_PREPARES
jest fałszywe).
A więc tak, parametry zapytania pomagają uniknąć tej formy luki w zabezpieczeniach.
Czy są w 100% odporne na wszelkie luki w zabezpieczeniach? Nie, oczywiście nie. Jak być może wiesz, parametr zapytania zastępuje tylko pojedynczą wartość literału w wyrażeniu SQL. Nie możesz zastąpić listy wartości pojedynczym parametrem, na przykład:
SELECT * FROM blog WHERE userid IN ( ? );
Nie możesz użyć parametru, aby nazwać tabele lub nazwy kolumn dynamicznymi:
SELECT * FROM blog ORDER BY ?;
Nie możesz użyć parametru dla żadnego innego typu składni SQL:
SELECT EXTRACT( ? FROM datetime_column) AS variable_datetime_element FROM blog;
Jest więc sporo przypadków, w których musisz manipulować zapytaniem jako ciągiem, przed prepare()
połączenie. W takich przypadkach nadal musisz pisać kod ostrożnie, aby uniknąć wstrzyknięcia SQL.