Да, это уязвимо. Но другие респонденты не заметили, что наряду с обычным экранированием (например, mysql_real_escape_string()
) вам также необходимо экранировать символ% для предложения LIKE!
mysql_real_escape_string(addcslashes($str, "%_"))
Хитрость, которую нужно понять, заключается в том, что нет ничего подобного "универсальному цитированию" .
При цитировании вы всегда цитируете текст для определенного вывода , например:
- строковое значение для запроса MySQL
like
выражение для запроса MySQL
- HTML-код
- * 1023 JSON *
- регулярное выражение mysql
- php регулярное выражение
Для каждого случая вам нужны разные кавычки, потому что каждое использование присутствует в различном синтаксическом контексте. Это также подразумевает, что цитирование должно производиться не при вводе в PHP, а при конкретном выводе ! Именно поэтому такие функции, как magic_quotes_gpc
, не работают ( никогда не забывайте обращаться с ним, или, что еще лучше, убедитесь, что он выключен !!! ).
Итак, какие методы можно использовать для цитирования в этих конкретных случаях? (Не стесняйтесь поправлять меня, могут быть более современные методы, но они работают для меня)
mysql_real_escape_string($str)
mysql_real_escape_string(addcslashes($str, "%_"))
htmlspecialchars($str)
json_encode()
- только для utf8! Я использую свою функцию для ISO-8859-2
mysql_real_escape_string(addcslashes($str, '^.[]$()|*+?{}'))
- вы не можете использовать preg_quote в этом случае, потому что обратный слеш будет экранирован два раза!
preg_quote()