我正在组建一个网站,该网站可以供用户输入。我想知道是否编写如下函数:
if(getenv("HTTP_REFERER") != 'http://www.myURL.com/submitArea'){
die('don\'t be an jerk, ruin your own site');
}else{
// continue with form processing
}
足以防止跨站点表单提交。
编辑:如果不是,防止其他主机提交表单的最佳做法是什么?
最佳答案
不 - HTTP_REFERER
可以在客户端自由欺骗,并且不是请求来源的可靠指示。
更新:我误读了有关跨站点伪造的部分:为此,检查引荐来源 是一种有效的安全措施,因为 CSRF 依赖于指向 protected 页面的操纵链接(被攻击的用户有特权)。用户@Rook 是正确的。
唯一的异常(exception)是攻击可能发生在被攻击的网络应用程序内部,例如通过注入(inject)恶意 JavaScript 代码。在这种情况下,引用检查是无用的,因为攻击来自“安全”URL,但可以说是基于 session 或一次性 token 的解决方案,因为 token 触手可及的恶意 JavaScript,可以轻松检索。
但是,由于 HTTP_REFERER
已被某些代理剥离,因此使用一次性 token 更适合防止此类攻击。
关于带有Referer的PHP表单安全性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2841399/