我正在尝试合并CSRFGuard库,以便纠正应用程序中的一些CSRF漏洞。但是,在按照指定的here进行配置后,当我浏览应用程序时,我现在在日志中收到以下消息:
WARNING: potential cross-site request forgery (CSRF) attack thwarted (user:<anonymous>, ip:169.xx.x.xxx, uri:/myapp/MyAction, error:request token does not match session token)
通过包括:
<script src="/sui/JavaScriptServlet"></script>
在我的main.jsp
页面上,所有链接都是根据CSRFGuard
token
构建的,例如
......./myapp/MyAction?CSRFTOKEN=BNY8-3H84-6SRR-RJXM-KMCH-KLLD-1W45-M18N
所以我无法理解我做错了什么可能导致链接传递除预期值之外的令牌。
如果有任何其他信息可以让您更容易理解,请告诉我。
答案 0 :(得分:1)
如果有人遇到类似问题:
原来,使用IE访问应用程序并没有将令牌传递给AJAX调用,这反过来会导致令牌被刷新,但已经呈现的页面中的链接仍然存在,导致点击时不匹配。
通过从源代码构建CSRFGuard并添加额外的日志记录来发现问题。
答案 1 :(得分:0)
primefaces commandlink和commandbutton似乎导致csrfguard javascript出现故障,如果你使用ajax设置为true的这两个组件(这是默认值),它可以防止在ajax调用之后注入令牌
答案 2 :(得分:-1)
其中一个可能的修复方法是在Owasp.CsrfGuard.js文件中更改以下两行。
更改
function injectTokenForm(form, tokenName, tokenValue, pageTokens) {
var action = form.attribute("action");
到
function injectTokenForm(form, tokenName, tokenValue, pageTokens) {
var action = form.attributes["action"].value;
和
更改
function injectTokenAttribute(element, attr, tokenName, tokenValue, pageTokens) {
location = element.getAttribute(attr);
要
function injectTokenAttribute(element, attr, tokenName, tokenValue, pageTokens) {
var location = null;
if (attr == "action") {
location = element.attributes[attr].value;
} else {
location = element.getAttribute(attr);
}