Некоторые символы, закодированные во время POST, в то время как другие

TL; DR

Класс безопасности CodeIgniters непосредственно управляет вашими глобальными объектами, такими как $_POST и обнаруживает, что file() и file () являются угрозой, поэтому он кодирует HTML.

 // config.php from my apps folder is the culprit $config['global_xss_filtering'] = TRUE; 

Сделай сам (несколько, храбрый)

В CodeIgniter 2.1.4 перейдите в system/core/security.php и строку # 430-442:

 /* * Sanitize naughty scripting elements * * Similar to above, only instead of looking for * tags it looks for PHP and JavaScript commands * that are disallowed. Rather than removing the * code, it simply converts the parenthesis to entities * rendering the code un-executable. * * For example: eval('some code') * Becomes: eval('some code') */ $str = preg_replace('#(alert|cmd|passthru|eval|exec|expression|system|fopen|fsockopen|file|file_get_contents|readfile|unlink)(\s*)\((.*?)\)#si', "\\1\\2(\\3)", $str); 

Наблюдение / вопрос

В принципе, кажется, что либо PHP, либо Apache видит file () или file() в качестве угрозы.

Кто-нибудь испытал это раньше или имел ресурсы документации относительно того, почему это происходит?

Может ли кто-нибудь проверить это на своем сервере, чтобы убедиться, что они испытывают такое же поведение? Я тестировал это на обеих машинах разработки и тестирования. У меня не было возможности протестировать на производственной машине, потому что наши клиенты подключаются к ней.

Код

HTML

 <input name="q1" type="text" value="Profile (61) (D)"> <input name="q2" type="text" value="(61) (D)"> <input name="q3" type="text" value="file (61)"> <input name="q4" type="text" value="fil (61)"> <input name="q5" type="text" value="file ()"> <input name="q6" type="text" value="file()"> 

JS – вероятно, не имеет значения

 $.ajax({ url: '/test_post' ,async: true ,cache: false ,type: 'POST' ,data: { q1: $('input[name="q1"]').val(), q2: $('input[name="q2"]').val(), q3: $('input[name="q3"]').val(), q4: $('input[name="q4"]').val(), q5: $('input[name="q5"]').val(), q6: $('input[name="q6"]').val() } ,dataType: 'json' ,success: function(data){ console.log('irrelevant'); } }); 

Вкладка «Сеть – заголовки» в разделе «Данные Chrome»

 q1: Profile (61) (D) q2: (61) (D) q3: file (61) q4: fil (61) q5: file () q6: file() 

PHP – CodeIgniter 2.1.4 Framework

 echo '<pre>'.$_POST['q1'].'</pre>'; // produces: Profile (61) (D) echo '<pre>'.$_POST['q2'].'</pre>'; // produces: (61) (D) echo '<pre>'.$_POST['q3'].'</pre>'; // produces: file (61) echo '<pre>'.$_POST['q4'].'</pre>'; // produces: fil (61) echo '<pre>'.$_POST['q5'].'</pre>'; // produces: file () echo '<pre>'.$_POST['q6'].'</pre>'; // produces: file() echo '<pre>'.html_entity_decode($_POST['q1']).'</pre>'; // produces: Profile (61) (D) echo '<pre>'.html_entity_decode($_POST['q2']).'</pre>'; // produces: (61) (D) echo '<pre>'.html_entity_decode($_POST['q3']).'</pre>'; // produces: file (61) echo '<pre>'.html_entity_decode($_POST['q4']).'</pre>'; // produces: fil (61) echo '<pre>'.html_entity_decode($_POST['q5']).'</pre>'; // produces: file () echo '<pre>'.html_entity_decode($_POST['q6']).'</pre>'; // produces: file() // Both of these produce same exact result echo '<pre>'.print_r($_POST, true).'</pre>'; echo '<pre>'.print_r($this->input->post(), true).'</pre>'; 

Браузеры проверены

  • Хром 31.0.1650.57 м
  • IE 8
  • FF 25,0

Информация о сервере

Dev

  • Widnows 7 x64
  • Apache 2.2.17
  • PHP 5.3.5

тестирование

  • Windows Server 2008 R2 x64
  • Apache 2.2.21
  • PHP 5.3.8

Согласно руководству пользователя , вы можете избавиться от этого, установив

 $config['global_xss_filtering'] = FALSE; 

Или просто удалите эту строку.

IMHO, это неспособность дизайна изменить массив $_POST , но там вы идете.