将CSRF实现到OpenID iframe中

时间:2011-01-07 06:10:43

标签: post iframe openid token csrf

我在Codeigniter 2.0网站上实现了Janrain Open ID。在我的codeigniter配置文件中启用CSRF保护之前,它工作得很好。

我读了它,似乎在我网站上的所有表单中,我都应该包含一个包含令牌的隐藏表单元素,然后在从接收页面读取帖子后对cookie令牌进行验证。

这一切都很好,但是当我尝试使用OpenID(登录表单来自janrain.com上托管的iframe)登录我的网站时,我有点卡住了我不能包括任何类型的隐藏帖子值,因为我无法控制表单的外观,并且只能提供一个返回URL,以便janrain知道要返回的页面。

如果表单位于我无法控制的iframe中,如何使用表单提交我的CSRF令牌?

3 个答案:

答案 0 :(得分:1)

您也可以将其添加到令牌网址的末尾:

?ci_csrf_token='.$this->security->get_csrf_hash()

因此,假设您正在为Janrain使用嵌入式iframe,完整的代码将最终看起来像这样:

<iframe src="https://MYACCOUNT.rpxnow.com/openid/embed?token_url=<?PHP echo rawurlencode($token_url).'?ci_csrf_token='.$this->security->get_csrf_hash(); ?>" scrolling="no" frameborder="0" seamless="seamless" style="width:400px; height:240px;"></iframe>

我在我的codeigniter上工作得很好,你不需要禁用你的CSRF安全性:)

答案 1 :(得分:0)

解决了。我最终发送了iframe我的返回URL,其中包含CSRF令牌作为URL的一部分。当Janrain返回到我的返回URL时,由于Codeigniter在Security :: csrf_verify()内部进行安全检查,我会对URL进行一些检查以查看我的令牌是否匹配(遗憾的是,由于某些原因我无法使用CI库)所以我最后使用explode('/',$ _SERVER [REQUEST_URI]))自己解析URL。如果我在我的csrf cookie令牌的URL中找到匹配,那么我们都很好,我不会检查Codeigniter通常会做的POST变量。

答案 2 :(得分:0)

我也在寻找解决方案如何关闭每个控制器的CSRF。我这样做了:

if(stripos($_SERVER["REQUEST_URI"],'/controller') === FALSE)
{
    $config['csrf_protection'] = TRUE;
}
else
{
    $config['csrf_protection'] = FALSE;
}
在config.php中

我不知道它是否可靠,但它对我有用。