java防SQL注入,最简单的办法是杜绝SQL拼接,SQL注入攻击能得逞是因为在原有SQL语句中加入了新的逻辑,如果使用PreparedStatement来代替Statement来执行SQL语句,其后只是输入参数,SQL注入攻击手段将无效,这是因为PreparedStatement不允许在不同的插入时间改变查询的逻辑结构 ,大部分的SQL注入已经挡住了, 在WEB层我们可以过滤用户的输入来防止SQL注入比如用Filter来过滤全局的表单参数

01 import java.io.IOException

02 import java.util.Iterator

03 import javax.servlet.Filter

04 import javax.servlet.FilterChain

05 import javax.servlet.FilterConfig

06 import javax.servlet.ServletException

07 import javax.servlet.ServletRequest

08 import javax.servlet.ServletResponse

09 import javax.servlet.http.HttpServletRequest

10 import javax.servlet.http.HttpServletResponse

11 /**

12 * 通过Filter过滤器来防SQL注入攻击

13 *

14 */

15 public class SQLFilter implements Filter {

16 private String inj_str = "|and|exec|insert|select|delete|update|count|*|%

|chr|mid|master|truncate|char|declare||or|-|+|,"

17 protected FilterConfig filterConfig = null

18 /**

19 * Should a character encoding specified by the client be ignored?

20 */

21 protected boolean ignore = true

22 public void init(FilterConfig config) throws ServletException {

23 this.filterConfig = config

24 this.inj_str = filterConfig.getInitParameter("keywords")

25 }

26 public void doFilter(ServletRequest request, ServletResponse response,

27 FilterChain chain) throws IOException, ServletException {

28 HttpServletRequest req = (HttpServletRequest)request

29 HttpServletResponse res = (HttpServletResponse)response

30 Iterator values = req.getParameterMap().values().iterator()//获取所有的表单参数

31 while(values.hasNext()){

32 String[] value = (String[])values.next()

33 for(int i = 0i < value.lengthi++){

34 if(sql_inj(value[i])){

35 //TODO这里发现sql注入代码的业务逻辑代码

36 return

37 }

38 }

39 }

40 chain.doFilter(request, response)

41 }

42 public boolean sql_inj(String str)

43 {

44 String[] inj_stra=inj_str.split("\|")

45 for (int i=0 i < inj_stra.length i++ )

46 {

47 if (str.indexOf(" "+inj_stra[i]+" ")>=0)

48 {

学习资源

百度搜索圈T社区(www.aiquanti.com) 免费视频教程