跨站脚本 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).但是一直都没有深入研究过 ...
随机推荐
- hibernate学习(2)——api详解对象
1 Configuration 配置对象 /详解Configuration对象 public class Configuration_test { @Test //Configuration 用户 ...
- Mac配置
1.显示Mac隐藏文件的命令: defaults write com.apple.finder AppleShowAllFiles -bool true 2.Mac键盘如何开启键盘上F1 - F12功 ...
- LeetCode House Robber
原题链接在这里:https://leetcode.com/problems/house-robber/ 题目: You are a professional robber planning to ro ...
- Django,数据模型创建之数据库API参考(转载)
一旦 数据模型 创建完毕, 自然会有存取数据的需要.本文档介绍了由 models 衍生而来的数据库抽象API,及如何创建,得到及更新对象. 贯穿本参考, 我们都会引用下面的民意测验(Poll)应用程序 ...
- CentOS 7 搭建 LNMP
一.安装httpd 1.yum install httpd -y 2.启动服务:systemctl start httpd 3.设置开机启动:systemctl enable 二.安装mariadb ...
- tomcat access log 参数
%a - 客户端IP地址 %A - 本机IP地址 %b - 发送字节数,不含HTTP头 如果为空是 '-' %B - 同上 %h - 客户端机器名 (如果connector的enableLookup ...
- lua2c
lua2c lua2c is a Lua module and utility to convert Lua 5.1 source code to C API code. http://lua-use ...
- 实例演示使用RDIFramework.NET 框架的工作流组件进行业务流程的定义—请假申请流程-Web
实例演示使用RDIFramework.NET 框架的工作流组件 进行业务流程的定义—请假申请流程-Web 参考文章: RDIFramework.NET — 基于.NET的快速信息化系统开发框架 — 系 ...
- 三维高斯模型 opencv实现
OnProbabilityModel() { int i; for(int x=0;x<workImg->height;x++) { for(int y=0;y<workImg-&g ...
- 【NFC】Android NFC API Reference中英文
0 Near Field Communication Near Field Communication (NFC) is a set of short-range wireless technol ...