шифрование сегментов uri в Codeigniter

Я хочу зашифровать свои сегменты uri, которые передаются как идентификаторы для запросов к таблицам базы данных.

Например, я использую

$id=urlencode($this->encrypt->encode($user['id']));

который декодируется на другом контроллере с помощью

$id_decrypt=$this->encrypt->decode(urldecode($id));

Я проверил шифрование и расшифровку, и, похоже, это работает. Однако при попытке URL-адресов, например.

http://localhost/app_name/index.php/profile/view_profile/b98N98YNqoEA7yI1tavIY1s51RhiSHKGCFarU4A6XgFUMB%2BI3KwiEA23h1XITmkq1qPABqGs8e1sdP16v4og8g%3D%3D

на некоторых URL-адресах он будет работать, как и ожидалось, но на некоторых выдаст ошибку браузера 404 (объект не найден). При удалении зашифрованного сегмента я могу получить доступ к функции индекса. Что может быть возможной причиной этого?


person serengeti12    schedule 31.05.2011    source источник


Ответы (2)


В файле ./application/config/config.php есть раздел для разрешенных символов uri. Символы по умолчанию:

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

В некоторых проектах я также изменил это:

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

Однако, как заявляют инженеры CodeIgniter

НЕ ИЗМЕНЯЙТЕ ЭТО, ЕСЛИ ВЫ ПОЛНОСТЬЮ НЕ ПОНИМАЕТЕ ПОСЛЕДСТВИЯ!!

person erj1    schedule 31.05.2011

Я думаю, что проблема у вас связана со знаком +. %2B превращается в + при декодировании. Маршрутизатор URL для CI работает с декодированным URL-адресом.

+ — это специальный символ в URL-адресах, используемый для обозначения пробелов. Это может привести к отключению URL-маршрутизатора.


Обновлять:

На самом деле это может быть связано со сценарием защиты XSS в CI. Существует список допустимых символов URL, по которым он проверяет входные данные. Шифрование, которое вы используете, действительно добавляет много забавных символов в ваш ввод. (%3D есть =). Это (включая +), вероятно, то, что спотыкается.

Чтобы исправить это:

  • Вы можете использовать другой алгоритм шифрования. Тот, который вы знаете, не добавит фанковых персонажей.
  • Вы можете кодировать Base64 свой результат. Base64 не должен возвращать ничего, кроме буквенно-цифровых символов (если я правильно помню). Но учтите, что это может сделать результат больше по длине.
  • (НЕ РЕКОМЕНДУЕТСЯ) вы можете изменить «разрешенные символы» в разделе фильтрации xss вашей конфигурации CI.
person Aren    schedule 31.05.2011
comment
это похоже на правду, большинство URL-адресов, которые не работают, содержат этот %2B. У вас есть идеи, как я могу его удалить. И есть ли какие-либо другие символы, о которых я должен беспокоиться, кроме +? потому что некоторые URL-адреса не имеют %2B, но они не работают. - person serengeti12; 01.06.2011
comment
Теперь я понял, что проблемы вызывает %2F, который равен '/'. Использование Base64encode удаляет другие символы, но поставляется с =, который, по-видимому, также имеет некоторые проблемы с маршрутизатором. - person serengeti12; 01.06.2011