Если вы хотите включить только арабские символы, вы можете включать диапазоны Юникода в regedxp premitted_uri_chars. Использование
this wikipedia site мы можем попытаться построить регулярное выражение:
a-z 0-9~%.:_\- \x0600-\x06FF
К сожалению, в нашем случае CodeIgniter не использует u
модификатор (используется для Unicode) в preg_match
. Таким образом, для того, чтобы это работало, вам нужно будет модифицировать Исходный код system/core/URI.php, line 257 линию, и изменить его на:
if (! preg_match("|^[".str_replace(array('\\-', '\-'), '-', preg_quote($this->config->item('permitted_uri_chars'), '-'))."]+$|iu", $str))
В коде выше я добавил только модификатор u
к preg_match
. В качестве альтернативы вы можете расширить класс URI
, как описано в documentation, что является лучшим выбором.
(я не проверял это)
Чтобы ответить на вопрос, почему это плохо, чтобы все символы: Я могу думать только о проблемах SQL инъекций или other kinds of injections.
Edit: например, если вы используете URL index.php/main/get_pdf?filename=awesome.pdf
для загрузки PDF-файлов из ./pdf/awesome.pdf
, если не лечить (т.е. Validate) ваш вход правильно злонамеренный пользователь может сделать что-то вроде этого: index.php/main/get_pdf?filename=../secure_files/nuclear_launch_codes.pdf
;).
Редактировать 2: Ну, пример выше - пример плохого использования permitted_uri_chars
, потому что AFAIK CodeIgniter допускает такие переменные URL-адреса, поэтому вам нужно проверить этот материал самостоятельно. Я проверю все это, когда вернусь домой.
Edit3: Я исправил регулярное выражение, но кажется, что это не способ включить арабских символов, поэтому я перечеркнул эту часть ответа.
Я немного играл с CodeIgniter. Я не знаю, будет ли этот материал работать в другой системе. Он работает на моей Windows XP, PHP 5.3. Это то, что я нашел:
- В PHP вы можете использовать UTF-8 символов в качестве идентификаторов функций и классов, но она официально не поддерживается (см this для дальнейшей информации).
В CodeIgniter controller/method
часть URL кодируется по URL (например, ـج
преобразуется в %D9%80%D8%AC%E2%80%8E
).Если вы хотите использовать арабский язык в controller
или method
имен у вас есть два варианта:
- In
application/config/routes.php
Добавить URL закодированный маршрут, указывающий на реальный маршрут, который может содержать арабские символы (как уже упоминалось выше, вы можете использовать UTF-8 символов в Идентификаторы PHP). Например: $route['welcome/%D8%A3'] = 'welcome/أ';
позволит пользователю перейти на example.com/index.php/welcome/أ
, который будет вызывать метод أ
(определенный как function أ() { ... }
) в welcome
контроллер. Конечно, вы можете сопоставить URL-адреса арабского URL-адреса с обычными именами ASCII.
Extendsystem/core/Router.php
класс, так что fetch_method
и fetch_class
return url расшифрованные имена. Я не знаю, каковы последствия для безопасности, когда вы это делаете. Вероятно, лучше проверить, являются ли входные символы действительно арабскими (т. Е. Вы можете проверить диапазоны символов, заданные here). Пример модифицированного fetch_class
:
function fetch_class()
{
return urldecode($this->class);
}
Если вам нужно использовать арабские символы в параметрах методов контроллера вам просто нужно urldecode
этих параметров. Например .:
class Welcome extends CI_Controller
{
public function index($param)
{
$this->output->set_content_type("text/plain; charset=utf-8");
echo urldecode($param);
}
}
Если вам нужно использовать эти символы в строке запроса он просто работает. Например.
class Welcome extends CI_Controller
{
public function index()
{
$this->output->set_content_type("text/plain; charset=utf-8");
echo $this->input->get('arabic');
}
}
Переход к example.com/index.php/welcome/index?arabic=ابتثجحخدذرزسشصضطظعغفقكلمنهوي
напечатает ابتثجحخدذرزسشصضطظعغفقكلمنهوي
.
Edit4: Если у вас есть $config['uri_protocol'] = 'PATH_INFO'
то:
- В конфигурации установлен
$config['permitted_uri_chars'] = 'a-z 0-9~%.:_\-\x{0600}-\x{06FF}';
Продлить URI
класс в system/core/URI.php
так, что в методе _filter_uri
линии с preg_match
является:
if (! preg_match("|^[".str_replace(array('\\-', '\-', '\{', '\}', '\\\\x'), array('-', '-', '{', '}', '\x'), preg_quote($this->config->item('permitted_uri_chars')))."]+$|ui", $str))
Спасибо, но он все еще не работает. Я получаю предупреждение php: «Сообщение: preg_match() [function.preg-match]: Ошибка компиляции: диапазон не соответствует порядку в классе символов со смещением 32". – user1324762
@ user1324762 Я отлажу это, когда вернусь вечером вечером –
@ user1324762 Я перечитал ваш вопрос, и я в замешательстве. Вы хотите использовать арабские символы как имена контроллеров или методов? Мне удалось отправить арабских символов через '$ _GET' (например,« www.example.com/index.php/welcome/index?arabic= ابتثجحخدذرزسشصضطظعغفقكلمنهوي') в CodeIgniter 2.1.3 по умолчанию. У вас возникли проблемы с отправкой через '$ _GET' или вы хотите использовать арабский язык в именах контроллеров/методов? –