2011-01-07 59 views
3

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

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

这是所有罚款和花花公子,但如果我有点卡住是,当我尝试登录到我的网站现在使用OpenID(其中的登录表单来自于上janrain.com托管的iframe)我不能包含任何隐藏的帖子值,因为我无法控制表单的外观,只能提供一个返回url,以便janrain知道要返回给我的页面。

如果窗体位于不受控制的iframe中,我如何才能使用表单提交CSRF令牌?

回答

1

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

0

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

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

在config.php 我不知道这是否是可靠的,但它为我工作。

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安全:)