gpt4 book ai didi

php - 如何在PHP中有效防止跨站请求伪造(CSRF)

转载 作者:可可西里 更新时间:2023-11-01 12:55:20 26 4
gpt4 key购买 nike

我正在努力阻止 CSRF通过以下方式:

  1. A $_SESSION['token']在每一页的开头生成。我已经知道使用 $_COOKIES这是完全错误的,因为它们是针对每个请求自动发送的。

  2. 在每个<form> , 以下输入: <input type="hidden" name="t" value="<?php echo '$_SESSION['token']; ?>">已附加。

  3. $_SESSION['token'];使用 $_POST['t'] 验证

现在我有几个小问题:

  • 这是防止 CSRF 的好方法吗?如果不是,请解释。
  • 当打开另一个页面时设置相同的 $_SESSION变量,前一个(仍然打开的)页面变得无效,如何防止这种情况?
  • 对于表单这个方法很清楚,但是如何处理正常的链接呢?是否也有必要将 token 附加到每个链接?

非常感谢您。

最佳答案

Is this a good way to prevent CSRF?

是的。这样做是为了强制客户端在可以对您的表单处理程序执行 POST 之前在表单上执行 GET。这可以防止 CSRF 在现代浏览器中,因为浏览器会阻止客户端 Javascript 向外部域发出 XHR GET 请求,因此第 3 方无法在他们的网站上模仿您的表单并成功获得有效 token 提交。

When another page is opened as well that sets the same $_SESSION variable, the previous (still open) page becomes invalid, how to prevent this?

允许多个 token 同时有效,在 session 中保留一组有效 token 。或者,根本不存储任何 token ,而是使用 token 签名方案。我已经涉足并解释了 here .备选方案 2:在整个 session 中只使用一个 token ,而不会使 token 无效。 (在评论中向@SilverlightFox 致敬)

For forms this method is clear, but how to handle normal links? Is it necessary to append the token to each link as well?

没有。您只需要保护 POST 请求,因为大概只有 POST 请求可以更改敏感数据(眨眼轻推,您坚持 REST 约定,对吧?!)并且 XHR GET 请求已被浏览器阻止-边。

关于php - 如何在PHP中有效防止跨站请求伪造(CSRF),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33776062/

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