Java Filter过滤xss注入非法参数的方法
http://blog.csdn.NET/feng_an_qi/article/details/45666813
web.xml:
- <filter>
- <filter-name>XSSFiler</filter-name>
- <filter-class>
- com.paic.mall.web.filter.XssSecurityFilter
- </filter-class>
- </filter>
- <filter-mapping>
- <filter-name>XSSFiler</filter-name>
- <url-pattern>*.jsp</url-pattern>
- </filter-mapping>
- <filter-mapping>
- <filter-name>XSSFiler</filter-name>
- <url-pattern>*.do</url-pattern>
- </filter-mapping>
- <filter-mapping>
- <filter-name>XSSFiler</filter-name>
- <url-pattern>*.screen</url-pattern>
- </filter-mapping>
- <filter-mapping>
- <filter-name>XSSFiler</filter-name>
- <url-pattern>*.shtml</url-pattern>
- </filter-mapping>
- <filter-mapping>
- <filter-name>XSSFiler</filter-name>
- <servlet-name>dispatcher</servlet-name>
- </filter-mapping>
XssSecurityFilter.Java
- public class XssSecurityFilter implements Filter {
- protected final Logger log = Logger.getLogger(this.getClass());
- public void init(FilterConfig config) throws ServletException {
- if(log.isInfoEnabled()){
- log.info("XSSSecurityFilter Initializing ");
- }
- }
- /**
- * 销毁操作
- */
- public void destroy() {
- if(log.isInfoEnabled()){
- log.info("XSSSecurityFilter destroy() end");
- }
- }
- public void doFilter(ServletRequest request, ServletResponse response,
- FilterChain chain) throws IOException, ServletException {
- HttpServletRequest httpRequest = (HttpServletRequest)request;
- XssHttpRequestWrapper xssRequest = new XssHttpRequestWrapper(httpRequest);
- httpRequest = XssSecurityManager.wrapRequest(xssRequest);
- chain.doFilter(xssRequest, response);
- }
- }
XssHttpRequestWrapper.Java
- /**
- * @author
- * @date
- * @describe 主要是对参数进行xss过滤,替换原始的request的getParameter相关功能
- * 线程不安全
- *
- */
- public class XssHttpRequestWrapper extends HttpServletRequestWrapper {
- protected Map parameters;
- /**
- * 封装http请求
- *
- * @param request
- */
- public XssHttpRequestWrapper(HttpServletRequest request) {
- super(request);
- }
- @Override
- public void setCharacterEncoding(String enc)
- throws UnsupportedEncodingException {
- super.setCharacterEncoding(enc);
- //当编码重新设置时,重新加载重新过滤缓存。
- refiltParams();
- }
- void refiltParams(){
- parameters=null;
- }
- @Override
- public String getParameter(String string) {
- String strList[] = getParameterValues(string);
- if (strList != null && strList.length > 0)
- return strList[0];
- else
- return null;
- }
- @Override
- public String[] getParameterValues(String string) {
- if (parameters == null) {
- paramXssFilter();
- }
- return (String[]) parameters.get(string);
- }
- @Override
- public Map getParameterMap() {
- if (parameters == null) {
- paramXssFilter();
- }
- return parameters;
- }
- /**
- *
- * 校验参数,若含xss漏洞的字符,进行替换
- */
- private void paramXssFilter() {
- parameters = getRequest().getParameterMap();
- XssSecurityManager.filtRequestParams(parameters, this.getServletPath());
- }
- }
XssSecurityManager.java
- /**
- * @author
- * @date
- * @describe 安全过滤配置管理类,统一替换可能造成XSS漏洞的字符为中文字符
- */
- public class XssSecurityManager {
- private static Logger log = Logger.getLogger(XssSecurityManager.class);
- // 危险的javascript:关键字j av a script
- private final static Pattern[] DANGEROUS_TOKENS = new Pattern[] { Pattern
- .compile("^j\\s*a\\s*v\\s*a\\s*s\\s*c\\s*r\\s*i\\s*p\\s*t\\s*:",
- Pattern.CASE_INSENSITIVE) };
- // javascript:替换字符串(全角中文字符)
- private final static String[] DANGEROUS_TOKEN_REPLACEMENTS = new String[] { "JAVASCRIPT:" };
- // 非法的字符集
- private static final char[] INVALID_CHARS = new char[] { '<', '>', '\'',
- '\"', '\\' };
- // 统一替换可能造成XSS漏洞的字符为全角中文字符
- private static final char[] VALID_CHARS = new char[] { '<', '>', '’', '“',
- '\' };
- // 开启xss过滤功能开关
- public static boolean enable=false;
- // url-patternMap(符合条件的url-param进行xss过滤)<String ArrayList>
- public static Map urlPatternMap = new HashMap();
- private static HashSet excludeUris=new HashSet();
- private XssSecurityManager() {
- // 不可被实例化
- }
- static {
- init();
- }
- private static void init() {
- try {
- String xssConfig = "/xss_security_config.xml";
- if(log.isDebugEnabled()){
- log.debug("XSS config file["+xssConfig+"] init...");
- }
- InputStream is = XssSecurityManager.class
- .getResourceAsStream(xssConfig);
- if (is == null) {
- log.warn("XSS config file["+xssConfig+"] not found.");
- }else{
- // 初始化过滤配置文件
- initConfig(is);
- log.info("XSS config file["+xssConfig+"] init completed.");
- }
- }
- catch (Exception e) {
- log.error("XSS config file init fail:"+e.getMessage(), e);
- }
- }
- private static void initConfig(InputStream is) throws Exception{
- DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();
- DocumentBuilder builder=factory.newDocumentBuilder();
- Element root = builder.parse(is).getDocumentElement();
- //-------------------
- NodeList nl=root.getElementsByTagName("enable");
- Node n=null;
- if(nl!=null && nl.getLength()>0){
- n=((org.w3c.dom.Element)nl.item(0)).getFirstChild();
- }
- if(n!=null){
- enable = new Boolean(n.getNodeValue().trim()).booleanValue();
- }
- log.info("XSS switch="+enable);
- //-------------------------
- nl=root.getElementsByTagName("filter-mapping");
- NodeList urlPatternNodes=null;
- if(nl!=null && nl.getLength()>0){
- Element el=(Element)nl.item(0);
- urlPatternNodes=el.getElementsByTagName("url-pattern");
- //-----------------------------------------------------
- NodeList nl2=el.getElementsByTagName("exclude-url");
- if(nl2!=null && nl2.getLength()>0){
- for(int i=0;i<nl2.getLength();i++){
- Element e=(Element)urlPatternNodes.item(i);
- Node paramNode=e.getFirstChild();
- if(paramNode!=null){
- String paramName=paramNode.getNodeValue().trim();
- if(paramName.length()>0){
- excludeUris.add(paramName.toLowerCase());
- }
- }
- }
- }
- }
- //----------------------
- if(urlPatternNodes!=null && urlPatternNodes.getLength()>0){
- for(int i=0;i<urlPatternNodes.getLength();i++){
- Element e=(Element)urlPatternNodes.item(i);
- String urlPattern=e.getAttribute("value");
- if(urlPattern!=null && (urlPattern=urlPattern.trim()).length()>0){
- List filtParamList = new ArrayList(2);
- if(log.isDebugEnabled()){
- log.debug("Xss filter mapping:"+urlPattern);
- }
- //-------------------------------
- NodeList temp=e.getElementsByTagName("include-param");
- if(temp!=null && temp.getLength()>0){
- for(int m=0;m<temp.getLength();m++){
- Node paramNode=(temp.item(m)).getFirstChild();
- if(paramNode!=null){
- String paramName=paramNode.getNodeValue().trim();
- if(paramName.length()>0){
- filtParamList.add(paramName);
- }
- }
- }
- }
- //一定得将url转换为小写
- urlPatternMap.put(urlPattern.toLowerCase(), filtParamList);
- }
- }
- }
- //----------------------
- }
- public static HttpServletRequest wrapRequest(HttpServletRequest httpRequest){
- if(httpRequest instanceof XssHttpRequestWrapper){
- // log.info("httpRequest instanceof XssHttpRequestWrapper");
- //include/forword指令会重新进入此Filter
- XssHttpRequestWrapper temp=(XssHttpRequestWrapper)httpRequest;
- //include指令会增加参数,这里需要清理掉缓存
- temp.refiltParams();
- return temp;
- }else{
- // log.info("httpRequest is not instanceof XssHttpRequestWrapper");
- return httpRequest;
- }
- }
- public static List getFiltParamNames(String url){
- //获取需要xss过滤的参数
- url = url.toLowerCase();
- List paramNameList = (ArrayList) urlPatternMap.get(url);
- if(paramNameList==null || paramNameList.size()==0){
- return null;
- }
- return paramNameList;
- }
- public static void filtRequestParams(Map params,String servletPath){
- long t1=System.currentTimeMillis();
- //得到需要过滤的参数名列表,如果列表是空的,则表示过滤所有参数
- List filtParamNames=XssSecurityManager.getFiltParamNames(servletPath);
- filtRequestParams(params, filtParamNames);
- }
- public static void filtRequestParams(Map params,List filtParamNames){
- // 获取当前参数集
- Set parameterNames = params.keySet();
- Iterator it = parameterNames.iterator();
- //得到需要过滤的参数名列表,如果列表是空的,则表示过滤所有参数
- while (it.hasNext()) {
- String paramName = (String) it.next();
- if(filtParamNames==null || filtParamNames.contains(paramName) ){
- String[] values = (String[])params.get(paramName);
- proceedXss(values);
- }
- }
- }
- /**
- * 对参数进行防止xss漏洞处理
- *
- * @param value
- * @return
- */
- private static void proceedXss(String[] values) {
- for (int i = 0; i < values.length; ++i) {
- String value = values[i];
- if (!isNullStr(value)) {
- values[i] = replaceSpecialChars(values[i]);
- }
- }
- }
- /**
- * 替换非法字符以及危险关键字
- *
- * @param str
- * @return
- */
- private static String replaceSpecialChars(String str) {
- for (int j = 0; j < INVALID_CHARS.length; ++j) {
- if (str.indexOf(INVALID_CHARS[j]) >= 0) {
- str = str.replace(INVALID_CHARS[j], VALID_CHARS[j]);
- }
- }
- str=str.trim();
- for (int i = 0; i < DANGEROUS_TOKENS.length; ++i) {
- str = DANGEROUS_TOKENS[i].matcher(str).replaceAll(
- DANGEROUS_TOKEN_REPLACEMENTS[i]);
- }
- return str;
- }
- /**
- * 判断是否为空串,建议放到某个工具类中
- *
- * @param value
- * @return
- */
- private static boolean isNullStr(String value) {
- return value == null || value.trim().length()==0;
- }
- public static void main(String args[]) throws Exception{
- Map datas=new HashMap();
- String paramName="test";
- datas.put(paramName,new String[]{ "Javascript:<script>alert('yes');</script>"});
- filtRequestParams(datas,"/test/sample.do");
- System.out.println(((String[])datas.get(paramName))[0]);
- }
- }
Java Filter过滤xss注入非法参数的方法的更多相关文章
- [改善Java代码]避免带有变长参数的方法重载
建议4: 避免带有变长参数的方法重载 在项目和系统的开发中,为了提高方法的灵活度和可复用性,我们经常要传递不确定数量的参数到方法中,在Java 5之前常用的设计技巧就是把形参定义成Collection ...
- Java Filter防止sql注入攻击
原理,过滤所有请求中含有非法的字符,例如:, & < select delete 等关键字,黑客可以利用这些字符进行注入攻击,原理是后台实现使用拼接字符串,案例:某个网站的登入验证的SQ ...
- Java正则表达式过滤并消除非法字符
package sd; import java.util.regex.Matcher; import java.util.regex.Pattern; /** * * @author 大汉 * */ ...
- 简单的xss注入和防御
什么是xss注入: xss通常就是通过巧妙的方法注入指令到指定页面,使用户加载执行的恶意的js(或者其他类型)的代码,攻击者会获取用户的一系列信息,如cookie等,从而进行其他用户信息的盗取 为什么 ...
- 网站mysql防止sql注入攻击 3种方法总结
mysql数据库一直以来都遭受到sql注入攻击的影响,很多网站,包括目前的PC端以及手机端都在使用php+mysql数据库这种架构,大多数网站受到的攻击都是与sql注入攻击有关,那么mysql数据库如 ...
- 防止常见XSS 过滤 SQL注入 JAVA过滤器filter
XSS : 跨站脚本攻击(Cross Site Scripting),为不和层叠样式表(Cascading Style Sheets, CSS)的缩写混淆,故将跨站脚本攻击缩写为XSS.恶意攻击者往W ...
- ASP.NET MVC 5使用Filter过滤Action参数防止sql注入,让你代码安全简洁
在开发程序的过程中,稍微不注意就会隐含有sql注入的危险.今天我就来说下,ASP.NET mvc 5使用Filter过滤Action参数防止sql注入,让你代码安全简洁.不用每下地方对参数的值都进行检 ...
- AOP实践—ASP.NET MVC5 使用Filter过滤Action参数防止sql注入,让你代码安全简洁
在开发程序的过程中,稍微不注意就会隐含有sql注入的危险.今天我就来说下,ASP.NET mvc 5使用Filter过滤Action参数防止sql注入,让你代码安全简洁.不用每下地方对参数的值都进行检 ...
- Spring Filter过滤表单中的非法字符
使用Spring Filter过滤表单中的非法字符 1 package test.filter; 2 3 import java.io.IOException; 4 import java.util. ...
随机推荐
- atitit.集合的filt操作细分 filter总结
atitit.集合的filt操作细分 filter总结 1. Css sltr 1 2. 基本选择器(根据id,class,元素名) 2 3. 层次选择器 3 4. 过滤选择器 3 5. First, ...
- 用EA生成实体层代码
在个人版机房重构中.实体层的代码敲得有点儿烦了.不同的实体仅仅是命名不同.代码结构全然一样.遇到反复的事情,就该动动脑.想想办法了. 以下给大家介绍使用EA生成实体层的代码. 首先.建一个类,注意选择 ...
- 一款基于jQuery的图片左右滑动焦点图
今天给大家分享一款基于jQuery的焦点图插件,这款jQuery焦点图插件的特点是可以多张图片左右滑动切换,可以点击切换按钮进行图片滑动,同时也支持图片自动切换.另外,这款jQuery焦点图是宽屏的, ...
- love2d教程32--碎图打包器texturepacker
texturepacker是一个碎图打包器,可以把小图合并成一张大图,并对大图做优化.我用的是特别版(只好用xx版了, 不然导出的图片会被变成红色),网盘下载,文件会提示有毒,我也是在网上找的,其实是 ...
- poj3067 Japan(树状数组)
转载请注明出处:http://blog.csdn.net/u012860063 题目链接:id=3067">http://poj.org/problem? id=3067 Descri ...
- kernel 4.4.12 移植 HUAWEI MU609 Mini PCIe Module
首先请参考 http://www.cnblogs.com/chenfulin5/p/6951290.html 上一章刚讲了 kernel 3.2.0 移植 MU609 这一章记录新版kernel 的移 ...
- 1.重学javascript (一)
一.script标签解析 <script>xxx</script>这组标签,是用于在html 页面中插入js的主要方法.它主要有以下 几个属性: 1.charset:可选.表示 ...
- 一、thinkphp
# ThinkPHP核心文件介绍 ├─ThinkPHP.php 框架入口文件 ├─Common 框架公共文件 ├─Conf 框架配置文件 ├─Extend 框架扩展目录 ├─Lang 核心语言包目录 ...
- sql循环插入测试数据
declare @i int set @i=1while @i<61 begin insert into T_RolePower values(1,@i,1)set @i=@i+1 end
- 超简单CSS3实现圆角、阴影、透明效果
CSS实现圆角,阴影,透明的方法很多,传统的方法都比较复杂,用CSS3就方便很多了,虽然现在各浏览器对CSS3的支持还不是很好,但不久的将来CSS3就会普及. 1.圆角 CSS3实现圆角有两种方法. ...