Является ли использование for-loop для предоставленных данных POST в PHP безопасным?
Я всегда беспокоюсь о безопасности в своих PHP-приложениях, и я просто (потенциально) думал о том, как хакер может убить мой script. В настоящее время мое приложение принимает данные формы и отправляет его в виде массива в PHP скрипт через AJAX, а затем перебирает этот массив.
foreach($_POST['form_data'] as $field => $value){
//Do something here.
}
Однако, что, если хакер должен был подделать запрос AJAX и повторно отправить массив 'form_data' с 100000000000 случайными элементами? Цикл должен будет проходить через каждый элемент, возможно, вызвав DoS (или, по крайней мере, медленный сервис), правильно?
Я здесь не совсем образован, поэтому у меня могут быть некоторые неправильные предположения. Спасибо за любой вклад!
Ответы
Ответ 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.