[转帖]Java防止SQL注入的几个途径_Android, Python及开发编程讨论区_Weblogic技术|Tuxedo技术|中间件技术|Oracle论坛|JAVA论坛|Linux/Unix技术|hadoop论坛_联动北方技术论坛  
网站首页 | 关于我们 | 服务中心 | 经验交流 | 公司荣誉 | 成功案例 | 合作伙伴 | 联系我们 |
联动北方-国内领先的云技术服务提供商
»  游客             当前位置:  论坛首页 »  自由讨论区 »  Android, Python及开发编程讨论区 »
总帖数
1
每页帖数
101/1页1
返回列表
0
发起投票  发起投票 发新帖子
查看: 3025 | 回复: 0   主题: [转帖]Java防止SQL注入的几个途径        下一篇 
    本主题由 koei 于 2014-5-2 16:21:43 移动
happy
注册用户
等级:上尉
经验:681
发帖:38
精华:0
注册:2013-4-22
状态:离线
发送短消息息给happy 加好友    发送短消息息给happy 发消息
发表于: IP:您无权察看 2013-4-27 15:47:35 | [全部帖] [楼主帖] 楼主

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

  1. import java.io.IOException; 
  2. import java.util.Iterator; 
  3. import javax.servlet.Filter; 
  4. import javax.servlet.FilterChain; 
  5. import javax.servlet.FilterConfig; 
  6. import javax.servlet.ServletException; 
  7. import javax.servlet.ServletRequest; 
  8. import javax.servlet.ServletResponse; 
  9. import javax.servlet.http.HttpServletRequest; 
  10. import javax.servlet.http.HttpServletResponse; 
  11. /** 
  12. * 通过Filter过滤器来防SQL注入攻击 
  13. */ 
  14. public class SQLFilter implements Filter { 
  15.       private String inj_str = |and|exec|insert|select|delete|update|count|*|%|chr|mid|master|truncate|char|declare|; |or|-|+|,; 
  16.       protected FilterConfig filterConfig = null; 
  17.       /** 
  18.       * Should a character encoding specified by the client be ignored? 
  19.       */ 
  20.       protected boolean ignore = true; 
  21.       public void init(FilterConfig config) throws ServletException { 
  22.             this.filterConfig = config; 
  23.             this.inj_str = filterConfig.getInitParameter(keywords); 
  24.       } 
  25.       public void doFilter(ServletRequest request, ServletResponse response, 
  26.       FilterChain chain) throws IOException, ServletException { 
  27.             HttpServletRequest req = (HttpServletRequest)request; 
  28.             HttpServletResponse res = (HttpServletResponse)response; 
  29.             Iterator values = req.getParameterMap().values().iterator();//获取所有的表单参数 
  30.             while(values.hasNext()){ 
  31.                   String[] value = (String[])values.next(); 
  32.                   for(int i = 0;i < value.length;i++){ 
  33.                         if(sql_inj(value[i])){ 
  34.                               //TODO这里发现sql注入代码的业务逻辑代码 
  35.                               return; 
  36.                         } 
  37.                   } 
  38.             } 
  39.             chain.doFilter(request, response); 
  40.       } 
  41.       public boolean sql_inj(String str) 
  42.       { 
  43.             String[] inj_stra=inj_str.split(\\|); 
  44.             for (int i=0 ; i < inj_stra.length ; i++ ) 
  45.             { 
  46.                   if (str.indexOf( +inj_stra[i]+ )>=0) 
  47.                   { 
  48.                         return true; 
  49.                   } 
  50.             } 
  51.             return false; 
  52.       } 


也可以单独在需要防范SQL注入的JavaBean的字段上过滤:

  1. /** 
  2. * 防止sql注入 
  3. * @param sql 
  4. * @return 
  5. */ 
  6. public static String TransactSQLInjection(String sql) { 
  7.       return sql.replaceAll(.*([;]+|(--)+).*, ); 


该贴由koei转至本版2014-5-2 16:21:43



赞(0)    操作        顶端 
总帖数
1
每页帖数
101/1页1
返回列表
发新帖子
请输入验证码: 点击刷新验证码
您需要登录后才可以回帖 登录 | 注册
技术讨论