我正在尝试在网站背面设置CMS,但每当发布数据中包含<a href=...
时,帖子数据就会被废弃。
我在配置
中有$config['global_xss_filtering'] = TRUE;
我的问题是有一种方法可以禁用一个项目的xss过滤吗?
e.g。
$this->input->post('content', true);
- 打开它,但如何将其关闭?
谢谢大家。
PVS
答案 0 :(得分:27)
如果你想改变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过滤,它会自动过滤输入,除非您在调用Input库的post()
方法时指定false作为第二个参数。只有一种方法是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
答案 1 :(得分:6)
如果您希望仅在某些情况下启用全局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
来检索未经过清理的原始发布数据。
答案 2 :(得分:1)
我定义了
global $mypost;
$mypost=$_POST;
在我的root cms
的index.php中然后我可以在任何地方使用像
这样的全局变量global $mypost;
$var=isset($mypost["field"])? $mypost["field"]:"";
每当我需要发布时不带过滤器。
为我工作希望它有所帮助。
答案 3 :(得分:1)
在我的情况下,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);
}
}
答案 4 :(得分:0)
是的,使用post方法替换的Input扩展非常有用,精明的读者也注意到它应该返回parent :: post($ index,$ xss_clean)。我遇到了错误,并没有想到那个明显的错误。修好了,我就跑了。
我们正在使用它来转义帖子数据,以便在sql语句中使用。虽然CI的db方法很好,但是我们有一些更容易手动编写的大型sql语句。
答案 5 :(得分:0)
使用CI 2.2我认为来自treeface的解决方案将保留input-&gt; get(),input-&gt; cookie()等不是xss_cleaned。 (我们使用get in oouth请求等)。全局配置更改会阻止它们被构造函数转义,并且核心类在这些方法上仍默认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);
}
}
希望这对某人有所帮助
答案 6 :(得分:-4)
你可以暂时将其关闭
$ this-&gt; config-&gt; set_item('global_xss_filtering',false);
$ c = $ this-&gt; input-&gt; post('content'); 然后把它重新打开..
$ this-&gt; config-&gt; set_item('global_xss_filtering',true);