跨站脚本 XSS<一:防御方法>
1. 过滤特殊字符
避免XSS的方法之一主要是将用户所提供的内容进行过滤,许多语言都有提供对HTML的过滤:
- PHP的
htmlentities()或是htmlspecialchars()
。 - Python的
cgi.escape()
。 - ASP的
Server.HTMLEncode()
。 - ASP.NET的
Server.HtmlEncode()
或功能更强的Microsoft Anti-Cross Site Scripting Library - Java的xssprotect (Open Source Library)。
- Node.js的node-validator。
2. 应用<java语言>
在web应用中主要是通过在过滤器中将可能造成攻击的字符进行转义,转义之后存到数据库中,从而避免攻击。
XSSFilter.java过滤器配置
package util.web; import *; /**
* xss过滤器和CSRF过滤
* 防 XSS 之全角替换半角
* 防CSRF之HTTP 头设置 Referer过滤
* */
public class XSSFilter implements Filter {
@Override
public void init(FilterConfig filterconfig) throws ServletException {
// TODO Auto-generated method stub
} @Override
public void doFilter(ServletRequest servletrequest,ServletResponse servletresponse, FilterChain filterchain)throws IOException, ServletException {
// 防 XSS
XssHttpServletRequestWrapper xssRequest = new XssHttpServletRequestWrapper((HttpServletRequest)servletrequest);//***包装转换请求中的可能攻击的字段
filterchain.doFilter(xssRequest, httpResp);
} @Override
public void destroy() {
// TODO Auto-generated method stub }
}
XssHttpServletRequestWrapper .java 主要重写getParameter()和getParameterValues()方法,对获取的值进行转义。
package util.web; import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
/**
* 针对普通字符串进行过滤转义
* 本质是把符号额度半角变成全角
* 这样JS就执行不了了*/
public class XssHttpServletRequestWrapper extends HttpServletRequestWrapper {
HttpServletRequest orgRequest = null; public XssHttpServletRequestWrapper(HttpServletRequest request) {
super(request);
orgRequest = request;
} /**
* 覆盖getParameter方法,将参数名和参数值都做xss过滤。<br/>
* 如果需要获得原始的值,则通过super.getParameterValues(name)来获取<br/>
* getParameterNames,getParameterValues和getParameterMap也可能需要覆盖
*/
@Override
public String getParameter(String name) {
String value = super.getParameter(xssEncode(name));
if(value != null) {
value = xssEncode(value);
}
return value;
}
@Override
public String[] getParameterValues(String name) {
String[]parameters=super.getParameterValues(name);
if (parameters==null||parameters.length == 0) {
return null;
}
for (int i = 0; i < parameters.length; i++) {
parameters[i] = xssEncode(parameters[i]);
}
return parameters;
}
/**
* 覆盖getHeader方法,将参数名和参数值都做xss过滤。<br/>
* 如果需要获得原始的值,则通过super.getHeaders(name)来获取<br/>
* getHeaderNames 也可能需要覆盖
*/
@Override
public String getHeader(String name) { String value = super.getHeader(xssEncode(name));
if(value != null) {
value = xssEncode(value);
}
return value;
} /**
* 将容易引起xss漏洞的半角字符直接替换成全角字符
*
* @param s
* @return
*/
private static String xssEncode(String s) {
if(s == null|| s.isEmpty()) {
return s;
}
StringBuilder sb = new StringBuilder(s.length() + 16);
for(int i = 0; i < s.length(); i++) {
char c = s.charAt(i);
switch(c) {
case'>':
sb.append(">");// 转义大于号
break;
case'<':
sb.append("<");// 转义小于号
break;
case'\'':
sb.append("'");// 转义单引号
break;
/*case'\"':
sb.append(""");// 转义双引号 ;***先注释掉,会影响json的转化
break; */
case'&':
sb.append("&");// 转义&
break;
default:
sb.append(c);
break;
}
}
return sb.toString();
} /**
* 获取最原始的request
*
* @return
*/
public HttpServletRequest getOrgRequest() {
return orgRequest;
} /**
* 获取最原始的request的静态方法
*
* @return
*/
public static HttpServletRequest getOrgRequest(HttpServletRequest req) {
if(req instanceof XssHttpServletRequestWrapper) {
return((XssHttpServletRequestWrapper) req).getOrgRequest();
} return req;
}
}
3.结论
以上的方法中只是提供的一个简单和原理性的实现,在getParameter()和getParameterValues()方法中调用 xssEncode() 方法转义。
附:
通过Apache的一个xss转义项目也可以实现:https://code.google.com/archive/p/xssprotect/wikis/HowTouse.wiki
参考资料:
1.http://itindex.net/detail/46431-xssproject-java-web
2.http://liuzidong.iteye.com/blog/1744023
跨站脚本 XSS<一:防御方法>的更多相关文章
- 跨站脚本 XSS<一:介绍>
*XSS 利用的是用户对指定网站的信任,CSRF 利用的是网站对用户网页浏览器的信任 跨站脚本(Cross-site scripting,通常简称为XSS)是一种网站应用程序的安全漏洞攻击,是代码注入 ...
- 跨站脚本(XSS)
1.1 XSS定义 XSS,即为(Cross Site Scripting),中文名为跨站脚本,是发生在目标用户的浏览器层面上的,当渲染DOM树的过程发生了不在预期内执行的JS代码时,就发生了XSS攻 ...
- 预防跨站脚本(xss)
对xss的防护方法结合在两点上输入和输出,一是严格控制用户表单的输入,验证所有输入数据,有效监测到攻击,go web表单中涉及到.二是对所有输出的数据进行处理,防止已成功注入的脚本在浏览器端运行. 在 ...
- Struts1.x 跨站脚本(XSS)漏洞的解决
一. 演示XSS 当访问一个不存在的网址时,例如[url]http://localhost:8080/demo/noAction.do[/url],那么Struts处理后都会跳到提示“Invali ...
- 跨站脚本(XSS)攻击
https://blog.csdn.net/extremebingo/article/details/81176394
- web前端安全 XSS跨站脚本 CSRF跨站请求伪造 SQL注入
web安全,从前端做起,总结下web前端安全的几种技术: 1,XSS XSS的全称是Cross Site Scripting,意思是跨站脚本,XSS的原理也就是往HTML中注入脚本,HTML指定了脚本 ...
- 【前端安全】JavaScript防http劫持与XSS
作为前端,一直以来都知道HTTP劫持与XSS跨站脚本(Cross-site scripting).CSRF跨站请求伪造(Cross-site request forgery).但是一直都没有深入研究过 ...
- ASP.NET Core中的OWASP Top 10 十大风险-跨站点脚本攻击 (XSS)
不定时更新翻译系列,此系列更新毫无时间规律,文笔菜翻译菜求各位看官老爷们轻喷,如觉得我翻译有问题请挪步原博客地址 本博文翻译自: https://dotnetcoretutorials.com/201 ...
- 【前端安全】JavaScript防http劫持与XSS (转)
作为前端,一直以来都知道HTTP劫持与XSS跨站脚本(Cross-site scripting).CSRF跨站请求伪造(Cross-site request forgery).但是一直都没有深入研究过 ...
随机推荐
- C#中ref和out的使用与区别
C#中ref关键字和out关键字所实现的功能差不多,都是指定一个形参按照引用传递而不是实参的副本传递.但是二者适用场景还是有些区别的:out适合用在需要retrun多个返回值的地方,而ref则适合用在 ...
- You and Your Research(Chinese)
转自:http://lyxh-2003.iteye.com/blog/434014 这是大科学家Richard Hamming的著名讲演,于1986年在贝尔通讯研究中心给200多名Bellcore的科 ...
- 【转】NGUI研究院之自适应屏幕(十)
http://www.xuanyusong.com/archives/2536 现在用unity做项目 90%都是用NGUI,并且我个人觉得NGUI应该算是比较成熟的UI插件,虽然他也存在很多问题,但 ...
- ngrok 外网访问小能手
以前在学校的时候想把自己做的网站发布让外网访问,可是又没有虚拟服务器和域名就显得异常的麻烦,曾经试过花生壳映射,效果虽然还不错,但是略显麻烦.今天找到一个更方便的小工具--ngrok ! 简单的介绍一 ...
- Hibernate - lazy, fetch, inverse, cascade
Inverse是hibernate双向关系中的基本概念.inverse的真正作用就是指定由哪一方来维护之间的关联关系.当一方中指定了"inverse=false"(默认),那么那一 ...
- Difference between Stored Procedure and Function in SQL Server
Stored Procedures are pre-compile objects which are compiled for first time and its compiled format ...
- copy file to docker、
Docker是个Linux Container管理软件. 今天我们来讲解一下从主机复制文件到Docker的几种方法. 在分享之前, 我们看看Docker社区对这个问题的需求是有多么强(ju)烈(jin ...
- Velocity(8)——引入指令和#Stop指令
#Include和#Parse都是用于将本地文件引入当前文件的指令,而且被引入的文件必须位于TEMPLATE_ROOT.这两者之间有一些区别. #Include 被#Include引入的文件,其内容不 ...
- s3c2440 mpll
S3C2440有两个PLL(phase locked loop)一个是MPLL,一个是UPLL.MPLL用于CPU及其他外围器件,UPLL用于USB.用于产生FCLK, HCLK, PCLK三种频率, ...
- 多列布局——Columns
为了能在Web页面中方便实现类似报纸.杂志那种多列排版的布局,W3C特意给CSS3增加了一个多列布局模块(CSS Multi Column Layout Module).它主要应用在文本的多列布局方面 ...