【问题标题】:Allow Get request but only in my domain?允许获取请求但仅在我的域中?
【发布时间】:2011-01-15 13:54:39
【问题描述】:

在我的网站上,我可以使用 GET 请求触发某些事情,例如隐藏或删除评论的能力。我不是很担心,但如果有人使用 img src= url 设计攻击来删除 cmets 或电子邮件,那将是非常烦人的。有没有办法防止这种情况发生?

我使用 httponlycookies 作为登录数据。如果有人做 img src 或变体,请求会提交有效的登录 cookie 吗?我应该改用 POST 吗? POST 会减慢网站速度吗? cookie 很少,因此浏览器可以提交 cookie 和 POST 一个数据包,但我不知道 POST 和 cookie 是否必须分开。

所有这些答案似乎都需要考虑其他 3 个中未提及的内容。所以我将把它变成一个 wiki,这样人们就可以了解更多信息,而不是查看已接受的答案。

【问题讨论】:

    标签: security http cookies post web


    【解决方案1】:

    我应该改用 POST 吗?会发布 减慢网站速度?有很 小 cookie,因此浏览器可以提交 cookie 和 POST 与一个数据包 但是我不知道 POST 和 cookie 必须分开。

    是的,在您的情况下最好使用 POST 来降低安全风险。并且不要偏爱速度而不是安全性,使用 POST,是的,post 和 cookie 不会相互冲突。

    最后,我建议您使用 html purifier 以确保您的网址和表单安全。

    【讨论】:

    • 我想是时候学习如何让链接提交 POST 数据了。我还不如用 AJAX 来做这个
    • @acidzombie24:正如你所说的“我应该使用 POST 代替吗?”,如果可以的话,请继续,这样至少很难通过 url 回火来改变这些东西。
    • POST 没有采取任何措施来防止这种攻击,即所谓的跨站点请求伪造。我可以很容易地在我的网站上放置一个自动提交的 POST 表单,就像包含一张图片一样。 POST 在服务器或网络处理时间或资源使用方面也与 GET 没有区别。没有性能差异。
    【解决方案2】:

    您所讨论的风险称为跨站点请求伪造攻击。防止它的标准方法是双重发布 cookie(一次在 cookie 中,一次在表单中),或者攻击者无法通过包含的图像猜测的其他一些唯一令牌。有关检测和预防的更多详细信息,请参阅:

    http://www.owasp.org/index.php/Cross-Site_Request_Forgery_(CSRF)

    【讨论】:

    • @您的评论,我从未听说过能够发送带有图像的 POST 数据。这种技术也会发布 cookie 吗?
    • 图像不是必需的,但它会有所帮助。示例:
    • 表单不会发布 cookie,但用户的请求会在标准 cookie 标头中包含 cookie。
    • 没有 IMG 标签仅用于基于 CSRF GET 的利用。你必须像你一样使用 POST 的 FORM。图片不能帮助您发出帖子请求。
    • Michael,关于您的更正,请参阅我评论的第一句话:“图像不是必需的,但它会有所帮助。”使用图像的 onload javascript 事件是触发表单发布的好方法。
    【解决方案3】:

    您在这里混淆了几个常见问题。

    首先,正如其他人所指出的,这种攻击称为跨站点请求伪造。可能会导致来自另一个域的 GET 或 POST,并且由于请求将发送到 your 域,因此它将传入包含会话详细信息的 your 域的 cookie。

    为了解决这个问题,当用户登录时,生成一个令牌(一些随机字符串),您网站上的所有链接和表单都会在该会话期间传回。当请求进来时,从 cookie 中获取会话详细信息并查找应该为该会话获取/发布哪个令牌。如果未传递正确的令牌,则您可以忽略请求/通知用户/日志详细信息以进行进一步调查。我推荐最后一个,因为在实施此操作时,您可能会错过一些链接或表单,这些链接或表单将无法正常工作。用户可能会直接离开,而不是花时间通知您。

    其次,GET 请求应该是安全的(即只显示数据而不做任何更改)并且 POST 应该用于所有数据更改请求。首先,如果蜘蛛设法跟踪一个链接,导致蜘蛛不应该引起的变化。其次,作为用户刷新页面的备份 - 浏览器应该提醒他们他们将重新提交请求并且他们是否想要继续。我说作为备份是因为您的所有请求都应该以这样一种方式编写,即如果重新提交它们是无害/忽略的,即没有请求删除最后一项的按钮,而是查找最后一项的 id是1423并且有删除1423的按钮请求;如果这被提交了两次,那么第二次验证时应该会注意到项目 1423 不再存在并且不会导致进一步的更改。

    【讨论】:

    • 从mar的回答来看,我在最后一段显然不够清楚。 GET 本质上并不安全,我的意思是它们应该只用于安全请求。
    【解决方案4】:

    我基本同意status203。除了他所说的 POST 没有真正帮助之外,还有几个 cmets:

    1) 只有在正确编写应用程序时,GET 才是安全的。我见过使用 GET 甚至进行更改的应用程序。其次,关于这个主题,如果您将 JSON 数据作为数组返回,并且您的入口点不受 CSRF 保护,那么在某些浏览器上,攻击者可能能够通过诱使受害者访问具有

    2) 其次,虽然参数中有一些随机的东西,然后检查存储在会话中的内容,但如果您没有会话(例如,如果您有数百台服务器并且不想使用查询数据库的命中)。因此,一种替代方法是包含 MD5(session_cookie) 作为 CSRF 令牌。这允许您在不求助于 DB 的情况下进行验证,并且没有 XSS 的攻击者无法获取 session_cookie,因此无法构造令牌。请注意,我不建议使用 session_cookie 本身作为令牌,因为它会产生更严重的问题 - 当引用者被泄露或在隐藏的表单字段中时,如果页面被保存。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-10-13
      • 2013-03-24
      • 1970-01-01
      • 2020-07-22
      • 2012-11-03
      • 2016-11-18
      • 2016-04-12
      相关资源
      最近更新 更多