Риски безопасности, вызванные непроверенным пользовательским вводом, кроме внедрения XSS и SQL в PHP?

XSS- и SQL-инъекции — две основные угрозы безопасности из-за непроверенного пользовательского ввода.

XSS можно предотвратить (когда нет WYSIWYG) с помощью htmlspecialchars(), а внедрение SQL можно предотвратить с помощью параметризованных запросов и связанных переменных.

Используя эти два метода, безопасно ли использовать весь несанитизированный ввод?


person SCC    schedule 14.02.2014    source источник
comment
@MarcusAdams Это проблема не неправильной обработки данных, а неправильной аутентификации запроса.   -  person Gumbo    schedule 14.02.2014
comment
Существует также обход пути, при котором вы не можете правильно отфильтровать и проверить имена файлов и путей, что приводит к чтению или записи в неправильных местах в вашей файловой системе.   -  person Michael Berkowski    schedule 14.02.2014
comment
@MichaelBerkowski Я никогда не использую предоставленные пользователем данные для имен файлов/каталогов. –   -  person SCC    schedule 15.02.2014


Ответы (4)


Вы всегда должны учитывать контекст, в котором используются данные. Потому что упомянутые функции и методы работают только в том случае, если они используются в соответствии с целью их использования. Это относится не только к HTML и SQL, но и к любому другому языку/контексту.

Что касается XSS, поскольку htmlspecialchars экранирует специальные символы HTML <, >, &, " и ' с помощью ссылок на символы HTML. , он защитит вас, только если вы поместите данные в контекст в HTML, где <, >, &, " или ' являются контекстом разделители, но не помогут, если применяются другие разделители (например, значение HTML-атрибута без кавычек, или вы уже ввели другой контекст в HTML (например, значение HTML-атрибута, которое рассматривается как код JavaScript, как атрибуты события on…; или в HTML-элементах, которые относятся к другому языку, например , <script> или <style>, где применяются другие/дополнительные правила). XSS, где ввод обрабатывается не сервером, а с помощью клиентского JavaScript. Так что бывают ситуации, в которых htmlspecialchars вам не поможет.

Однако, что касается эмулированных или реальных подготовленных операторов, вы должны быть в безопасности, так как уровень соединения с базой данных или СУБД возьмут на себя заботиться о правильной обработке данных. Если, конечно, вы все еще не создаете подготовленный оператор, используя неправильно обработанные данные.

person Gumbo    schedule 14.02.2014

Вот лишь некоторые возможные проблемы помимо XSS и SQL-инъекций:

Это всегда зависит от того, где вы передаете пользовательский ввод и как вы его дезинфицируете. Например, всегда используйте PDO для операций SQL, потому что даже при правильном экранировании злоумышленник может внедрить код SQL вообще без кавычек:

SELECT title, content FROM cms WHERE id = 1

Злоумышленник может изменить это на:

SELECT title, content FROM cms WHERE id = -1 UNION SELECT username AS title, password AS content from users LIMIT 1

В этом случае может помочь только intval(), а экранирование (mysql_real_escape_string, magic_quotes, addlashes и т.д...) вообще не поможет.

Также взгляните сюда: Используемые функции PHP

person thebod    schedule 14.02.2014
comment
+1 хороший список и хорошие примеры. И спасибо за ссылку на эту ветку об эксплойтных функциях PHP, это хорошая ссылка. - person Bill Karwin; 15.02.2014
comment
@thebod В этом случае может помочь только intval() , тогда как насчет MYSQL, подготовленного в этом случае? - person SCC; 18.02.2014
comment
Ну, я имел в виду intval() на случай, если вы не используете PDO. PDO всегда должен быть правильным, потому что он предотвращает ввод вредоносных параметров. - person thebod; 19.02.2014

Внедрение SQL — это лишь один из случаев более широкой угрозы внедрения кода. То есть любой случай, когда пользовательский ввод (или любой другой ненадежный контент) выполняется как код.

Это включает в себя такие вещи, как eval(), а также немало других векторов. Ответ от @thebod включает ссылку на отличный поток StackOverflow: Используемые функции PHP.

Даже внедрение SQL не может быть решено на 100% с помощью параметров или экранирования. Оба эти метода помогают очистить только отдельные значения в выражениях SQL. Вам также может потребоваться разрешить ввод данных пользователем для выбора таблиц, столбцов, ключевых слов SQL или целых выражений. Для них параметры и экранирование не помогают. Пример:

$sql = "SELECT * FROM mytable ORDER BY $sortcolumn $asc_or_desc";

В этом примере имя столбца для сортировки и направление (ASC против DESC) основаны на переменных. Были ли переменные установлены из доверенных входных данных или параметры $_GET использовались дословно, что привело к уязвимости SQL-инъекций?

Лучшим решением для таких случаев является белый список. То есть возьмите пользовательский ввод, сравните его со списком имен столбцов, которые разрешены для этого динамического запроса, и, если пользовательский ввод не соответствует ни одному из этих предопределенных вариантов, либо сбой, либо используйте значение по умолчанию.

person Bill Karwin    schedule 14.02.2014

Используя эти методы, ваш пользовательский ввод по большей части уже очищен. Если вы хотите сделать еще один шаг, вы можете выполнить проверку ввода перед запуском кода SQL. Например, проверка чисел только числовая, проверка длины пользовательского ввода и т. д.

person d.abyss    schedule 14.02.2014
comment
Длина входных данных и типы данных имеют какой-либо риск для безопасности? - person SCC; 14.02.2014
comment
Извините за задержку, на работе! Это были просто примеры, но вот более конкретный пример. Скажем, у вас есть поле на вашем сайте, которое позволяет пользователю искать что-то с использованием почтового индекса, если вы проверяете почтовый индекс, так что ввод будет принят только в том случае, если почтовый индекс соответствует структуре почтового индекса и длине почтового индекса, например. LNN NLL (L=Буква, N=Число) это сделает его намного более безопасным от людей, пытающихся ввести вредоносный код, так как это поле не позволит вам запускать ввод, который не соответствует этой структуре или превышает эту длину. - person d.abyss; 14.02.2014