Недопустимые символы

если я пытаюсь получить доступ к этому URL- адресу http: //localhost/common/news/33/+%E0%B0%95%E0%B1%87%E0%B0%B8.html , он показывает, что ошибка была обнаружена, Представленный вами URI имеет запрещенные символы. Я установил $ config ['allowed_uri_chars'] = 'az 0-9 ~%.: ?? _ = + -?' ; ..// Что я делаю ?

Да, если вы хотите разрешить байты без ASCII, вам придется добавить их в permitted_uri_chars . Эта функция работает с URL-декодированными строками (обычно, если в среде нет чего-то необычного), поэтому вам нужно указать дословные байты в строке, а не только % и шестнадцатеричные цифры. (Да, я сказал байты: _filter_uri не использует регулярное выражение Unicode, поэтому вы не можете использовать диапазон Unicode.)

Попытка фильтровать входящие значения (вместо кодирования исходящих) – это смехотворная основная ошибка, которая удручает найти в популярной структуре. Вы можете отключить эту ошибочную функцию, установив permitted_uri_chars в пустую строку, или, может быть, вам понадобится диапазон всех байтов, кроме управляющих кодов ( "\x20-\xFF" ). К сожалению, функция _filter_uri прежнему делает сумасшедшие, сумасшедшие, сломанные вещи с некоторым входом, HTML-кодирование некоторой пунктуации на пути к какой-то неизвестной причудливой причине. И вы не можете отключить это.

Это, наряду со сломанным «анти-XSS» mangler, заставляет меня поверить, что команда CodeIgniter имеет довольно плохое представление о том, как проблемы с экранированием строк и проблемы безопасности действительно работают. Я бы не стал верить в то, что они говорят о безопасности.

Что делать? Прекратите использование символов Юникода в URL-адресе – по тем же причинам, что и имена файлов в файловой системе с символами Unicode.

Но, если вам это действительно нужно, я скопирую / вставлю некоторые строки из конфига:

 Leave blank to allow all characters -- but only if you are insane. 

Я бы не предложил попробовать их декодировать или использовать любые другие трюки, вместо этого я бы предложил использовать функции urlencode () и urldecode () .

Поскольку у меня нет копии вашего кода, я не могу добавить примеры, если вы могли бы предоставить мне некоторые, я могу показать вам пример, как это сделать.

Тем не менее, это довольно просто использовать, и он построен на PHP4 и PHP5.

У меня была аналогичная проблема, и я хотел поделиться этим решением. Это был пароль сброса, и мне пришлось отправить имя пользователя и время, так как URL будет активен только час. Codeigniter не принимает определенных символов в URL-адресе по соображениям безопасности, и я не хотел его изменять. Итак, вот что я сделал:

  • concat имя пользователя, '__' и time () в var $ str
  • шифровать $ str, используя MCRYPT_BLOWFISH, это может содержать '/', '+'
  • повторно зашифровать с помощью str2hex (получить его отсюда )
  • поместите закодированную строку в качестве третьего аргумента в ссылку, отправленную по электронной почте, например http://xyz.com/users/resetpassword/3123213213ABCDEF238746238469898. Вы можете видеть, что URL-адрес содержит только 0-9 и AZ.
  • Когда кликают по ссылке из электронной почты, получите третий сегмент uri, используйте hex2str () для дешифрования зашифрованной строки blowfish, а затем примените blowfish decrypt, чтобы получить исходную строку.
  • split с '__', чтобы получить имя пользователя и время

Я знаю, что его почти год до того, как этот вопрос был задан, но я надеюсь, что кто-то найдет это решение полезным после приезда сюда Google.