Сбой функции CodeIgniter XSS Clean с пустыми значениями строки запроса — Reg ex issue

Имейте устаревшее приложение, построенное на CodeIgniter, и столкнулся с этой проблемой.

Когда закодированный URL с пустым параметром строки запроса передается в функцию CI xss_clean, он вставляет точку с запятой, где находятся пустые значения.

Так a=&b=1 становится a=;&b=1

Я отследил это до этой внутренней функции CI reg ex, я могу видеть, где она это делает, но я не достаточно хорош в reg ex, чтобы разобраться. Кто-нибудь имел это и уже решил?

Функция ниже ….

protected function _validate_entities($str)
{
/*
* Protect GET variables in URLs
*/

// 901119URL5918AMP18930PROTECT8198

$str = preg_replace('|\&([a-z\_0-9\-]+)\=([a-z\_0-9\-]+)|i', $this->xss_hash()."\\1=\\2", $str);

/*
* Validate standard character entities
*
* Add a semicolon if missing.  We do this to enable
* the conversion of entities to ASCII later.
*
*/
$str = preg_replace('#(&\#?[0-9a-z]{2,})([\x00-\x20])*;?#i', "\\1;\\2", $str);

/*
* Validate UTF16 two byte encoding (x00)
*
* Just as above, adds a semicolon if missing.
*
*/
$str = preg_replace('#(&\#x?)([0-9A-F]+);?#i',"\\1\\2;",$str);

/*
* Un-Protect GET variables in URLs
*/
$str = str_replace($this->xss_hash(), '&', $str);

return $str;
}

0

Решение

Incase у кого-то еще есть это …

Первый регистр ex, при поиске параметров запроса, ожидает ключ = значение — совпадение составляет один или несколько символов для значения. Если вы измените это значение на 0 или более, то оно будет правильно поддерживать пустые значения …

Измените + на * в конце второй подходящей группы (часть значения)

так

$str = preg_replace('|\&([a-z\_0-9\-]+)\=([a-z\_0-9\-]+)|i', $this->xss_hash()."\\1=\\2", $str);

становится

$str = preg_replace('|\&([a-z\_0-9\-]+)\=([a-z\_0-9\-]*)|i', $this->xss_hash()."\\1=\\2", $str);
0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]