2014-02-14 1 views
0

XSS и SQL-инъекции являются двумя основными рисками безопасности при использовании неанитированного пользовательского ввода.Риск безопасности, вызванный несанкционированным вводом пользователя, кроме XSS и SQL-инъекций в PHP?

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

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

+0

Есть еще XSRF. –

+0

@MarcusAdams Это не проблема неправильной обработки данных, а неправильная аутентификация запроса. – Gumbo

+0

Существует также обход трассировки, в котором вы не можете правильно фильтровать и проверять имена файлов и путей, что приводит к чтению или записи в неправильные места в вашей файловой системе. –

ответ

0

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

+0

Длина ввода и типы данных имеют риск безопасности? – SCC

+0

Извините за задержку, на работе! Это были только примеры, но здесь более конкретный пример. Скажем, у вас есть поле на вашем сайте, которое позволяет пользователю искать что-то, используя почтовый индекс, если вы проверяете почтовый индекс, чтобы вход был принят только в том случае, если почтовый индекс следует структуре почтового индекса и длине почтового индекса, например. LNN NLL (L = Letter, N = Number) это сделает его намного более безопасным для людей, пытающихся ввести вредоносный код, так как это поле не позволит вам запускать какие-либо данные, которые не соответствуют этой структуре или превышают эту длину. –

1

Просто некоторые возможные проблемы подле XSS и SQL-инъекции:

Это всегда зависит, где вы проходите UserInput и как дезинфицировать его. Например всегда использовать 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, addslashes и т. Д.) Не поможет вообще.

Также посмотрите здесь, пожалуйста: Exploitable PHP functions

+0

+1 хороший список и хорошие примеры. И спасибо за ссылку на этот поток на эксплуататорских функциях PHP, это хорошо. –

+0

@thebod _В этом случае только intval() может помочь_, Тогда как насчет MYSQLI в этом случае подготовил staement? – SCC

+0

Ну, я имел в виду 'intval()' в случае, если вы не используете PDO. PDO всегда должен быть способ пойти, потому что он предотвращает вас от вредоносных введенных параметров. – thebod

3

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

Что касается XSS, так как htmlspecialchars экранирует специальные символы HTML <, >, &, " и ' ссылками символов HTML, он будет защищать вас, только если поместить данные в a context in HTML where <, >, &, ", or ' are the context delimiters, но не поможет, если другие разделители (например, unquoted HTML attribute value, или вы уже вошли в другой контекст в HTML (например, значение атрибута HTML, которое рассматривается как код JavaScript, например атрибуты события on…) или внутри HTML-элементов, которые являются другим языком, например <script>, или <style>, где применяются другие/дополнительные правила). Не говоря уже о так называемом DOM-based XSS, где вход не обрабатывается сервером а клиентским JavaScript.Таким образом, есть ситуации, в которых htmlspecialchars не поможет.

Однако, в отношении emulated or real prepared statements, вы должны быть в безопасности, поскольку уровень подключения к базе данных или СУБД позаботится о правильной обработке данных. Если, конечно, вы не still building the statement to be prepared by using improperly processed data.

1

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-инъекции?

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

Смежные вопросы