ошибка в коде запрещенных символов - PullRequest
2 голосов
/ 04 ноября 2010

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

Ответы [ 4 ]

3 голосов
/ 04 ноября 2010

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

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

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

1 голос
/ 19 августа 2011

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

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

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

1 голос
/ 05 ноября 2010

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

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

Однако его довольно просто использовать, и он построен на PHP4 и PHP5.

1 голос
/ 04 ноября 2010

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

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

Leave blank to allow all characters -- but only if you are insane.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...