您的位置:首页 > 移动开发

IBM Security Appscan漏洞--跨站点请求伪造

2016-03-16 14:21 429 查看
漏洞介绍:

可能会窃取或操纵客户会话和 cookie,它们可能用于模仿合法用户,从而使黑客能够以该用户身份查看或变更用户记录以及执行事务

将 HTTP 头设置为“http://bogus.referer.ibm.com

解决办法:

验证HTTP Referer字段

根据HTTP协议,在HTTP头中有一个字段叫Referer,它记录了该HTTP请求的来源地址。在通常情况下,访问一个安全受限页面的请求必须来自于同一个网站。比如某官网是通过用户访问http://www.test/test页面完成,用户必须先登录www.test,然后通过点击页面上的按钮来触发某某事件。当用户提交请求时,该请求的Referer值就会是按钮所在页面的URL(本例中,通常是以www. test域名开头的地址)。而如果攻击者要对网站实施CSRF攻击,他只能在自己的网站构造请求,当用户通过攻击者的网站发送请求到网站时,该请求的Referer是指向攻击者的网站。因此,要防御CSRF攻击,网站只需要对于每一个页面请求验证其Referer值,如果是以www. test开头的域名,则说明该请求是来自网站自己的请求,是合法的。如果Referer是其他网站的话,就有可能是CSRF攻击,则拒绝该请求。

代码示例:

在服务器端的拦截器必不可少,它将负责检查到来的请求是否符合要求,然后视结果而决定是否继续请求或者丢弃。在 Java 中,拦截器是由 Filter 来实现的。我们可以编写一个 Filter,并在 web.xml 中对其进行配置,使其对于访问所有需要 CSRF 保护的资源的请求进行拦截。

在 Filter 中验证 Referer

以下代码先取得 Referer 值,然后进行判断,当其非空并以 www.test 开头时,则继续请求,否则的话可能是 CSRF 攻击,转到 error.jsp 页面。

// 从 HTTP 头中取得 Referer 值
String referer = request.getHeader("Referer");
// 判断 Referer 是否以 bank.example 开头
if (referer == null) {
log.error("您的违规操作将被中止、记录并保留追溯权利!" + referer);
request.getRequestDispatcher("index.jsp").forward(request, response);
return false;
}
if (!(referer.trim().startsWith(YuMing))) {
log.error("您的违规操作将被中止、记录并保留追溯权利!" + referer);
throw new CustomException("您的违规操作将被中止、记录并保留追溯权利!");
}


如有更好的方法,欢迎在评论中指出,与大家分享。谢谢
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息