JSP使用过滤器防止SQL注入的简单实现,jsp过滤器sql注入分享


什么是SQL注入攻击?引用百度百科的解释:

sql注入_百度百科:

所谓SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。具体来说,它是利用现有应用程序,将(恶意)的SQL命令注入到后台数据库引擎执行的能力,它可以通过在Web表单中输入(恶意)SQL语句得到一个存在安全漏洞的网站上的数据库,而不是按照设计者意图去执行SQL语句。[1]  比如先前的很多影视网站泄露VIP会员密码大多就是通过WEB表单递交查询字符暴出的,这类表单特别容易受到SQL注入式攻击.

SQL注入攻击指的是通过构建特殊的输入作为参数传入Web应用程序,而这些输入大都是SQL语法里的一些组合,通过执行SQL语句进而执行攻击者所要的操作,其主要原因是程序没有细致地过滤用户输入的数据,致使非法数据侵入系统。

filter功能:

它使用户可以改变一个 request和修改一个response. Filter 不是一个servlet,它不能产生一个response,它能够

在一个request到达servlet之前预处理request,也可以在离开 servlet时处理response.

换种说法,filter其实是一个”servlet chaining”(servlet 链). 所以用户发出的任何request都必然经过filter处理,我们就在filter处理用户request包含的敏感关键字,然后replace掉或是让页面转到错误页来提示用户,这样就可以很好的防sql注入了。

具体实现代码:

/YourProject/src/com/SqlFilter.java

 package com; import java.io.IOException;  import java.util.Enumeration;  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;  import javax.servlet.http.HttpServletResponse;    //过滤sql关键字的Filter  public class SqlFilter implements Filter {      public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {        HttpServletRequest req = (HttpServletRequest) request;      HttpServletResponse res = (HttpServletResponse) response;      //获得所有请求参数名      Enumeration params = req.getParameterNames();        String sql = "";      while (params.hasMoreElements()) {        //得到参数名        String name = params.nextElement().toString();        //System.out.println("name===========================" + name + "--");        //得到参数对应值        String[] value = req.getParameterValues(name);        for (int i = 0; i < value.length; i++) {          sql = sql + value[i];        }      }      System.out.println("被匹配字符串:"+sql);      if (sqlValidate(sql)) {        res.sendRedirect("error.jsp");       } else {        chain.doFilter(req, res);      }    }      //校验   protected static boolean sqlValidate(String str) {      str = str.toLowerCase();//统一转为小写     //String badStr = "and|exec";     String badStr = "'|and|exec|execute|insert|select|delete|update|count|drop|chr|mid|master|truncate|char|declare|sitename|net user|xp_cmdshell|or|like";      /*String badStr = "'|and|exec|execute|insert|create|drop|table|from|grant|use|group_concat|column_name|" +          "information_schema.columns|table_schema|union|where|select|delete|update|order|by|count|*|" +          "chr|mid|master|truncate|char|declare|or|;|-|--|+|,|like|//|/|%|#";  */  //过滤掉的sql关键字,可以手动添加      String[] badStrs = badStr.split("\|");      for (int i = 0; i < badStrs.length; i++) {       if (str.indexOf(badStrs[i]) !=-1) {          System.out.println("匹配到:"+badStrs[i]);         return true;        }      }      return false;    }      public void init(FilterConfig filterConfig) throws ServletException {      //throw new UnsupportedOperationException("Not supported yet.");    }      public void destroy() {      //throw new UnsupportedOperationException("Not supported yet.");    }  }

注意上面第50行 如果用“|”作为分隔的话,必须是如下写法:String.split(“\|”),这样才能正确的分隔开,不能用String.split(“|”);

/YourProject/WebContent/WEB-INF/web.xml(在web.xml中过滤器添加过滤器配置):

 <!-- sql Filter -->    <filter>     <filter-name>SqlFilter</filter-name>     <filter-class>com.SqlFilter</filter-class>   </filter>   <filter-mapping>     <filter-name>SqlFilter</filter-name>     <url-pattern>/*</url-pattern>   </filter-mapping>

/YourProject/WebContent/error.jsp(检测到sql关键词跳转到的页面):

—-想了解更多的jsp相关干货教程关注<计算机技术网(www.ctvol.com)!!>

 <%@ page language="java" contentType="text/html; charset=utf-8"   pageEncoding="utf-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "

本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

ctvol管理联系方式QQ:251552304

本文章地址:https://www.ctvol.com/jspttutorial/111943.html

(0)
上一篇 2020年5月8日
下一篇 2020年5月8日

精彩推荐