Как зациклить массив $ _GET и экранировать все его переменные? - PullRequest
1 голос
/ 05 сентября 2010

Как сделать mysql реальной escape-строкой все содержимое $ _GET?

Спасибо

Ответы [ 5 ]

6 голосов
/ 05 сентября 2010

Вы не должны этого делать.

Вместо этого используйте PDO и подготовленные запросы , чтобы вставлять, манипулировать и запрашивать ваши данные, что обходит необходимостьизбегать вещей.Это освобождает вас от беспокойства о том, правильно ли вы сбежали (или, может быть, вы вообще что-то забыли, упс!)

3 голосов
/ 05 сентября 2010
<?php
array_walk($_GET, 'mysql_real_escape_string');
?>

вы можете, например, использовать ту же технику для обрезки () его содержимого

array_walk для более подробной информации

2 голосов
/ 05 сентября 2010

Суперглобальный $ _GET - это массив, поэтому вы можете перебирать его, как и любой другой ... но в целях безопасности вам действительно не следует.Каждый параметр массива, вероятно, должен быть отфильтрован / очищен / экранирован по-разному в другом контексте.

Например, если вы обрабатываете запись в блоге, у вас, скорее всего, есть заголовок, тело, публикацияна дату и автора:

  • В заголовке, вероятно, не должно быть любых HTML-тегов.
  • В теле могут быть разрешены некоторые теги, но очень ограниченный набор.
  • Дата, скорее всего, представляет собой целое число (отметка времени) или определенный формат даты или последовательность чисел из раскрывающихся списков.
  • Автором может быть строка (имя пользователя) или, предпочтительно, author_id.Если это идентификатор, он должен быть целым и не нуждается в экранировании.

Если вы фильтруете их одинаково, вам не хватает контекста и цели каждого из них.

0 голосов
/ 05 сентября 2010

Лучше использовать параметризованные запросы, но если приложение уже написано, дорого возвращаться и переписывать каждый запрос. Это экономически выгодное исправление, и оно будет работать в большинстве случаев, просто проверьте свой код с помощью Wapiti (с открытым исходным кодом), Acunetix ($) или NTOSpider ($$$).

Помните, что вы можете передавать массивы через GET. ? Вар [1] = тест ;.

function escape_deep($value) 
{ 
    $value = is_array($value) ? 
                array_map('escape_deep', $value) : 
                mysql_real_escape_string($value); 

    return $value; 
} 
function stripslashes_deep($value) 
{ 
    $value = is_array($value) ? 
                array_map('stripslashes_deep', $value) : 
                stripslashes($value); 

    return $value; 
} 
if(!get_magic_quotes_gpc()){
   $_GET=escape_deep($_GET);
}else{
   $_GET=stripslashes_deep($_GET);
   $_GET=escape_deep($_GET);
}

Если magic_quotes_gpc включен, вы не хотите добавлять косые черты дважды. Также имейте в виду, что magic_quotes и этот метод побега не останавливает все. Например, этот запрос все еще уязвим:

mysql_query("select name from usesr where id=".$_GET[id]);

эксплуатируют:

http://localhost/vuln.php?id=1 and sleep(500)

патч:

mysql_query("select name from usesr where id='$_GET[id]'");

0 голосов
/ 05 сентября 2010

Примерно так:

foreach ($_GET as $key => $val)
{
   $_GET[$key] = mysql_real_escape_string($val);
}

Но я согласен с Пеккой, это не очень хорошая идея.

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