在我的网站上,我可以使用 GET 请求触发某些操作,例如隐藏或删除评论的功能。我不是很担心,但如果有人使用 img src= url 设计攻击来删除评论或电子邮件,那会很烦人。有没有办法防止这种情况发生?
我使用 httponlycookies 作为登录数据。如果有人使用 img src 或变体,请求是否会提交有效的登录 cookie?我应该使用 POST 代替吗? POST 会减慢网站速度吗? cookie 非常少,因此浏览器可能会用一个数据包提交 cookie 和 POST,但我不知道 POST 和 cookie 是否必须分开。
所有这些答案似乎都需要考虑其他 3 个答案中未提及的内容。所以我会将其变成一个 wiki,以便人们可以获得更多信息,而不是查看已接受的答案。
您在这里混淆了几个常见问题。
首先,正如其他人指出的那样,这种攻击被称为跨站点请求伪造。可能会导致来自另一个域的 GET 或 POST,并且由于请求将发送到 your 域,因此它将传入 your 域的 cookie,其中包括会话详细信息。
为了解决这个问题,当用户登录时,生成一个令牌(一些随机字符串),您网站上的所有链接和表单都会在该会话期间传回。当请求传入时,从 cookie 中获取会话详细信息,并查找应为该会话 GETted/POSTed 的令牌。如果未传递正确的令牌,则您可以忽略该请求/通知用户/日志详细信息以进行进一步调查。我建议使用最后一个,因为在实施此操作时,您很可能会错过一些无法使用的链接或表单。用户可能会直接离开,而不是花时间通知您。
其次,GET 请求应该是安全的(即仅显示数据而不进行任何更改),并且 POST 应该用于所有数据更改请求。首先,如果蜘蛛设法跟踪链接,导致蜘蛛不应该引起的变化。其次,作为用户刷新页面的备份 - 浏览器应该提醒他们将重新提交请求以及是否要继续。我之所以说作为备份,是因为您的所有请求都应该以这样的方式编写:如果重新提交,它们是无害/被忽略的,即没有请求删除最后一个项目的按钮,而是查找最后一个项目的 id为1423并且有请求删除1423的按钮;如果提交两次,那么第二次验证时应该会注意到第 1423 项不再存在并且不会导致进一步的更改。
我应该使用 POST 吗?会发布 减慢网站速度?有非常 小cookies,以便浏览器可以提交 cookie 和 POST 一包 但是我不知道是否 POST 和 cookie 必须是单独的。
是的,在您的情况下最好使用 POST 以降低安全风险。并且不要优先考虑速度而不是安全性,请使用 POST,是的,post 和 cookie 不会相互冲突。
最后,我建议您使用 html 净化器 来确保您的网址和表单安全。
您所讨论的风险称为跨站点请求伪造攻击。防止这种情况的标准方法是双重发布 cookie(一次在 cookie 中,一次在表单中),或攻击者无法通过包含的图像猜测到的其他一些独特标记。有关检测和预防的更多详细信息,请参阅:
http://www.owasp.org/index.php/Cross-Site_Request_Forgery_(CSRF)
我基本同意status203。除了他所说的 POST 没有真正帮助之外,还有一些评论:
1) 仅当应用程序编写正确时,GET 才是安全的。我见过使用 GET 甚至进行更改的应用程序。其次,关于这个主题,如果您以数组形式返回 JSON 数据,并且您的入口点未针对 CSRF 进行保护,则在某些浏览器上,攻击者可能能够通过诱使受害者访问具有 http://yourserver/ 的网站来窃取受害者的数据。 json_rsp_entrypoint">; 然后重写数组构造函数。
2)其次,当参数中有一些随机的东西,然后检查会话中存储的内容时,如果你没有会话,这会很复杂(例如,如果你有数百台服务器并且不想受到查询数据库)。因此,一种替代方法是包含 MD5(session_cookie) 作为 CSRF 令牌。这允许您在不求助于数据库的情况下进行验证,并且没有 XSS 的攻击者无法获取 session_cookie,因此无法构造令牌。请注意,我不建议使用 session_cookie 本身作为令牌,因为它会产生更严重的问题 - 当引用者泄漏或在隐藏表单字段中时,如果页面被保存。