SQL-инъекция - это только один случай более широкой угрозы code injection. То есть в любом случае, когда пользовательский ввод (или любой другой ненадежный контент) запускается как код.
Это включает в себя такие вещи, как eval(), но еще немало векторов. Ответ от @thebod включает ссылку на отличный поток StackOverflow: Exploitable PHP functions.
Даже SQL-инъекция не может быть решена 100% по параметрам или экранированию. Обе эти методы помогают только дезинфицировать значения в выражениях SQL. Вам также может потребоваться ввести пользовательский ввод для выбора таблиц, столбцов, ключевых слов SQL или целых выражений. Для тех, параметры и экранирование не помогают. Пример:
$sql = "SELECT * FROM mytable ORDER BY $sortcolumn $asc_or_desc";
В этом примере имя столбца для сортировки по и направление (ASC
против DESC
) основаны на переменных. Были ли переменные заданы с помощью доверенного ввода или параметры $ _GET использовались дословно, что привело к уязвимости SQL-инъекции?
Лучшим решением для этих случаев является белый список. То есть, возьмите пользовательский ввод, сравните его со списком имен столбцов, которые разрешены для этого динамического запроса, и если пользовательский ввод не соответствует одному из этих предопределенных вариантов, либо сбой, либо использование значения по умолчанию.
Есть еще XSRF. –
@MarcusAdams Это не проблема неправильной обработки данных, а неправильная аутентификация запроса. – Gumbo
Существует также обход трассировки, в котором вы не можете правильно фильтровать и проверять имена файлов и путей, что приводит к чтению или записи в неправильные места в вашей файловой системе. –