Символ процента в URI CodeIgniter

Мне нужно передать закодированную строку контроллеру CodeIgniter.

Пример:

DOSOMETHING/Coldplay/Fix+You/273/X+%26+Y/

Моя проблема - символ процента, который является запрещенным символом. Я попытался изменить файл конфигурации следующим образом:

$config['permitted_uri_chars'] = 'a-z 0-9~%.:_\-\+\%';

+ в порядке, но % недействителен. Можете ли вы помочь мне изменить этот reg exp, чтобы он позволял использовать символ %? Заранее спасибо!


person RaduM    schedule 20.06.2009    source источник


Ответы (2)


Поместите «-» в конец строки, иначе она будет интерпретирована как диапазон. Как видите, % уже находится в списке разрешенных символов.

$config['permitted_uri_chars'] = 'a-z 0-9~%.:_+-';

Кхм... еще раз взглянув на строку образца. Вот почему вы получаете "The URI you submitted has disallowed characters".

Краткое объяснение: добавьте амперсанд & в список разрешенных символов.

$config['permitted_uri_chars'] = 'a-z 0-9~%.:_+&-';

Длинное объяснение

Есть 2 вещи, играющие вместе.

A) CodeIgniter проверяет все сегменты URI на наличие запрещенных символов. Это происходит путем внесения разрешенных символов в белый список. Какие из них разрешены, можно проверить в /system/application/config/config.php в переменной $config['permitted_uri_chars']. По умолчанию установлено что-то вроде 'a-z 0-9~%.:_-'. Таким образом, разрешены все буквы от a до z, пробел, все цифры и следующие символы *~%.:_-.

Хорошо, давайте сравним это с вашим образцом URI, который, как вы говорите, работает.

a-z 0-9~%.:_-
DO_SOMETHING/Coldplay/Fix+You/273/X+26+Y/   //note the missing %

Все символы в порядке... но подождите, как насчет знака плюс +? Его нет в списке разрешенных персонажей! И все же на URI не жалуются? Это ключ к вашей проблеме.

B) CodeIgniter декодирует сегменты URI перед проверкой символов белого списка для предотвратить, чтобы кто-то обошел проверку, просто urlencoding URI. Таким образом, + декодируется в пробел. Такое поведение связано с urlencode (который кодирует пробелы как знак +, отличающийся от RFC 1738). Это объясняет, почему разрешен знак +.

Сочетание этих двух вещей также объясняет, почему этот конкретный URI не работает.

urldecode(DO_SOMETHING/Coldplay/Fix+You/273/X+%26+Y/) //evaluates to
//DO_SOMETHING/Coldplay/Fix You/273/X & Y/

Упс... URL-декодирование переводит %26 в &

Это недопустимый символ. Тайна ;-) решена

person jitter    schedule 20.06.2009
comment
Спасибо за ввод, но это не решает мою проблему :( Я все еще получаю, что отправленный вами URI содержит запрещенные символы. Я изменил строку, как вы предложили, и она работает нормально, но когда я ввожу% в URL-адресе, он ломается. Пример Я пытаюсь сделать то же самое: DO_SOMETHING/Coldplay/Fix+You/273/X+%26+Y/ Если я удалю %, работает отлично... - person RaduM; 21.06.2009
comment
Расширенный ответ. Пропустили проблему, связанную с вашим URI в первый раз - person jitter; 21.06.2009
comment
:) Черт возьми, URLDECODE, я просмотрел код в URI.php, но xss clean выполняет свою работу, поэтому я его пропустил. Спасибо теперь все идеально. - person RaduM; 21.06.2009
comment
дрожание, это отличный ответ. Хорошая проработка и исследование, спасибо, что уделили этому время. - person Alex Mcp; 06.10.2009

попробуйте это: $config['uri_protocol'] = "PATH_INFO";

person Community    schedule 20.06.2009