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

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. */ 
  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 = 0;i < value.length;i++){  
  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.  {  
  49.  return true;  
  50.  }  
  51.  }  
  52.  return false;  
  53.  }  

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

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




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