我正在以编程方式部署 Java Websocket 端点(JSR356 3.1),我希望它验证Origin
请求标头值以减轻 CSRF 攻击,并且只接受Host
与Origin
标头值匹配的握手请求。
在我看来,要走的路是覆盖方法:
ServerEndpointConfig.Configurator.checkOrigin(String originHeaderValue)
(Tomcat 8提供的实现总是返回true
),但我看到的问题是这个方法只有一个参数,我错过了主机头值来比较这个值。
此外,此类不提供任何返回此信息的方法,因此我认为此方法无用,除非您将原始标头值与先前已知的主机值或值集进行比较,但这也没有任何意义,因为我的应用程序可以在不同的、不断变化的主机名或 IP 下看到。
我正在考虑在modifyHandshake(ServerEndpointConfig sec, HandshakeRequest request, HandshakeResponse response)
可以读取所有标头值的实现中执行此验证,但我很确定我误解了一些东西。
所以我的问题是:
执行此验证的正确方法是什么?
谢谢,纳乔