Уязвим ли мой код к SQL-инъекциям с помощью этого предложения LIKE? - PullRequest
1 голос
/ 06 сентября 2011

Я выполняю поиск в реальном времени с помощью jQuery и PHP, но я не уверен, уязвим ли мой запрос для инъекции SQL.

Данные помещаются в файл PHP при наборе символов с помощью символовjQuery.

$searchData = $_POST['searchData']; 

$searchResult = mysql_query("SELECT * FROM songs WHERE songname LIKE '$searchData%' "); 

echo $searchResult;

Является ли это уязвимым для SQL-инъекций?

Ответы [ 7 ]

9 голосов
/ 06 сентября 2011

Да, рассмотрим, если $searchData равно:

Robert'); DROP TABLE songs; --
1 голос
/ 06 сентября 2011

используйте mysql_real_escape_string($_POST['searchData']) или [PDO] вместо mysql _ *

0 голосов
/ 23 сентября 2011

Да, это уязвимо. Но другие респонденты не заметили, что наряду с обычным экранированием (например, mysql_real_escape_string()) вам также необходимо экранировать символ% для предложения LIKE!

mysql_real_escape_string(addcslashes($str, "%_"))

Хитрость, которую нужно понять, заключается в том, что нет ничего подобного "универсальному цитированию" . При цитировании вы всегда цитируете текст для определенного вывода , например:

  1. строковое значение для запроса MySQL
  2. like выражение для запроса MySQL
  3. HTML-код
  4. * 1023 JSON *
  5. регулярное выражение mysql
  6. php регулярное выражение

Для каждого случая вам нужны разные кавычки, потому что каждое использование присутствует в различном синтаксическом контексте. Это также подразумевает, что цитирование должно производиться не при вводе в PHP, а при конкретном выводе ! Именно поэтому такие функции, как magic_quotes_gpc, не работают ( никогда не забывайте обращаться с ним, или, что еще лучше, убедитесь, что он выключен !!! ).

Итак, какие методы можно использовать для цитирования в этих конкретных случаях? (Не стесняйтесь поправлять меня, могут быть более современные методы, но они работают для меня)

  1. mysql_real_escape_string($str)
  2. mysql_real_escape_string(addcslashes($str, "%_"))
  3. htmlspecialchars($str)
  4. json_encode() - только для utf8! Я использую свою функцию для ISO-8859-2
  5. mysql_real_escape_string(addcslashes($str, '^.[]$()|*+?{}')) - вы не можете использовать preg_quote в этом случае, потому что обратный слеш будет экранирован два раза!
  6. preg_quote()
0 голосов
/ 06 сентября 2011

Поскольку вы можете использовать инструменты для манипулирования отправленными данными $ _POST, да, это опасно.

Либо вы избегаете его, либо используете объекты данных php (PDO) , которые не требуют ЛЮБОГО экранирования и которые вам следует использовать в любом случае в это время.

0 голосов
/ 06 сентября 2011

Каждый раз, когда вы принимаете пользовательский ввод и вводите запрос, вы должны передать его через mysql_real_escape_string.Береженого Бог бережет.

0 голосов
/ 06 сентября 2011

Да. Вы можете использовать это:

$searchData = addslashes( $_POST['searchData'] );
0 голосов
/ 06 сентября 2011

Если $searchData никуда не сбежать, тогда да, он уязвим.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...