Java Filter过滤xss注入非法参数的方法

http://blog.csdn.NET/feng_an_qi/article/details/45666813

Java Filter过滤xss注入非法参数的方法

web.xml:

[html] view plain copy

  1. <filter>
  2. <filter-name>XSSFiler</filter-name>
  3. <filter-class>
  4. com.paic.mall.web.filter.XssSecurityFilter
  5. </filter-class>
  6. </filter>
  7. <filter-mapping>
  8. <filter-name>XSSFiler</filter-name>
  9. <url-pattern>*.jsp</url-pattern>
  10. </filter-mapping>
  11. <filter-mapping>
  12. <filter-name>XSSFiler</filter-name>
  13. <url-pattern>*.do</url-pattern>
  14. </filter-mapping>
  15. <filter-mapping>
  16. <filter-name>XSSFiler</filter-name>
  17. <url-pattern>*.screen</url-pattern>
  18. </filter-mapping>
  19. <filter-mapping>
  20. <filter-name>XSSFiler</filter-name>
  21. <url-pattern>*.shtml</url-pattern>
  22. </filter-mapping>
  23. <filter-mapping>
  24. <filter-name>XSSFiler</filter-name>
  25. <servlet-name>dispatcher</servlet-name>
  26. </filter-mapping>

XssSecurityFilter.Java

[java] view plain copy

  1. public class XssSecurityFilter implements Filter {
  2. protected final Logger log = Logger.getLogger(this.getClass());
  3. public void init(FilterConfig config) throws ServletException {
  4. if(log.isInfoEnabled()){
  5. log.info("XSSSecurityFilter Initializing ");
  6. }
  7. }
  8. /**
  9. * 销毁操作
  10. */
  11. public void destroy() {
  12. if(log.isInfoEnabled()){
  13. log.info("XSSSecurityFilter destroy() end");
  14. }
  15. }
  16. public void doFilter(ServletRequest request, ServletResponse response,
  17. FilterChain chain) throws IOException, ServletException {
  18. HttpServletRequest httpRequest = (HttpServletRequest)request;
  19. XssHttpRequestWrapper xssRequest = new XssHttpRequestWrapper(httpRequest);
  20. httpRequest = XssSecurityManager.wrapRequest(xssRequest);
  21. chain.doFilter(xssRequest, response);
  22. }
  23. }

XssHttpRequestWrapper.Java

[java] view plain copy

  1. /**
  2. * @author
  3. * @date
  4. * @describe 主要是对参数进行xss过滤,替换原始的request的getParameter相关功能
  5. *      线程不安全
  6. *
  7. */
  8. public class XssHttpRequestWrapper extends HttpServletRequestWrapper {
  9. protected Map parameters;
  10. /**
  11. * 封装http请求
  12. *
  13. * @param request
  14. */
  15. public XssHttpRequestWrapper(HttpServletRequest request) {
  16. super(request);
  17. }
  18. @Override
  19. public void setCharacterEncoding(String enc)
  20. throws UnsupportedEncodingException {
  21. super.setCharacterEncoding(enc);
  22. //当编码重新设置时,重新加载重新过滤缓存。
  23. refiltParams();
  24. }
  25. void refiltParams(){
  26. parameters=null;
  27. }
  28. @Override
  29. public String getParameter(String string) {
  30. String strList[] = getParameterValues(string);
  31. if (strList != null && strList.length > 0)
  32. return strList[0];
  33. else
  34. return null;
  35. }
  36. @Override
  37. public String[] getParameterValues(String string) {
  38. if (parameters == null) {
  39. paramXssFilter();
  40. }
  41. return (String[]) parameters.get(string);
  42. }
  43. @Override
  44. public Map getParameterMap() {
  45. if (parameters == null) {
  46. paramXssFilter();
  47. }
  48. return parameters;
  49. }
  50. /**
  51. *
  52. * 校验参数,若含xss漏洞的字符,进行替换
  53. */
  54. private void paramXssFilter() {
  55. parameters = getRequest().getParameterMap();
  56. XssSecurityManager.filtRequestParams(parameters, this.getServletPath());
  57. }
  58. }

XssSecurityManager.java

[java] view plain copy

    1. /**
    2. * @author
    3. * @date
    4. * @describe 安全过滤配置管理类,统一替换可能造成XSS漏洞的字符为中文字符
    5. */
    6. public class XssSecurityManager {
    7. private static Logger log = Logger.getLogger(XssSecurityManager.class);
    8. // 危险的javascript:关键字j av a script
    9. private final static Pattern[] DANGEROUS_TOKENS = new Pattern[] { Pattern
    10. .compile("^j\\s*a\\s*v\\s*a\\s*s\\s*c\\s*r\\s*i\\s*p\\s*t\\s*:",
    11. Pattern.CASE_INSENSITIVE) };
    12. // javascript:替换字符串(全角中文字符)
    13. private final static String[] DANGEROUS_TOKEN_REPLACEMENTS = new String[] { "JAVASCRIPT:" };
    14. // 非法的字符集
    15. private static final char[] INVALID_CHARS = new char[] { ‘<‘, ‘>‘, ‘\‘‘,
    16. ‘\"‘, ‘\\‘ };
    17. // 统一替换可能造成XSS漏洞的字符为全角中文字符
    18. private static final char[] VALID_CHARS = new char[] { ‘<‘, ‘>‘, ‘’‘, ‘“‘,
    19. ‘\‘ };
    20. // 开启xss过滤功能开关
    21. public static boolean enable=false;
    22. // url-patternMap(符合条件的url-param进行xss过滤)<String ArrayList>
    23. public static Map urlPatternMap = new HashMap();
    24. private static HashSet excludeUris=new HashSet();
    25. private XssSecurityManager() {
    26. // 不可被实例化
    27. }
    28. static {
    29. init();
    30. }
    31. private static void init() {
    32. try {
    33. String xssConfig = "/xss_security_config.xml";
    34. if(log.isDebugEnabled()){
    35. log.debug("XSS config file["+xssConfig+"] init...");
    36. }
    37. InputStream is = XssSecurityManager.class
    38. .getResourceAsStream(xssConfig);
    39. if (is == null) {
    40. log.warn("XSS config file["+xssConfig+"] not found.");
    41. }else{
    42. // 初始化过滤配置文件
    43. initConfig(is);
    44. log.info("XSS config file["+xssConfig+"] init completed.");
    45. }
    46. }
    47. catch (Exception e) {
    48. log.error("XSS config file init fail:"+e.getMessage(), e);
    49. }
    50. }
    51. private static void initConfig(InputStream is) throws Exception{
    52. DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();
    53. DocumentBuilder builder=factory.newDocumentBuilder();
    54. Element root = builder.parse(is).getDocumentElement();
    55. //-------------------
    56. NodeList nl=root.getElementsByTagName("enable");
    57. Node n=null;
    58. if(nl!=null && nl.getLength()>0){
    59. n=((org.w3c.dom.Element)nl.item(0)).getFirstChild();
    60. }
    61. if(n!=null){
    62. enable = new Boolean(n.getNodeValue().trim()).booleanValue();
    63. }
    64. log.info("XSS switch="+enable);
    65. //-------------------------
    66. nl=root.getElementsByTagName("filter-mapping");
    67. NodeList urlPatternNodes=null;
    68. if(nl!=null && nl.getLength()>0){
    69. Element  el=(Element)nl.item(0);
    70. urlPatternNodes=el.getElementsByTagName("url-pattern");
    71. //-----------------------------------------------------
    72. NodeList nl2=el.getElementsByTagName("exclude-url");
    73. if(nl2!=null && nl2.getLength()>0){
    74. for(int i=0;i<nl2.getLength();i++){
    75. Element e=(Element)urlPatternNodes.item(i);
    76. Node paramNode=e.getFirstChild();
    77. if(paramNode!=null){
    78. String paramName=paramNode.getNodeValue().trim();
    79. if(paramName.length()>0){
    80. excludeUris.add(paramName.toLowerCase());
    81. }
    82. }
    83. }
    84. }
    85. }
    86. //----------------------
    87. if(urlPatternNodes!=null && urlPatternNodes.getLength()>0){
    88. for(int i=0;i<urlPatternNodes.getLength();i++){
    89. Element e=(Element)urlPatternNodes.item(i);
    90. String urlPattern=e.getAttribute("value");
    91. if(urlPattern!=null && (urlPattern=urlPattern.trim()).length()>0){
    92. List filtParamList = new ArrayList(2);
    93. if(log.isDebugEnabled()){
    94. log.debug("Xss filter mapping:"+urlPattern);
    95. }
    96. //-------------------------------
    97. NodeList temp=e.getElementsByTagName("include-param");
    98. if(temp!=null && temp.getLength()>0){
    99. for(int m=0;m<temp.getLength();m++){
    100. Node paramNode=(temp.item(m)).getFirstChild();
    101. if(paramNode!=null){
    102. String paramName=paramNode.getNodeValue().trim();
    103. if(paramName.length()>0){
    104. filtParamList.add(paramName);
    105. }
    106. }
    107. }
    108. }
    109. //一定得将url转换为小写
    110. urlPatternMap.put(urlPattern.toLowerCase(), filtParamList);
    111. }
    112. }
    113. }
    114. //----------------------
    115. }
    116. public static HttpServletRequest wrapRequest(HttpServletRequest httpRequest){
    117. if(httpRequest instanceof XssHttpRequestWrapper){
    118. //          log.info("httpRequest instanceof XssHttpRequestWrapper");
    119. //include/forword指令会重新进入此Filter
    120. XssHttpRequestWrapper temp=(XssHttpRequestWrapper)httpRequest;
    121. //include指令会增加参数,这里需要清理掉缓存
    122. temp.refiltParams();
    123. return temp;
    124. }else{
    125. //          log.info("httpRequest is not instanceof XssHttpRequestWrapper");
    126. return httpRequest;
    127. }
    128. }
    129. public static List getFiltParamNames(String url){
    130. //获取需要xss过滤的参数
    131. url = url.toLowerCase();
    132. List paramNameList = (ArrayList) urlPatternMap.get(url);
    133. if(paramNameList==null || paramNameList.size()==0){
    134. return null;
    135. }
    136. return paramNameList;
    137. }
    138. public static void filtRequestParams(Map params,String servletPath){
    139. long t1=System.currentTimeMillis();
    140. //得到需要过滤的参数名列表,如果列表是空的,则表示过滤所有参数
    141. List filtParamNames=XssSecurityManager.getFiltParamNames(servletPath);
    142. filtRequestParams(params, filtParamNames);
    143. }
    144. public static void filtRequestParams(Map params,List filtParamNames){
    145. // 获取当前参数集
    146. Set parameterNames = params.keySet();
    147. Iterator it = parameterNames.iterator();
    148. //得到需要过滤的参数名列表,如果列表是空的,则表示过滤所有参数
    149. while (it.hasNext()) {
    150. String paramName = (String) it.next();
    151. if(filtParamNames==null || filtParamNames.contains(paramName) ){
    152. String[] values = (String[])params.get(paramName);
    153. proceedXss(values);
    154. }
    155. }
    156. }
    157. /**
    158. * 对参数进行防止xss漏洞处理
    159. *
    160. * @param value
    161. * @return
    162. */
    163. private static void proceedXss(String[] values) {
    164. for (int i = 0; i < values.length; ++i) {
    165. String value = values[i];
    166. if (!isNullStr(value)) {
    167. values[i] = replaceSpecialChars(values[i]);
    168. }
    169. }
    170. }
    171. /**
    172. * 替换非法字符以及危险关键字
    173. *
    174. * @param str
    175. * @return
    176. */
    177. private static String replaceSpecialChars(String str) {
    178. for (int j = 0; j < INVALID_CHARS.length; ++j) {
    179. if (str.indexOf(INVALID_CHARS[j]) >= 0) {
    180. str = str.replace(INVALID_CHARS[j], VALID_CHARS[j]);
    181. }
    182. }
    183. str=str.trim();
    184. for (int i = 0; i < DANGEROUS_TOKENS.length; ++i) {
    185. str = DANGEROUS_TOKENS[i].matcher(str).replaceAll(
    186. DANGEROUS_TOKEN_REPLACEMENTS[i]);
    187. }
    188. return str;
    189. }
    190. /**
    191. * 判断是否为空串,建议放到某个工具类中
    192. *
    193. * @param value
    194. * @return
    195. */
    196. private static boolean isNullStr(String value) {
    197. return value == null || value.trim().length()==0;
    198. }
    199. public static void main(String args[]) throws Exception{
    200. Map datas=new HashMap();
    201. String paramName="test";
    202. datas.put(paramName,new String[]{ "Javascript:<script>alert(‘yes‘);</script>"});
    203. filtRequestParams(datas,"/test/sample.do");
    204. System.out.println(((String[])datas.get(paramName))[0]);
    205. }
    206. }
时间: 2024-10-12 21:16:54

Java Filter过滤xss注入非法参数的方法的相关文章

Java Filter防止sql注入攻击

原理,过滤所有请求中含有非法的字符,例如:, & < select delete 等关键字,黑客可以利用这些字符进行注入攻击,原理是后台实现使用拼接字符串,案例:某个网站的登入验证的SQL查询代码为 strSQL = "SELECT * FROM users WHERE (name = '" + userName + "') and (pw = '"+ passWord +"');" 恶意填入 userName = "'

java和js中不定项参数调用方法

一.java中 public void test(Object ... args){ for(Object temp:args){ System.out.print(temp); } } 二.js中 用arguments对象 function test(){ for(var i=0;i<=arguments.length;i++){ alert(""+arguments[i]); } }

ASP.NET MVC 5使用Filter过滤Action参数防止sql注入,让你代码安全简洁

在开发程序的过程中,稍微不注意就会隐含有sql注入的危险.今天我就来说下,ASP.NET mvc 5使用Filter过滤Action参数防止sql注入,让你代码安全简洁.不用每下地方对参数的值都进行检查,看是用户输入的内容是否有危险的sql.如果每个地方都要加有几个缺点: 1.工作量大 2.容易遗漏 3.不容易维护 下面我通过写一个过滤防止sql的特性类,对Action执行前对Action的参数进行处理,如果有其值有sql语句,就会这些非法字符替换为空字符串. 一.sql注入的例子: 上面的输入

ASP.NET MVC 5使用Filter过滤Action参数防止sql注入

在开发程序的过程中,稍微不注意就会隐含有sql注入的危险.今天我就来说下,ASP.NET mvc 5使用Filter过滤Action参数防止sql注入,让你代码安全简洁.不用每下地方对参数的值都进行检查,看是用户输入的内容是否有危险的sql.如果每个地方都要加有几个缺点: 1.工作量大 2.容易遗漏 3.不容易维护 下面我通过写一个过滤防止sql的特性类,对Action执行前对Action的参数进行处理,如果有其值有sql语句,就会这些非法字符替换为空字符串. 一.sql注入的例子: 上面的输入

Spring Filter过滤表单中的非法字符

使用Spring Filter过滤表单中的非法字符 1 package test; 2 3 import java.io.IOException; 4 import java.util.Iterator; 5 import java.util.Map; 6 7 import javax.servlet.FilterChain; 8 import javax.servlet.ServletException; 9 import javax.servlet.http.HttpServletReque

JAVA覆写Request过滤XSS跨站脚本攻击

注:本文非本人原著. demo的地址:链接:http://pan.baidu.com/s/1miEmHMo 密码:k5ca 如何过滤Xss跨站脚本攻击,我想,Xss跨站脚本攻击令人为之头疼.为什么呢. 尤其是有富文本编辑器的产品.xss可能出现在http的head,不说别的,新浪多次出现. xss可以出现在post数据的正文.图片的url. 于是各种Xss横行,如今Xss跨站脚本漏洞的流行程度甚至超过了当年的sql. 那么对于JAVA语言,如何防御呢. 笔者分享一个思路:所有的web项目,所有的

web安全之XSS注入

之前在做项目的时候有遇到一些安全问题,XSS注入就是其中之一 那么,什么是XSS注入呢? XSS又叫CSS (Cross Site Script) ,跨站脚本攻击.它指的是恶意攻击者往Web页面里插入恶意脚本代码,而程序对于用户输入内容未过滤,当用户浏览该页之时,嵌入其中Web里面的脚本代码会被执行,从而达到恶意攻击用户的特殊目的. 跨站脚本攻击的危害:窃取cookie.放蠕虫.网站钓鱼 ... 跨站脚本攻击的分类主要有:存储型XSS.反射型XSS.DOM型XSS XSS漏洞是Web应用程序中最

SpringBoot过滤XSS脚本攻击

XSS攻击是什么 XSS攻击全称跨站脚本攻击,是为不和层叠样式表(Cascading Style Sheets, CSS)的缩写混淆,故将跨站脚本攻击缩写为XSS,XSS是一种在web应用中的计算机安全漏洞,它允许恶意web用户将代码植入到提供给其它用户使用的页面中. 简而言之,就是作恶用户通过表单提交一些前端代码,如果不做处理的话,这些前端代码将会在展示的时候被浏览器执行. 如何避免XSS攻击 这里我根据个人经验做一个总结,可能经验也有不足之处.我个人解决XSS攻击是通过后端转译的办法来解决的

【Java编程】JDBC注入攻击-Statement 与 PreparedStatement

在上一篇[Java编程]建立一个简单的JDBC连接-Drivers, Connection, Statement and PreparedStatement我们介绍了如何使用JDBC驱动建立一个简单的连接,并实现使用Statement和PreparedStatement进行数据库查询,本篇blog将接着上篇blog通过SQL注入攻击比较Statement和PreparedStatement.当然这两者还有很多其他方面的不同,在之后的blog中会继续更新. [Statement查询] 1.在DBH