To nie jest takie proste. Można użyć parametrów oprawionych zamiast interpolacji zmiennych aplikacji do wyrażenia SQL zamiast wartości dosłownych tylko:
$sql = "SELECT * FROM MyTable WHERE id = ".$_GET["id"]; // not safe
$sql = "SELECT * FROM MyTable WHERE id = ?"; // safe
Ale co, jeśli trzeba wykonać część zapytania dynamiczny oprócz wartości dosłownym?
$sql = "SELECT * FROM MyTable ORDER BY ".$_GET["sortcolumn"]; // not safe
$sql = "SELECT * FROM MyTable ORDER BY ?"; // doesn't work!
Parametr będzie zawsze interpretowany jako wartość, a nie jako identyfikator kolumny. Możesz uruchomić zapytanie o numerze ORDER BY 'score'
, które różni się od ORDER BY score
, a użycie parametru będzie interpretowane jako poprzednie - ciąg stały 'score'
, a nie wartość w kolumnie o nazwie score
.
Tak więc istnieje wiele przypadków, w których trzeba użyć dynamicznego SQL i interpolować zmienne aplikacji do zapytania, aby uzyskać pożądane wyniki. W takich przypadkach parametry zapytania nie pomogą. Nadal musisz być czujny i kodować defensywnie, aby zapobiec wadom wstrzyknięcia SQL.
Żadna biblioteka ramowa ani biblioteka dostępu do danych nie mogą wykonać tej pracy za Ciebie. Zawsze można skonstruować ciąg zapytania SQL, który zawiera lukę w iniekcji SQL, i robisz to, zanim biblioteka dostępu do danych zobaczy zapytanie SQL. Więc jak to jest wiedzieć, co jest zamierzone, a co wadą?
Oto sposoby osiągnięcia bezpiecznych zapytań SQL: wejście
filtra. Śledzenie wszelkich danych zmiennych, które zostaną wstawione do zapytań SQL. Użyj wejścia filters, aby usunąć niedozwolone znaki.Na przykład, jeśli oczekujesz liczby całkowitej, upewnij się, że wejście jest ograniczone do liczby całkowitej.
Wyjście awaryjne. Dane wyjściowe w tym kontekście mogą być kwerendami SQL wysyłanymi do serwera bazy danych. Wiesz, że możesz używać parametrów zapytania SQL dla wartości, ale co z nazwą kolumny? Potrzebujesz identyfikatora dla funkcji escaping/quoting, tak jak stara mysql_real_escape_string()
jest dla wartości łańcuchowych.
Recenzje kodów. Poszukaj kogoś, kto będzie drugą parą oczu i przejrzyj kod SQL, aby pomóc Ci rozpoznać miejsca, w których zaniedbałeś korzystanie z powyższych dwóch technik.
Tak. Zauważyłeś, że nie możesz wykonać ORDER BY? bit z parametrami. Dobra odpowiedź. –
Mam awans? Downvoter, powinieneś opisać, dlaczego uważasz, że ta odpowiedź nie jest satysfakcjonująca. Być może mogę to poprawić. –