2011-01-07 57 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安全:)