我有一个codeigniter应用程序,工作正常。我创建了一个Facebook画布应用程序,并尝试加载由codeigniter生成的页面。它没用。我看到了可怕的 - “你所要求的行动是不允许的”。 为了确保我的Facebook应用程序设置正确,我尝试从另一个网站的页面,它工作。
所以开始寻找可能的问题,我可以发现这是因为在cornfig设置中CSRF保护= TRUE。所以我只是关闭了CSRF保护,看看是否可行。 然后,它工作,我可以实际加载codeigniter生成的页面通过Facebook Canvas应用程序(沙盒模式,但..)
有人建议如果我们硬编码csrf令牌的隐藏字段(而不是依赖于form_open()函数),我们可以避免这个规则,并且通过这个逻辑,如果我们有一个完全没有形式的页面,应该工作得很好。我甚至无法加载没有表单的页面。
我在任何地方都没有使用AJAX。
我正在使用CI 2.1.3。
一个相关链接 - http://ellislab.com/forums/viewthread/228160/#1038448 虽然Stackoverflow和其他论坛上有很多类似的问题,但我找不到满意的答案。
如果我只看到apache日志,我真的不觉得关闭CSRF保护会是一个好主意。
那么如何在不关闭CSRF保护的情况下,在Facebook画布应用程序中显示codeignter生成的页面?
任何指针都会有用。谢谢你的时间。
答案 0 :(得分:1)
此问题的根本原因是Facebook如何调用应用页面iframe。 Facebook在$ _POST数组中默认发送一个参数(signed_request)。但是当Codeigniter检查CSRF保护时,在post数组中找不到csrf令牌。
显然,没有直接的解决方案。我们可以更改csrf_verify
中system\core\Security.php
函数的条件,这样就不会验证$ _POST ['signed_request']的值是什么,但我知道这不是一个好主意。