Вопрос по php, regex – Символ процента в CodeIgniter URI

4

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

Example:

<code>DOSOMETHING/Coldplay/Fix+You/273/X+%26+Y/
</code>

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

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

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

Ваш Ответ

1   ответ
25

-& Quot; в конце строки в противном случае он интерпретируется как диапазон. % Уже есть в списке разрешенных символов, как вы можете видеть.

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

Гм ... после того, как вы снова посмотрите на образец строки. Вот почему вы получаете & quot;The URI you submitted has disallowed characters& Quot ;.

Short explanation: Добавить амперсанд& в список разрешенных символов

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

Long explanation

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

A) CodeIgniter проверяет все URIsegments для запрещенных персонажей. Это происходит путем внесения в белый список разрешенных символов. Какие из них разрешены, можно проверить в /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) CodeIgniterurldecodes URI сегментируется перед проверкой белого списка символов, чтобы не допустить, чтобы кто-то обошел проверку, просто кодировав 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/

К сожалению ... urldecoding переводит%26 для&

Который не является допустимым персонажем. Mistery ;-) решено

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

Похожие вопросы