PHP - Может ли автоматическая обработка каждой переменной $ _POST быть проблемой безопасности? - PullRequest
2 голосов
/ 04 января 2012

Сценарий : Мой PHP-скрипт требует 10 POST строк для работы.Значение всех из них должно быть экранировано с помощью htmlspecialchars().Итак, первые строки скрипта выглядят так:

$var1 = htmlspecialchars($_POST['var1']);
$var2 = htmlspecialchars($_POST['var2']);
// And more. You get the point.

Это код, который может упростить его:

foreach($_POST as $key => $value){
    $$key = htmlspecialchars($_POST[$value]);
}

Я не уверен насчет $$ с пользовательским вводом,Я предполагаю, что кто-то может отправить много POST-запросов, которые мне не нужны, и заблокировать сервер этим.Это реалистично?

Код foreach был бы в самом верху моего сценария.Поэтому он не сможет перезаписать другие переменные.

Ответы [ 3 ]

5 голосов
/ 04 января 2012

Вместо того, чтобы просто слепо обрабатывать все в $_POST (хотя просто передавать их через htmlspecialchars() довольно безопасно), вы можете использовать белый список допустимых ключей:

// An array of $_POST keys that are acceptable
$whitelist = array('var1','var2','var3');

foreach($_POST as $key => $value) {
   // Only handle $_POST keys you expect to receive...
   if (in_array($key, $whitelist)) {
      $$key = htmlspecialchars($_POST[$value]);
    }
}

Это исключает возможность того, что злонамеренный пользователь отправит сотни значений в POST и потребит дополнительные системные ресурсы.

Обновление

Комментаторы верны. Лучше перебирать белый список, чем $_POST:

// Iterate over $whitelist and check for corresponding keys in $_POST
$missing_keys = array();
foreach($whitelist as $key) {
   if (isset($_POST[$key])) {
     $$key = htmlspecialchars($_POST[$key]);
   }
   else $missing_keys[] = $key;
}
echo "Missing keys: " . implode(",", $missing_keys);
1 голос
/ 04 января 2012

Не беспокойтесь, что они отправят множество переменных _POST и «заблокируют сервер» ... Это ограничено настройкой ini файла post_max_size, и, кроме того, переменные _POST уже загружены в память, поэтомув худшем случае вы просто (примерно) удвоите использование скриптом памяти.Если вы абсолютно уверены, что не будете перезаписывать существующие переменные из-за размещения кода И если вы уверены, что никогда не будете запускать какой-либо код, который зависит от триггера isset (), то вы должны быть в безопасности.Тем не менее, белый список ваших ключей всегда хорошая идея.

0 голосов
/ 17 января 2017

Улучшение принятого ответа Михаила Берковски:

Вместо этого используйте in_array () с массивом белого списка.

function sanitize($data) {

  // fields to sanitize
  $whitelist = array('title', 'category', 'tags', 'hovertext', 'content');

  // loop over our data array
  foreach ($data as $key => $val) { // loop over our data array

    // if the current key is in our whitelist...
    if (in_array($key, $whitelist)) {

      // sanitize the value
      $cleanVal = htmlspecialchars($val);

      // replace the value in our data array
      $data[$key] = $cleanVal;

    }
  }

  // return our clean data array
  return $data;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...