Codeigniter - отключить фильтрацию XSS на основе post
Я пытаюсь настроить CMS на обратной стороне сайта, но всякий раз, когда у постданных есть <a href=...
, пост-данные обрываются.
У меня есть $config['global_xss_filtering'] = TRUE;
в config
Мой вопрос: есть ли способ отключить фильтрацию xss для одного элемента?
например.
$this->input->post('content', true);
- включает его, но как отключить его?
Спасибо всем.
ПВС
Ответы
Ответ 1
Если вы хотите изменить поведение по умолчанию метода post()
, вы можете расширить основную библиотеку ввода, или если вы ленивы, вы можете просто изменить строку 278 (или около того) библиотеки ввода для чтения:
/**
* Fetch an item from the POST array
*
* @access public
* @param string
* @param bool
* @return string
*/
function post($index = '', $xss_clean = TRUE)
{
return $this->_fetch_from_array($_POST, $index, $xss_clean);
}
Единственное отличие здесь в том, что я изменил переменную $xss_clean на TRUE
вместо FALSE
. Теперь вы можете отключить глобальную фильтрацию XSS, и она будет автоматически фильтровать входные данные, если вы не укажете false как второй параметр в своем вызове метода библиотеки ввода post()
. Только один метод вниз - это метод get()
, и вы можете изменить его таким же образом.
Однако, если бы я был вами, я бы просто расширил родную библиотеку, потому что есть хороший шанс, что вы забудете об этом к моменту обновления CodeIgniter, и тогда вам вдруг станет интересно, почему вы получая атаку XSS. Это будет выглядеть так:
class MY_Input extends CI_Input {
function My_Input()
{
parent::CI_Input();
}
function post($index = '', $xss_clean = TRUE)
{
return parent::post($index, $xss_clean);
}
}
Подробнее о расширении библиотек вы можете узнать здесь:
http://codeigniter.com/user_guide/general/creating_libraries.html
Ответ 2
Если вы хотите, чтобы глобальный xss_clean
включался и переопределялся только в определенных случаях, вы можете расширить библиотеку ввода, чтобы сохранить клон $_POST
для предоставления необработанных данных по запросу:
<?php if (!defined('BASEPATH')) exit('No direct access allowed.');
class MY_Input extends CI_Input {
public function __construct() {
$this->_POST_RAW = $_POST; //clone raw post data
parent::__construct();
}
public function post($index = null, $xss_clean = TRUE) {
if(!$xss_clean){ //if asked for raw post data -eg. post('key', false)-, return raw data. Use with caution.
return $this->_POST_RAW[$index];
}
return parent::post($index, $xss_clean);
}
}
?>
Таким образом, вы можете использовать $this->input->post('mydata', FALSE)
для получения необработанных необработанных почтовых данных, даже если xss_clean
включен глобально.
Ответ 3
i определен
global $mypost;
$mypost=$_POST;
в index.php моего корня cms
то где-нибудь я могу глобальную переменную типа
global $mypost;
$var=isset($mypost["field"])? $mypost["field"]:"";
всякий раз, когда мне нужна почта без фильтра.
работал на меня, надеюсь, что это помогает.
Ответ 4
В моем случае решение treeface не работает, но я нашел другой способ. Я сделал MY_Input с
_sanitize_globals(), и я добавил, что если будет построено место, где происходит дезинфекция почтовых данных.
// Clean $_POST Data
if (is_array($_POST) AND count($_POST) > 0) {
foreach ($_POST as $key => $val) {
if($this->_clean_input_keys($key) != 'my_none_sanitize_field')
$_POST[$this->_clean_input_keys($key)] = $this->_clean_input_data($val);
}
}
Ответ 5
Да, расширение для ввода с заменой почтового метода было очень полезным, как и проницательный читатель, который заметил, что он должен быть возвращен parent:: post ($ index, $xss_clean). Я получал ошибки и не думал об этой очевидной ошибке. Исправлено, и я выключен и работает.
Мы используем его для удаления данных post для использования в операциях sql. Хотя методы CI db хороши, у нас есть несколько больших операторов sql, которые проще скомпилировать вручную.
Ответ 6
работа с CI 2.2. Я думаю, что решение из treeface останется input- > get(), input- > cookie() и т.д., не будучи xss_cleaned. (мы используем get в запросах oauth и т.д.). Глобальное изменение конфигурации останавливает их с экранированием конструктором, и основной класс по умолчанию по умолчанию xss_clean равен FALSE...
В основном я реализовал одно и то же решение для большего количества методов.
class MY_Input extends CI_Input {
/* fixes to allow xss_clean to be disabled on a per field basis
* [ e.g. tinymce html content with style / class / event attributes ]
* initial ref : http://stackoverflow.com/questions/3788476/codeigniter-disable-xss-filtering-on-a-post-basis
* this is based on CI 2.2
* the above (stackoverflow) solution only updates the post method - which means all the rest ( get, get_post, cookie, server, request_headers, get_request_header)
* NB : we need GET to allow oauth type activities !
*
* 1 - change the global config to xss_clean = false [ otherwise the constructor will 'xss_clean' everything before we have a chance to say no ! ]
* 2 - make all of methods that take the xss_clean parameter use TRUE as default value
* 3 - we can now pass the second parameter in as FALSE if we do not want to xss_clean
*/
function get($index = '', $xss_clean = TRUE)
{
return parent::get($index, $xss_clean);
}
function post($index = '', $xss_clean = TRUE)
{
return parent::post($index, $xss_clean);
}
function get_post($index = '', $xss_clean = TRUE)
{
return parent::get($index, $xss_clean);
}
function cookie($index = '', $xss_clean = TRUE)
{
return parent::cookie($index, $xss_clean);
}
function server($index = '', $xss_clean = TRUE)
{
return parent::server($index, $xss_clean);
}
function request_headers($xss_clean = TRUE)
{
return parent::request_headers($xss_clean);
}
function get_request_header($index, $xss_clean = TRUE)
{
return parent::get_request_header($index, $xss_clean);
}
}
надеюсь, что это кому-то поможет
Ответ 7
вы можете временно отключить его
$this- > config- > set_item ('global_xss_filtering', false);
$c = $this- > input- > post ('content');
затем включите его.
$this- > config- > set_item ('global_xss_filtering', true);