XSS攻击及解决方案

原创itcats_cn 最后发布于2018-09-03 01:05:54 阅读数 3243 收藏
展开
什么是XSS攻击?
XSS攻击使用Javascript脚本注入进行攻击

XSS攻击常出现在提交表单中,如博客的评论区等,用户可以通过提交评论:<script>alert("你的网站太垃圾了!")</script>,那么只要访问该页面的用户都会弹窗,当然,这可能是为了娱乐娱乐,不要小看XSS攻击,有些人利用XSS攻击窃取用户名密码,调用黑客的工程,将用户名和密码发送过去,也可以伪装成钓鱼网站。

例如在表单中注入: <script>location.href='http://www.xxx.com'</script> 那么页面会跳转到xxx.com

还可以根据js获取本地浏览器的cookie信息,根据cookie信息完全可以模拟用户。

注意:谷歌浏览器 已经防止了XSS攻击,为了演示效果,最好使用火狐浏览器。

那么该如何防止XSS攻击呢?
实现思路:

使用转义解决。将<转义为&lt    >转义为&gt

①使用过滤器,拦截所有请求,重写request

②重写获取值的方法,将特殊代码转换成html

具体代码实现:

XssHttpServletRequest.java

package cn.itcats;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;

import org.apache.commons.lang3.StringEscapeUtils;
import org.apache.commons.lang3.StringUtils;

public class XssHttpServletRequest extends HttpServletRequestWrapper{
private HttpServletRequest request;

//需要重写构造方法
public XssHttpServletRequest(HttpServletRequest request) {
super(request);
this.request = request;
}

//需要重写getParameter(name)方法,将value进行转义
public String getParameter(String name) {
String value = request.getParameter(name);
System.out.println("没有转义之前:value="+value);
if(StringUtils.isNotBlank(value)){
//转化为html,<script>标签都会转化为html格式 &lt;script&gt;
//工具类来自于org.apache.commons.lang3.StringEscapeUtils
value = StringEscapeUtils.escapeHtml4(value);
}
return value;
}

}
web.xml配置过滤器

<!-- 防止XSS攻击 -->
<filter>
<filter-name>FilterXSS</filter-name>
<filter-class>cn.itcats.FilterXSS</filter-class>
</filter>

<filter-mapping>
<filter-name>FilterXSS</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
 

FilterXss.java

package cn.itcats;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;

public class FilterXSS implements Filter{

public void init(FilterConfig filterConfig) throws ServletException {

}

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
//强转为HttpServletRequest
HttpServletRequest req = (HttpServletRequest)request;
//需要重写request,重建一个类XssHttpServletRequest 继承 HttpServletRequestWrapper,重写构造和getParameter方法
XssHttpServletRequest xssHttpServletRequest = new XssHttpServletRequest(req);
//务必传入是重写过的request,放行
chain.doFilter(xssHttpServletRequest, response);
}

public void destroy() {

}

}
 

注意:只要是文本框、表单等,需要提交并在页面展示的,一般都需要做防XSS攻击。


————————————————
版权声明:本文为CSDN博主「itcats_cn」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/itcats_cn/article/details/82321893

原文地址:https://www.cnblogs.com/fengff/p/12576709.html