【问题标题】:problem while using enabled csrf_protection with Facebook Application将启用的 csrf_protection 与 Facebook 应用程序一起使用时出现问题
【发布时间】:2011-10-12 04:50:56
【问题描述】:
大家好,
我已经用 codeigniter 实现了一个基本的 Facebook 应用程序。它工作正常,直到 csrf_protection=false (即跨站点请求伪造被禁用)。但是当我将跨站点请求伪造保护启用为 csrf_protection=true 时(即启用跨站点请求伪造)。它不起作用。那么如何使用 csrf_protection=TRUE 运行我的应用程序。
提前致谢,
aby
【问题讨论】:
标签:
php
facebook
codeigniter
csrf
【解决方案1】:
当你向 facebook 发起请求时,你通常会有这样的 uri...
// If you want to enable CSRF, you can build some unique state and save it to session
$csrf_state = md5(uniqid(rand(), TRUE));
$this->session->set_userdata('fb_csrf_state', $csrf_state);
$dialog_url = 'http://www.facebook.com/dialog/oauth?client_id="
. $app_id . "&redirect_uri=" . urlencode($redirect_url)
. "&scope=publish_stream,user_about_me,user_birthday"
. "&state="
. $csrf_state;
如果您启用了 CSRF,那么通常您需要在会话中保存高于 $crsf_state,然后将用户重定向到 Facebook,然后使用 Facebook 返回的请求进行检查(连同 $_GET['code'])
// Then you can inspect the CSRF state
if($this->session->userdata('fb_csrf_state') == $_REQUEST['state'])
{
// This request valid, process...
}
else
{
// CSRF not valid, give user a warning
echo "You may be a CSRF victim, please try again";
}