Некоторые символы кодируются во время 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
1 ответ
Согласно руководству пользователя, вы можете избавиться от этого, установив
$config['global_xss_filtering'] = FALSE;
Или просто удалите эту строку.
ИМХО, это ошибка дизайна, чтобы изменить $_POST
массив, но там вы идете.