Как я могу предотвратить атаки SQL второго порядка? - PullRequest
4 голосов
/ 22 марта 2012

Я использую PHP PDO для своих запросов везде, но я читал, что в очень редких случаях все еще могут быть "инъекции второго порядка", когда небезопасная переменная сохраняется, а затем выполняется при использовании в другойзаявление.

Будут ли подготовленные заявления по-прежнему защищать от этого?Пока я уверен, что я всегда использую их?Или я должен принять больше мер предосторожности?Я все еще уязвим к атакам XSS?

У меня также есть пара вопросов, просто из любопытства, если вы все не возражаете:

  1. Возможно ли этоиметь SQL-инъекцию только с буквенно-цифровыми символами, пробелами и одной чертой?Как select * from something where name='$some_variable'.Кажется, что все примеры, которые я видел, требуют других символов, таких как точки с запятой, кавычки или двойные черты.

  2. Я читал много примеров SQL, где небезопасная переменная может быть установлена ​​для формирования другойоператор, например

    $foo = "foo'); INSERT INTO users (name) VALUES ('hi";
    $bar = ("INSERT INTO users (name) VALUES ('$foo')");
    

Но я только что проверил, а mysql_query даже не допускает множественных утверждений.Я знаю, что у вас все еще могут быть инъекции в пределах одного оператора, но могу ли я подтвердить, что у вас не будет проблем с несколькими операторами в PHP?

Ответы [ 2 ]

3 голосов
/ 22 марта 2012

Не бить мертвую (или очень живую?) Лошадь, но ...

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

Ключ к предотвращению any Внедрение SQL предназначено для правильной проверки и экранирования входящих данных КАЖДЫЙ раз, в то время, когда они входят в оператор SQL.Самый простой способ сделать это - просто использовать подготовленные операторы, которые позаботятся о вас, позволяя безопасно передавать параметры в оператор SQL.

Каждая библиотека базы данных имеет свой собственный способ экранирования или использования подготовленногозаявления.В MySQL и PHP у вас есть mysqli_real_escape_string(), который следует использовать ПЕРИОД КАЖДОГО ВРЕМЕНИ , когда вы используете библиотеку mysqli.

Библиотека PDO имеет свой собственный путь, ноесли я правильно помню, подготовленные заявления были большой частью PDO - используйте их 100% времени, и вы будете в порядке в этом отношении.

0 голосов
/ 22 марта 2012

Чтобы предотвратить повторные XSS-атаки, используйте HTML Purifier и никогда не strip_tags (), см. Ссылки ниже для получения дополнительной информации, подготовленные операторы PDO должны подойти для предотвращения внедрения SQL:

http://www.reddit.com/r/PHP/comments/nj5t0/what_everyone_should_know_about_strip_tags/

http://htmlpurifier.org/

...