Подтвердить что ты не робот

Является ли использование for-loop для предоставленных данных POST в PHP безопасным?

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

foreach($_POST['form_data'] as $field => $value){
   //Do something here.
}

Однако, что, если хакер должен был подделать запрос AJAX и повторно отправить массив 'form_data' с 100000000000 случайными элементами? Цикл должен будет проходить через каждый элемент, возможно, вызвав DoS (или, по крайней мере, медленный сервис), правильно?

Я здесь не совсем образован, поэтому у меня могут быть некоторые неправильные предположения. Спасибо за любой вклад!

4b9b3361

Ответ 1

Это не будет проблемой: PHP ограничивает максимальное количество POST-варов, используя директиву max_input_vars, по умолчанию 1000 переменных.

Этот предел фактически применяется для предотвращения гораздо более серьезного типа атаки DOS, чем тот, о котором вы думаете (на самом деле, итерация нескольких тысяч элементов массива ни к чему), а именно атаки на основе хеш-таблицы, основанные на столкновении (часто называемые HashDOS). Для получения дополнительной информации об этой проблеме см. Мою статью Supercolliding массив PHP.

Ответ 2

Цикл должен будет проходить через каждый элемент, возможно, вызвав DoS (или, по крайней мере, медленный сервис), исправить?

Это правда (хотя ограничение размера POST для веб-сервера и предел памяти script, вероятно, остановит ситуацию задолго до 100000000000 элементов).

Также, как указывает @duskwulf, PHP >= 5.3.9 имеет переменную max_input_vars, которая по умолчанию установлена ​​в 1000.

Вы все равно можете сделать проверку размера, чтобы быть в безопасности.

Ответ 3

Обычно я использую array_key_exists() для такого рода вещей.

Если вы хотите сохранить текущий цикл, попробуйте следующее:

$allowed = array('name', 'address', 'phone', 'etc');
foreach($_POST['form_data'] as $field => $value)
{
  if(array_key_exists($field, $allowed))
    {
     //do something here
    }
}

или посмотрите на что-то вроде этого:

$vals = array_intersect($allowed, $_POST)

Ответ 4

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

Я предлагаю вам обрезать ваше приложение только тем, что принято. Теперь вы делаете все значения из form_data.

Вместо этого вы должны знать , какие значения ожидать. Может быть что-то вроде name, address, phone и только перебирать такие известные значения.

Таким образом, проблема, которая может возникнуть, будет уменьшена, но не будет полностью заблокирована. С дополнительной проверкой размера, как предложил Пекка, вы еще больше урезаете риск.

Ответ 5

Только последняя версия (5.3.10) несет ответственность за использование и поддерживает max_input_vars по умолчанию. Но есть хорошее расширение - Suhosin, который обеспечивает защиту от такого рода атак, как и многих других для более ранних версий PHP.