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