我对CSRF预防有一个疑问。许多网站都说可以通过使用每个会话随机生成的“令牌”来防止CSRF。
现在我怀疑是, 假设我有一个像:
这样的功能$.post("abcd.php",{'fbuid':userid,'code':'<?php echo md5($_SESSION['randcode']); ?>'}
现在这个md5哈希显然可以通过源代码看到任何黑客。他可以简单地打开这个页面,生成一个令牌,并保持页面打开,这样会话不会被破坏,并使用另一个选项卡或别的什么,开始黑客攻击,
不是吗?
或者我对令牌的想法不正确?
感谢您的帮助:D
答案 0 :(得分:4)
我认为你误解了需要做什么。要防止CSRF,您需要创建一个令牌并将其保存到该会话中。然后,您需要使用该令牌附加所有提交和AJAX调用。
如果其他人将您发送到您网站上的某个页面,他们需要在同一会话中访问该请求。确实可以解析HTML并查找令牌。但是,当他们尝试在您的网站上请求http呼叫时,他们将创建新会话。新会话将有一个新令牌,该令牌与传递的令牌不匹配。
接下来,您将询问如果您可以复制cookie和会话ID。这不是受保护的东西。我可以简单地坐在任何人的计算机上并复制他们所有的cookie,然后我将以他们的身份登录。
答案 1 :(得分:3)
正如kapep指出的那样,您混淆了输入验证和跨站点表单发布这两个单独的问题。您无论如何都必须验证输入,因此如果您有声音输入验证,则已经处理了恶意攻击者使用自己的会话令牌的情况。 CSRF保护不是为了保护数据,只是为了确保只有来自您自己的应用程序的表单才能将数据发布回该应用程序。 CSRF保护只是阻止其他人能够将数据直接发布到他们自己网站上的表单中。
需要注意的一点是,令牌对您网页上运行的任何javascript都是可见的,因此只要您有跨站点脚本(XSS)漏洞,您的CSRF保护就会失败。
答案 2 :(得分:1)
您应该使用每个请求令牌。
令牌更安全,不能多次使用。
答案 3 :(得分:0)
我会将被盗令牌定义为其他人使用的令牌,而不是您已将令牌发送到的令牌。如果你向某人发送了一个令牌,他就无法真正从他自己那里偷走。
如果您担心用户可以使用自己的令牌运行恶意脚本,那么您的设计似乎已被破坏。您无法阻止用户发送您未缩进接收的数据。验证任何数据都是您的工作,会话令牌只是用于识别同一客户端的多个请求。
如果您通过不安全的http发送该令牌,则可能是安全问题。然后通过监控客户网络很容易被盗。