Я собирался запрограммировать класс, который проверяет данные из браузеров, и один из этих методов проверяет длину строк, тогда мне пришло в голову что-то: что если кто-то отправит очень большую строку с 2 миллионами символов или более (или что-то еще)?
Если я использую strlen () для подсчета байтов, он будет считаться до последних байтов.
Было бы бесполезно считать все эти байты.
Подумав немного, я сделал что-то вроде этого:
Class Validator
{
static public function verify_str_length($str, $min, $max)
{
$i;
$counter = $min;
$msg = "";
// looling until null char is found
//
for($i=$min-1;$i<$max;$i++) {
if(!isset($str[$i])) {
if($i == ($min -1)) {
// if first iteration
// we find the null char so early.
// $i starts with the minimum length allowed, the string
// length is lower than that so it is too short
$msg = 'Too short string';
return -1;
}
return 0;
}
}
if(isset($str[$i])) {
// if we reach the max and keep without finding the null char so
// the string length is higher than $max
$msg = 'Too long string';
return 1;
}
return 0;
}
//
/* Others Methods
..... */
}
Обратите внимание, что мне не нужно количество символов в строке, только если оно больше, чем $ min, и меньше, чем $ max. Я откажусь от всех других символов.
Мой вопрос: было бы хорошей идеей сделать это вместо использования strlen ()?
Есть ли другой способ сделать это, например, настроить APACHE, чтобы остановить выполнение, если сервер обрабатывает запрос более X секунд?
Или я могу использовать оба варианта?
Заранее спасибо!
Вы можете использовать PHP post_max_size директива об ограничении количества представленного контента. Будьте осторожны с этим параметром, потому что если у вас есть загружаемые файлы, они также должны соответствовать этому размеру.
http://php.net/manual/en/ini.core.php#ini.post-max-size
Чтобы ограничить время, затрачиваемое на анализ входных данных, вы можете использовать max_input_time.
http://php.net/manual/en/info.configuration.php#ini.max-input-time
Чтобы ограничить время выполнения, используйте max_execution_time.
http://php.net/manual/en/info.configuration.php#ini.max-execution-time
Вы можете установить их в .htaccess, например так:
php_value post_max_size 1M
php_value max_execution_time 30
php_value max_input_time 5
Для проверки вы должны использовать PHP фильтр функции, например:
$content = filter_input( INPUT_POST, 'content', FILTER_VALIDATE_REGEXP, [ 'options' => ['regexp' => '/^[\w-]{1,64}$/']] );
Это гарантирует, что если $ _POST [‘content’] не состоит из букв, цифр, подчеркиваний или дефисов и не имеет длины от 1 до 64 символов, он не будет принят.
Других решений пока нет …