шифрование URI-сегментов в Codeigniter - PullRequest
2 голосов
/ 31 мая 2011

Я хочу зашифровать мои сегменты 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 (объект не найден). После удаления зашифрованного сегмента я могу получить доступ к функции индекса. Что может быть причиной этого?

Ответы [ 2 ]

4 голосов
/ 01 июня 2011

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

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

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

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

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

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

2 голосов
/ 31 мая 2011

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

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


Обновление:

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

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

  • Вы можете использовать другой алгоритм шифрования. Тот, который, как вы знаете, не добавит забавных персонажей.
  • Вы можете кодировать Base64 свой результат. Base64 не должен возвращать что-либо, кроме буквенно-цифровых символов (, если я правильно помню ). Но обратите внимание, что это может сделать результат больше в длину.
  • ( НЕ РЕКОМЕНДУЕТСЯ ) вы можете редактировать «разрешенные символы» в разделе фильтрации xss вашей конфигурации CI.
...