Codeigniter - 在帖子的基础上禁用 XSS 过滤
Posted
技术标签:
【中文标题】Codeigniter - 在帖子的基础上禁用 XSS 过滤【英文标题】:Codeigniter - Disable XSS filtering on a post basis 【发布时间】:2011-04-16 20:27:15 【问题描述】:我正在尝试在网站背面设置 CMS,但只要帖子数据中包含 <a href=...
,帖子数据就会被废弃。
我在配置中有$config['global_xss_filtering'] = TRUE;
我的问题是有没有办法为一个项目禁用 xss 过滤?
例如
$this->input->post('content', true);
- 开启,但如何关闭?
谢谢大家。
PVS
【问题讨论】:
感谢大家为此花费了 2 个小时。我在通过 ckeditor 保存 base64 图像时遇到问题。XSS 过滤是错误的,但我的同事在配置文件中将其设置为 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 过滤,它会自动过滤输入,除非您在调用 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
【讨论】:
不错的技巧。我认为应该是 return parent::post($index, $xss_clean);,但是。 阅读有关扩展的更好链接是本页的“扩展核心类”部分codeigniter.com/user_guide/general/core_classes.html 可怕的 hack,救了我的命。我想知道我们是否应该解释 CI 开发人员在下一个版本中添加这个内置。或者他们可能因为安全问题而没有这样做。 @aslamdoctor,由于安全问题,我非常确定他们不会“修复”这个问题。 RoR 刚刚经历了一系列令人讨厌的宣传,因为对这样的事情松懈。 这个效果更好:class MY_Input extends CI_Input public function __construct() parent::__construct(); public function post($index = null, $xss_clean = TRUE) return parent::post($index, $xss_clean);
【参考方案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);
?>
这样,即使xss_clean
全局启用,您也可以使用$this->input->post('mydata', FALSE)
检索未经清理的原始帖子数据。
【讨论】:
【参考方案3】:我定义了
global $mypost;
$mypost=$_POST;
在我的根 cms 的 index.php 中
然后我可以在任何地方使用全局变量
global $mypost;
$var=isset($mypost["field"])? $mypost["field"]:"";
每当我需要不带过滤器的帖子时。
为我工作希望它有所帮助。
【讨论】:
但这也是XSS过滤的。【参考方案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】:是的,使用 post 方法替换对 Input 的扩展非常有用,精明的读者也注意到它应该是 return parent::post($index, $xss_clean)。我遇到了错误,并没有考虑到那个明显的错误。修好了,我就跑了。
我们使用它来转义发布数据以用于 sql 语句。虽然 CI 的 db 方法不错,但我们有一些大型 sql 语句更容易手动编码。
【讨论】:
【参考方案6】:使用 CI 2.2 我认为 treeface 的解决方案将使 input->get()、input->cookie() 等不被 xss_cleaned。 (我们在 oauth 请求中使用 get 等)。全局配置更改阻止它们被构造函数转义,并且核心类在这些方法上仍然默认 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://***.com/questions/3788476/codeigniter-disable-xss-filtering-on-a-post-basis
* this is based on CI 2.2
* the above (***) 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);
【讨论】:
OP,我很想看看这是否有效。根据我对 CI 的 XSS 过滤方案的理解,我认为这实际上不会达到预期的效果。我相信 CI 会在控制器启动时对整个 $_POST 变量进行 XSS 过滤,因此事后更改配置影响不大。还是……值得一试。 嗨,这似乎不适用于我的 CI 安装。感谢您的回复! 您可以在过滤完成之前在挂钩中执行此操作。有几个阶段的钩子来行动。 [链接]codeigniter.com/user_guide/general/hooks.html[/link]以上是关于Codeigniter - 在帖子的基础上禁用 XSS 过滤的主要内容,如果未能解决你的问题,请参考以下文章