使用 nonce 防止跨域表单提交?

信息安全 随机数
2021-08-15 20:51:24

我以前在网络安全方面做得不多,但现在需要防止从我自己的域以外的任何地方提交表单。

我知道如何将其锁定在 .htaccess 文件中,但根据我的理解,引用者并不是很可靠。

我现在正在研究随机数。我在我的表单上设置了一个可用的随机数(我使用的是 Wordpress,所以创建随机数字段很容易)。

我现在需要知道的是,这真的能帮助我防止跨域提交吗?

在我看来,它就像您需要我的密钥来生成随机数字符串一样,但另一方面,随机数字符串在页面源中可见。这是否意味着您需要再次使用我的密钥来翻译 nonce 字符串来验证它?

我希望有人可以为我解决这个问题!

1个回答

防止从其他来源提交表单是一个已解决的问题,并且使用 nonce 是推荐的方法之一。

在某些背景下,有一种针对 Web 应用程序的攻击形式,称为跨站点请求伪造 (XSRF)简单来说,跨站点请求伪造是指有人在恶意页面上加载 JavaScript,然后将帖子发布到另一个页面不仅如此,如果您不熟悉 CSRF,我强烈建议您阅读它。(除了我上面链接的 OWASP 文章之外,请参阅Jeff Atwood 的文章。)

好消息是,许多 Web 开发框架已经预先构建了防止 XSRF 攻击的机制,并且它们通过确保帖子来自您自己的域来做到这一点。同样,使用随机数是这些方法之一。

从 XSRF 上的 OWASP 页面:

相关控件

  • 除了标准会话之外,将每个请求的随机数添加到 URL 和所有表单。这也称为“表单键”。许多框架(例如 Drupal.org 4.7.4+)要么已经或正在开始将这种类型的保护“内置”到每个表单中,因此程序员不需要手动编写这种保护。
  • 待定:为 URL 和所有表单添加一个会话随机数

在 OWASP 页面的底部有几个参考资料,包括指向已经可用的解决此问题的机制的链接,包括 OWASP CSRF Guard,它使用J2EE.NETPHP过滤器,将唯一的请求令牌附加到 HTML 中的每个表单和链接响应,以便在整个应用程序中提供针对 CSRF 的普遍覆盖。