Javascript 使用随机头的HTTP(S)请求安全性

Javascript 使用随机头的HTTP(S)请求安全性,javascript,security,csrf,Javascript,Security,Csrf,我知道这是基于HTTP的应用程序的一个主要安全问题 从外观上看,大多数框架将CSRF令牌作为请求主体的一部分发送。然而,在我的情况下,这是有点不雅的几个原因;最重要的是,我不想弄乱传输层,它可能以许多不同的格式发送POST请求,不一定都是JSON或x-www-form-urlencoded 作为一个解决方案,我正在考虑一个不那么麻烦的替代方案;特别是,我正在生成一个随机头:一个随机头名称(公共前缀),包含一个随机CSRF标记 是否存在任何安全(或其他)风险 是否存在任何安全(或其他)风险 没有:

我知道这是基于HTTP的应用程序的一个主要安全问题

从外观上看,大多数框架将
CSRF
令牌作为请求主体的一部分发送。然而,在我的情况下,这是有点不雅的几个原因;最重要的是,我不想弄乱传输层,它可能以许多不同的格式发送
POST
请求,不一定都是
JSON
x-www-form-urlencoded

作为一个解决方案,我正在考虑一个不那么麻烦的替代方案;特别是,我正在生成一个随机头:一个随机头名称(公共前缀),包含一个随机
CSRF
标记

是否存在任何安全(或其他)风险

是否存在任何安全(或其他)风险

没有:只要你能从客户端传递它并检查服务器,你就没事了

另外,我应该多久刷新一次CSRF令牌?我是否需要一个新的一个为每一个请求,或每几次请求,或每一个网站访问和一天一次,或

一般来说,您根本不应该刷新它。如果它是使用加密强随机数生成器生成的,那么每个会话可以有一个。重要的是不可能猜到它,因此它不应该来自任何已知数据。

您可以只设置标头,然后检查此服务器端。许多框架,如JQuery,会自动将其添加到AJAX请求中

X-request-With
是一个事实上的标准,用于指示请求是通过AJAX发出的

您不需要随机令牌,因为如果服务器没有通过CORS选择,则不可能跨域发送此标头

因此,设置和检查非标准标头是防止CSRF的有效方法

没有提到它,但是它提到检查
原点
标题。但是,由于许多浏览器不发送相同来源请求的
来源

此外,这仅适用于AJAX请求。对于普通格式的帖子,不可能添加额外的标题。此外,在过去,Flash等插件也存在漏洞,允许设置任何头,使攻击者能够使用Flash发出跨域请求。然而,像这样的问题早就解决了

如果您想要一个令牌以及纵深防御策略的一部分,您可以调整
X-request-With
以包含一个随机令牌,然后进行检查。e、 g.
X-request-With:XMLHttpRequest;0123456789ABCDEF


然后,令牌可以是一个cookie值,仅用于防止CSRF(当然是通过加密安全算法和熵源生成的)。

根据@Quentin的建议,我删除了第二个问题。我已经找到了一个很好的答案:)我看不出有什么特别的原因可以将标题名随机化。只需确保它不会与任何标准(或常用的非标准)标题冲突。类似于
X-YourAppName-CSRF
的名称应该是一个合理的名称。@IlmariKaronen:与规范不同,可以使我的应用程序更安全,以防使用功能有限的工具(例如,无法处理标题名称更改的工具)。在折衷曲线的另一边(增值vs.成本增加):使用一对令牌而不是一个令牌只需要很少的开发和维护开销。听起来是一个很棒的简单想法!我想知道为什么政府甚至不提这件事。另一方面,它不太安全:1。我假设一些服务器默认启用,或者由于其他原因(例如,由于不知道开发人员的原因)启用了它。2.使用安全令牌可以降低攻击者潜入请求的风险。@Domi:主要原因是这只适用于AJAX请求。对于普通格式的帖子,不可能添加额外的标题。此外,在过去,Flash等插件也存在漏洞,允许设置任何头,使攻击者能够使用Flash发出跨域请求。然而,像这样的问题早就解决了。浏览器错误总是需要考虑的!看来,我最好还是坚持我的随机标题+安全令牌,尽管如此:)[Btw:我重新写了我的原始评论]@Domi:一般来说,你不应该在浏览器中对漏洞进行编码-你必须信任合同的客户端来维护他们的安全。现在浏览器会自动更新,所以风险很低。您可以调整
X-request-With
以包含一个随机令牌,然后进行检查。e、 g.
X-request-With:XMLHttpRequest;0123456789ABCDEF
@Domi:在POST中传输令牌之前,必须以某种方式将其传输到客户端。我提到GET可以通过CORS访问,因为您在最初的评论中提到了同步器令牌模式。但是,如果您使用双重提交Cookies,则不需要此GET。