MySQL_REAL_ESCAPE_STRING () Для цельного массива $ _Request или надо лосить через него?

StackOverflow https://stackoverflow.com/questions/4223028

Вопрос

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

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() в данном контексте?)

Это было полезно?

Решение

Чтобы избежать всех переменных в одном Go:

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

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

extract($escapedGet);

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


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

Другие советы

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

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);

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

Когда у вас есть несколько полей ввода с одним именем (например, именами []), то есть они будут сохранены в массиве в массиве $ _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);

Дезинфицировать или проверять любой 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 даст вам поддержку для транзакции, Multiqueries. а также Подготовленные заявления (что исключает необходимость для выхода) Все функции, которые могут сделать код БД гораздо более надежным и безопасным.

Если вы используете Mysqli. Расширение, и вы любите избежать всех переменных:

$escaped_get = array_map(array($mysqli, 'real_escape_string'), $_GET);

Как альтернатива, я могу посоветовать вам использовать PHP7 входные фильтры, который обеспечивает ярлык к SQL Seaking. Я бы не рекомендовал это как SE, но он запчащает создание локализованных переменных:

 $_REQUEST->sql['kkld']

Которые могут быть использованы встроенные в строки SQL Query, и дать дополнительное предупреждение, если вы забудете это:

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top