1

我对 CSRF 的预防有一个疑问。许多网站说可以通过使用每个会话随机生成的“令牌”来防止 CSRF。

现在我的疑问是,假设我有一个类似的功能:

$.post("abcd.php",{'fbuid':userid,'code':'<?php echo  md5($_SESSION['randcode']); ?>'}

现在这个 md5 哈希显然对任何黑客都可以通过源代码看到。他可以简单地打开这个页面,生成一个令牌,并保持页面打开,这样会话就不会被破坏,并使用另一个选项卡或其他任何东西,开始黑客攻击,

不 ?

还是我对令牌的想法不正确?

感谢您的帮助:D

4

4 回答 4

4

我认为您误解了需要做什么。为了防止 CSRF,您需要创建一个令牌并将其保存用于该会话。然后,您需要使用该令牌附加所有提交和 AJAX 调用。

要让其他人将您发送到您网站上的某个页面,他们需要在同一会话中访问该请求。确实可以解析 HTML 并查找令牌。但是当他们尝试在您的网站上请求 http 调用时,他们将创建一个会话。新会话将有一个与传递的令牌不匹配的新令牌。

接下来,您将询问是否可以复制 cookie 和会话 ID 作为结果。这不是受保护的东西。我可以简单地坐在任何人的计算机上并复制他们所有的 cookie,然后我将以他们的身份登录。

于 2011-08-23T19:32:40.127 回答
3

正如 kapep 指出的那样,您混淆了输入验证和跨站点表单发布这两个单独的问题。无论如何,您都必须验证您的输入,因此如果您有健全的输入验证,那么您的恶意攻击者使用他自己的会话令牌的情况已经得到处理。CSRF 保护并不是为了保护数据,它只是为了确保只有您自己的应用程序中的表单才能将数据发布回该应用程序。CSRF 保护只是阻止其他人从他们在自己网站上放置的表单中直接将数据发布到您的应用程序中。

需要注意的一个具体点是,该令牌对您页面上运行的任何 javascript 都是可见的,因此一旦您有跨站点脚本 (XSS) 漏洞,您的 CSRF 保护就会失效。

请参阅跨站点脚本预防备忘单

于 2011-08-24T15:25:31.073 回答
1

您应该使用每个请求令牌。

  1. 生成一个令牌并将其存储在会话中。
  2. 将令牌传递给客户端。
  3. 执行动作。
  4. 销毁令牌。

令牌更安全,不能使用超过一次。

于 2011-08-23T19:31:01.330 回答
0

我会将被盗令牌定义为其他人使用的令牌,而不是您将令牌发送到的令牌。如果您向某人发送令牌,他就无法真正从自己那里窃取它。

如果您担心用户可以使用自己的令牌运行恶意脚本,那么您的设计似乎被破坏了。您不能阻止用户发送您没有缩进接收的数据。验证任何数据是您的工作,会话令牌只是用来识别同一客户端的多个请求。

如果您通过不安全的 http 发送该令牌,则可能是一个安全问题。然后很容易通过监视客户端网络来窃取它。

于 2011-08-24T11:37:19.703 回答