2013-03-20 2 views
2

Есть уже некоторые сообщения о запрещенных ключевых символах, но у этого есть другой вопрос. Я хочу знать, насколько рискованно, если я оставлю $config['permitted_uri_chars'] пустым. Что может случиться? Причина? Мне нужно иметь enable_query_strings FALSE и я использую арабские слова вCI Насколько рискованно оставлять CodeIgniter Запрещенные ключевые символы пустым?

URL:

www.mydomain.com/%D8%A7%D9%84%D8%B3%D9%84%D8%A7%D8%B7%D8%A9-%D8%A7%D9%84%D9%8A%D9%88%D9%86%D8%A7%D9%86%D9%8A` 

Я никогда не полагаться на значение из URL, я всегда делаю некоторую очистку перед тем. Но я не уверен, как Codeigniter обрабатывает маршруты и как он включает файлы. Они полагаются на это одно правило allowed_uri_chars?

ответ

2

Если вы хотите включить только арабские символы, вы можете включать диапазоны Юникода в 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 имен у вас есть два варианта:

    1. In application/config/routes.php Добавить URL закодированный маршрут, указывающий на реальный маршрут, который может содержать арабские символы (как уже упоминалось выше, вы можете использовать UTF-8 символов в Идентификаторы PHP). Например: $route['welcome/%D8%A3'] = 'welcome/أ'; позволит пользователю перейти на example.com/index.php/welcome/أ, который будет вызывать метод أ (определенный как function أ() { ... }) в welcome контроллер. Конечно, вы можете сопоставить URL-адреса арабского URL-адреса с обычными именами ASCII.
    2. 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' то:

  1. В конфигурации установлен $config['permitted_uri_chars'] = 'a-z 0-9~%.:_\-\x{0600}-\x{06FF}';
  2. Продлить 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)) 
    
+0

Спасибо, но он все еще не работает. Я получаю предупреждение php: «Сообщение: preg_match() [function.preg-match]: Ошибка компиляции: диапазон не соответствует порядку в классе символов со смещением 32". – user1324762

+1

@ user1324762 Я отлажу это, когда вернусь вечером вечером –

+0

@ user1324762 Я перечитал ваш вопрос, и я в замешательстве. Вы хотите использовать арабские символы как имена контроллеров или методов? Мне удалось отправить арабских символов через '$ _GET' (например,« www.example.com/index.php/welcome/index?arabic= ابتثجحخدذرزسشصضطظعغفقكلمنهوي') в CodeIgniter 2.1.3 по умолчанию. У вас возникли проблемы с отправкой через '$ _GET' или вы хотите использовать арабский язык в именах контроллеров/методов? –

Смежные вопросы