关于flash上传csrf保护的一个解决办法
本帖最后由 haoshaoyee 于 2012-9-17 23:06 编辑查了众多资料 理解为
php把浏览器当作一客户端,把flash当作是另一客户端 CI会为其也创建一个随机保护值
那么我们在浏览器客户端赋给flash的保护值就与CI为其创建的保护值不相等,于是拒绝所有post
不会改ci的底层 于是就用了个简单的办法 判断是否为flash上传 是则不保护 不是则保护.
但这样改不知会对flash上传的安全性有多大影响.
改 core/Input.php 646行
if ($this->_enable_csrf == TRUE)
为
if ($this->_enable_csrf == TRUE && !$this->post('close_csrf'))
flash上传时附加一个名为close_csrf 的post参数
哈哈! 感谢,刚刚搜到这篇文章我的问题也解决了 ! 谢谢 另一种办法是废除ci的csrf,自己在扩展控制器(MY_controller)的构造函数或者_remap函数里自己构建,主要参考csrf过程,里面有自定义的加密函数和输出函数,控制器属性data会在输出视图时被输出。
public function _remap($method = NULL, $params = array())
{
$go = TRUE;
//自建跨站请求防御以取代CI的并不方便也不十分安全的跨站请求防御
if(empty($_COOKIE['token']))
{
$uniqid = uniqid();
setcookie('token',$uniqid);
}
else
{
$uniqid = $_COOKIE['token'];
}
if(!empty($_POST))
{
$token = $this->input->get_post('token');
if($token === saltedhash($_COOKIE['token'],$token))
{
$go = TRUE;
if(!is_ajax())
{
//$uniqid = uniqid();
setcookie('token',uniqid());
}
}
else
{
$go = FALSE;
show_error('Your request is not allowed.');
}
}
$this->data['token'] = saltedhash($uniqid);
if($go)
{
if (!empty($method) && method_exists($this, $method)) call_user_func_array(array($this, $method), $params);
$this->__output();
}
}
靠,回复不能收藏,我新开贴去
页:
[1]