【问题标题】:Doubt on prevention of CSRF对预防 CSRF 的怀疑
【发布时间】:2011-08-26 00:47:29
【问题描述】:

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

现在我的疑问是, 假设我有这样的功能:

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

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

没有?

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

感谢您的帮助:D

【问题讨论】:

  • 可能你需要加密和传递数据
  • @kobe 嗯,是的,可以做到,但是我需要一个非常强大的加密算法,不是吗?并且因为除非它像 md5 这样的东西才有可能解密它,因此它不会很安全 - 这就是我的想法
  • 哇,你需要阅读 CSRF,因为你没有任何线索。

标签: csrf csrf-protection


【解决方案1】:

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

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

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

【讨论】:

  • 您确实应该每次都销毁令牌。但这只能保护再次重放攻击。
  • 有些论文不建议销毁它。我们在每次请求后将其销毁以使客户满意。但这真的会奏效。您只需要确保无法从 cookie id 推断出秘密令牌。
  • 好读 shiflett.org/articles/cross-site-request-forgeries 使用 php 但想法相同。
  • @Amir Raminfar : 非常感谢这个答案 :D 如果我为任何代码做一些像“查看源代码”这样简单的事情,它是否会创建一个新会话:O ?因为任何人都可以轻松查看我的 HTML 源代码。
  • @Anant 是的,如果您查看它的源代码。但我们并没有保护你!我们正在防止会读取 html 页面的自动机器人。该机器人将有不同的会话。当您是登录的人时,我们为什么要保护您。
【解决方案2】:

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

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

参见Cross-site scriptingprevention cheat sheet

【讨论】:

  • 好的,我想我开始明白了。非常感谢您的帮助
【解决方案3】:

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

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

令牌更安全,不能多次使用。

【讨论】:

  • 感谢您的回复。我如何销毁令牌?有没有什么方法可以运行脚本,一旦我的网页失去焦点,我就可以销毁令牌?我主要担心的是,令牌很容易被复制并再次使用,而会话不会被上述任何机制破坏。
  • 你可以在使用令牌时销毁它。例如,当您收到带有令牌的 POST 时,您会将其从会话中删除,以便无法再次使用。
  • 如果这个人只是看到来自我的 $.post() 请求的令牌代码,并在其他一些选项卡中使用它。这样就不会破坏任何会话,并且令牌也是完整的:|
  • 如果他使用你服务器上的令牌,它就会被销毁。黑客可以通过刷新页面获得另一个令牌,但它会阻止自动攻击。
  • 为什么每次请求都销毁令牌?如果您创建的令牌与会话 ID 具有相同的属性(安全随机且适当的长度),则此令牌与会话 ID 具有相同的属性。在这种情况下,攻击者获取令牌的唯一方法是嗅探网络或通过 XSS,但如果您有 XSS,CSRF 保护无论如何都会失败。是的,使用 SSL。在 AJAX 应用程序中,每次使用令牌时都销毁它可能会变得很痛苦,因为在执行多个并发异步时,您必须跟踪当前有效令牌是什么。请求。
【解决方案4】:

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

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

如果您通过不安全的 http 发送该令牌,则可能存在安全问题。然后通过监控客户端网络很容易被窃取。

【讨论】:

    猜你喜欢
    • 2018-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-14
    • 2023-03-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多