PHP: Что эффективнее для очистки переменной $ _get? - PullRequest
0 голосов
/ 03 августа 2011

Ожидается, что строка $ title будет состоять только из строчных букв или цифр или символа "-".

В этой ситуации какой из следующих методов является эффективной защитой от уязвимости безопасности?

$title=$_GET["title"];
$title = strtolower(preg_replace("/[^a-z0-9\-]+/i", "-", $title));
< mysql query using $title goes here >

OR

$title=$_GET["title"];
$title = mysql_real_escape_string($title);
< mysql query using $title goes here >

Ответы [ 5 ]

2 голосов
/ 03 августа 2011

Вы должны сделать и то, и другое.

$title = strtolower(preg_replace("/[^a-z0-9\-]+/i", "-", $title));
And then $title = mysql_real_escape_string($title);

Всегда полезно избегать значений MySQL, в этом случае не стоит его избегать, но если в будущем изменится правило для заголовка, и выможно поставить любой символ, может быть, вы не помните, чтобы изменить его

0 голосов
/ 03 августа 2011

Вы не дезинфицируете ввод!

Вы проверяете ввод (т.е. принимаете или отклоняете его) и дезинфицируете вывод (т.е. изменяете его представление), используя метод, соответствующий месту назначения данных.

Таким образом:

if (preg_match("/^[a-z0-9\-]+$/i", $_GET['title'])) {
   $my_title=mysql_real_escape_string(strtolower($_GET['title']));
   $sql=....'$my_title'....
} else {
   print "Invalid value for title";
   exit;
}
0 голосов
/ 03 августа 2011

Сочетание обоих.Вы должны помнить, что ваше регулярное выражение не может быть обширным.

0 голосов
/ 03 августа 2011

Я бы использовал mysql_real_escape_string, это устранит большинство проблем с инъекцией mysql. Если заголовок не существует (например, потому что кто-то пытается выполнить MySQL-инъекцию), тогда строки не будут найдены, и, таким образом, вы увидите ошибку 404

0 голосов
/ 03 августа 2011

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

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

Кроме того, никогда не полагайтесь на ввод данных пользователями.

...