mysql_real_escape_string () для всего массива $ _REQUEST, или вам нужно перебрать его? - PullRequest
2 голосов
/ 19 ноября 2010

Существует ли более простой способ безопасного извлечения представленных переменных, кроме следующих?

if(isset($_REQUEST['kkld'])) $kkld=mysql_real_escape_string($_REQUEST['kkld']);
if(isset($_REQUEST['info'])) $info=mysql_real_escape_string($_REQUEST['info']);
if(isset($_REQUEST['freq'])) $freq=mysql_real_escape_string($_REQUEST['freq']);

(И: вы бы использовали isset() в этом контексте?)

Ответы [ 6 ]

28 голосов
/ 19 ноября 2010

Чтобы экранировать все переменные за один раз:

$escapedGet = array_map('mysql_real_escape_string', $_GET);

К извлечение всех переменных в текущее пространство имен (т.е. $foo = $_GET['foo']):

extract($escapedGet);

Пожалуйста, не делайте этот последний шаг, хотя. Там нет необходимости, просто оставить значения в массиве. Извлечение переменных может привести к конфликтам имен и перезаписи существующих переменных, что является не только хлопотами и источником ошибок, но и угрозой безопасности. Также, как говорит @BoltClock, придерживайтесь $_GET или $_POST. Кроме того, как указывает @zerkms2, нет смысла в mysql_real_escaping переменных, которые не должны использоваться в запросе к базе данных, это может даже привести к дальнейшим проблемам.


Обратите внимание, что на самом деле нет это вообще особенно хорошая идея, вы просто перевоплощаете magic_quotes и global_vars, которые были ужасными практиками PHP из прошлых времен. Используйте подготовленные операторы со связанными параметрами через mysqli или PDO и используйте значения через $_GET или filter_input. См http://www.phptherightway.com.

2 голосов
/ 19 ноября 2010

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

function sanitate($array) {
   foreach($array as $key=>$value) {
      if(is_array($value)) { sanitate($value); }
      else { $array[$key] = mysql_real_escape_string($value); }
   }
   return $array;
}
sanitate($_POST);
0 голосов
/ 25 апреля 2019

Если вы используете расширение mysqli и хотите экранировать все переменные GET:

$escaped_get = array_map(array($mysqli, 'real_escape_string'), $_GET);
0 голосов
/ 13 февраля 2015

Насколько мне известно, Starx ', и ответ Райана от 19 ноября 2010 г. - лучшее решение, поскольку мне это тоже просто нужно.

Если у вас есть несколько полей ввода с одним именем (например, names []), то есть они будут сохранены в массиве внутри $ _POST-array, вы должны использовать рекурсивную функцию, поскольку mysql_real_escape_string не работает для массивов.

Так что это единственное решение, позволяющее избежать такой переменной $ _POST.

function sanitate($array) {
    foreach($array as $key=>$value) {
        if(is_array($value)) { sanitate($value); }
            else { $array[$key] = mysql_real_escape_string($value); }
   }
   return $array;
}
sanitate($_POST);
0 голосов
/ 19 ноября 2010

В качестве альтернативы я могу посоветовать вам использовать PHP7 входные фильтры , что обеспечивает ярлык для выхода из sql.Я бы не рекомендовал это как таковое, но это избавляет от создания локализованных переменных:

 $_REQUEST->sql['kkld']

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

 mysql_query("SELECT x FROM y WHERE z = '{$_REQUEST->sql['kkld']}'");

Это синтаксически сомнительно, но позволяет вам экранировать только те переменные, которые действительно в этом нуждаются.Или, чтобы подражать тому, что вы просили, используйте $_REQUEST->sql->always();

0 голосов
/ 19 ноября 2010

Для очистки или проверки любых INPUT_GET, INPUT_POST, INPUT_COOKIE, INPUT_SERVER или INPUT_ENV, вы можете использовать

  • filter_input_array - получает внешние переменные и дополнительно фильтрует их

Фильтрация может быть выполнена с помощью обратного вызова, поэтому вы можете указать mysql_real_escape_string.

Этот метод не позволяет фильтровать для $_REQUEST, поскольку вам не следует работать с $_REQUEST, когда данные доступны в любом из других суперглобальных объектов. Это потенциально небезопасно.

Метод также требует от вас именования клавиш ввода, так что это не универсальная пакетная фильтрация. Если вы хотите универсальную пакетную фильтрацию, используйте array_map или array_walk или array_filter, как показано в другом месте на этой странице.

Кроме того, почему вы используете старое расширение mysql вместо расширения mysqli (i для улучшенного). Расширение mysqli предоставит вам поддержку транзакций , мультизапросов и подготовленных операторов (что устраняет необходимость в экранировании). Все функции, которые могут сделать ваш код БД намного более надежный и безопасный.

...