gpt4 book ai didi

php - PHP中的CSRF(Cross-site request forgery)攻击示例和预防

转载 作者:IT王子 更新时间:2023-10-28 23:56:39 27 4
gpt4 key购买 nike

我有一个网站,人们可以像这样进行投票:

http://mysite.com/vote/25

这将对第 25 项进行投票。我只想将其提供给注册用户,并且仅当他们想要这样做时。现在我知道有人在网站上忙的时候,有人给他们这样的链接:

http://mysite.com/vote/30

那么投票将是他在该项目上的位置,而他不想这样做。

我已阅读 explanation on the OWASP website ,但我不是很明白

这是 CSRF 的一个例子,我该如何防止这种情况。我能想到的最好的事情是在链接中添加一些东西,比如哈希。但是,在所有链接的末尾放置一些东西会很烦人。有没有其他方法可以做到这一点。

另一件事可能有人可以给我一些其他的例子,因为这个网站对我来说似乎相当神游。

最佳答案

这可能成为 CSRF 的一个例子,如果:

  • 该链接被提取(例如通过 <img> 标签):伪造
  • 来自其他网站:跨网站


例如,如果我可以注入(inject) <img> stackoverflow 的 HTML 源代码中的标签 (我可以,因为 stackoverflow 允许在他的帖子中使用 <img> 标签):

<img src="http://mysite.com/vote/30" />

你只会投票给那个项目 ;-)


通常使用的解决方案是在 URL 中放置一个生命周期有限的 token ,并在获取 URL 时检查此 token 是否仍然有效。

基本思路是:

  • 生成页面时:
    • 生成唯一 token
    • 将其存储在用户的 session 中
    • 并将它放在页面的链接中——看起来像这样:http://mysite.com/vote/30?token=AZERTYUHQNWGST
  • 调用投票页面时:
    • 检查 token 是否存在于 URL 中
    • 检查它是否存在于用户的 session 中
    • 如果不是 => 不登记投票

有这样的想法:

  • token 的生命周期不长,而且难以猜测
  • 这意味着你的攻击者:
    • 只有几分钟的窗口,他的注入(inject)将在此期间有效
    • 一定要善于猜测^^
    • 必须为每个用户生成不同的页面。


另外,请注意,用户离开您的网站后 session 保持活跃的时间越短,当他访问不良网站时 session 仍然有效的风险就越小。

但在这里,您必须在安全性和用户友好性之间做出选择...


另一个想法(这不是完全安全,但有助于防止不知道如何强制发布请求的人),将仅在人们投票时接受 POST 请求:

  • 浏览器正在为注入(inject)的标签发送 GET 请求
  • 由于这个 URL 正在修改一些数据,无论如何,它不应该与 GET 一起使用,而只能与 POST 一起使用

但请注意,这并不完全安全:(可能?)可以通过一些 Javascript 来强制/伪造 POST 请求。

关于php - PHP中的CSRF(Cross-site request forgery)攻击示例和预防,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2526522/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com