`
duyouhua1214
  • 浏览: 230745 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

java通过包装器防SQL注入

    博客分类:
  • Java
阅读更多

定义包装器对request进行包装,修改其内的getParameter方法,

使getParameter方法具有防SQL注入的功能


一、定义一个防SQL注入的类,目的在于转换一些特殊符号

public class SQLSafe{

    public static String tran(String words){

       if(words!=null){

       if(words.indexOf("%0d%0a")>=0)

       {

           words = words.replace("%0d%0a", "");

       }

       StringBuffer stringbuffer = new StringBuffer();

            int j = words.length();

            for(int i = 0; i < j; i++)

            {

                char c = words.charAt(i);

                switch(c)

                {

                case 60: stringbuffer.append("&lt;"); break;

                case 62: stringbuffer.append("&gt;"); break;

                case 39: stringbuffer.append("&#39;");break;

                case 34: stringbuffer.append("&quot;"); break;

                case 169: stringbuffer.append("&copy;"); break;

                case 174: stringbuffer.append("&reg;"); break;

               case 165: stringbuffer.append("&yen;"); break;

                case 8364: stringbuffer.append("&euro;"); break;

                case 8482: stringbuffer.append("&#153;"); break;

                case 13:

                  if(i < j - 1 && words.charAt(i + 1) == 10)

                  {stringbuffer.append("<br>");

                   i++;

                  }

                  break;

                case 32:

                  if(i < j - 1 && words.charAt(i + 1) == ' ')

                    {

                      stringbuffer.append(" &nbsp;");

                      i++;

                      break;

                    }

                default:

                    stringbuffer.append(c);

                    break;

                }

            }

          return new String(stringbuffer.toString());

       }else{

           return words;

        }

    }
public static String unTran(String words){

       String result = "";

       String strTo ="'";

       int intFromLen = strTo.length();

       int intPos = 0;

       if(words==null||"".equals(words)){

           return words;

       }

       while((intPos=words.indexOf("'"))!=-1){

           result = result + words.substring(0,intPos);

           result = result + strTo;

           words = words.substring(intPos+intFromLen);

           }

           result = result + words;

       return result;

    }

   

    public static boolean checkSql(String words,String[] sqls){

        if(words==null||"".equalsIgnoreCase(words.trim()))

           return false;

       words = words.toLowerCase();

      

       for(String s:sqls){

          

           if(words.indexOf(s)!=-1&&s.length()==1&&s.indexOf("'")==-1)

              return true;

           if(words.indexOf(" "+s+" ")!=-1&&s.length()>1&&s.indexOf("'")==-1)

              return true;

       }

       return false;

    }

}
二、定义一个包装器类


import java.util.*;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletRequestWrapper;


public class ParameterRequestWrapper extends HttpServletRequestWrapper {

    private Map params;

    public ParameterRequestWrapper(HttpServletRequest request) {

    super(request);

    this.params=request.getParameterMap();;

    }

    public Map getParameterMap() {

    return params;

    }

    public Enumeration getParameterNames() {

    Vector l=new Vector(params.keySet());

    return l.elements();

    }

    public String[] getParameterValues(String name) {

    Object v = params.get(name);

    if(v==null){

        return null;

    }else if(v instanceof String[]){

        return (String[]) v;

    }else if(v instanceof String){

        return new String[]{(String) v};

    }else{

        return new String[]{v.toString()};

    }

    }

    public String getParameter(String name) {

    Object v = params.get(name);

    if(v==null){

        return null;

    }else if(v instanceof String[]){          

        String []strArr=(String[]) v;

        if(strArr.length>0){

          return SQLSafe.tran(strArr[0]); //对经过getParameter的返回值进行防SQL注入

        }else{

          return null;

        }

    }else if(v instanceof String){

        return SQLSafe.tran((String) v);

    }else{

        return v.toString();

    }

    }   

}

第三、通过过滤器对request进行包装

ParameterRequestWrapper prw = new ParameterRequestWrapper((HttpServletRequest)request);//定义包装器对request进行包装

FChain.doFilter(prw, response);


这样就实现了对所有的request.getParameter()进行包装,令通过其传入的参数都经过SQLSafe的转码。达到防止直接在页面编辑区输入SQL代码而造成的SQL注入。

分享到:
评论

相关推荐

    java 过滤器filter防sql注入的实现代码

    在Java Web开发中,SQL注入是一种常见的安全威胁,它允许攻击者通过恶意构造的SQL语句来操控数据库。为了防止这种攻击,开发者通常会使用过滤器(Filter)来对用户输入进行预处理,确保输入的数据不会对系统造成危害...

    防xss攻击和sql注入

    3. 限制数据库权限:为应用分配最小必要的数据库访问权限,避免攻击者通过SQL注入获取额外敏感信息。 4. 使用ORM框架:如Hibernate或MyBatis等,它们在底层处理SQL语句时通常会提供一定的防护措施。 在`web中添加...

    java JDBC包装类

    3. SQL执行:封装`Statement`或`PreparedStatement`的创建和执行,支持参数化查询,避免SQL注入风险。 4. 结果集处理:提供方便的方法来获取和处理查询结果,例如`queryForObject()`、`queryForList()`等。 5. 错误...

    SqlServer数据库连接jar包

    同时,遵循最佳实践,如使用预编译的`PreparedStatement`防止SQL注入,以及正确处理异常和关闭资源,以确保代码的健壮性和安全性。 综上所述,"SqlServer数据库连接jar包"提供了连接到SQL Server数据库所需的JDBC...

    SQL封装

    2. **安全性**:通过参数化查询(PreparedStatement)防止SQL注入攻击。在封装的SQL方法中,我们可以使用占位符(问号)来代替直接拼接字符串,避免了恶意用户输入可能导致的SQL语句执行风险。 3. **复用性**:封装...

    复习java基础.pdf

    3. 防止SQL注入:SQL注入是一种常见的安全漏洞,通过使用`PreparedStatement`而非`Statement`,可以预编译SQL语句,有效防止恶意输入导致的注入攻击。`PreparedStatement`允许将参数占位符与实际值分开,从而增强...

    iBATIS-SqlMaps-2_cn.pdf

    在XML描述文件中,SQL Maps定义了Java Bean、Map实现以及基本数据类型的包装类如何与数据库中的表和记录对应。这些映射文件通常包含SQL查询、存储过程以及事务管理等元素,使得开发者无需编写大量JDBC代码就能完成...

    Java经典理论面试100题.pdf

    Java是世界上最流行的编程语言之一,尤其在企业级应用开发领域占据着重要地位。...56. **JDBC中的P**:可能是指PreparedStatement,预编译的SQL语句,能防止SQL注入,提高性能。 这只是部分Java面试中涉及

    java 数据库浏览器

    Statement用于执行静态SQL语句,而PreparedStatement则允许预编译SQL语句,更适用于处理包含参数的查询,能提高性能并防止SQL注入攻击。ResultSet对象则是执行查询后返回的结果集,可以遍历其中的数据行。 在Java...

    物流信息网的设计与实现(JAVA源码+数据库sql+论文+视频)

    2. 容器支持:通过Spring框架,可以实现依赖注入,便于组件间的解耦和管理,提高系统的灵活性。 3. 异步处理:使用JAVA的并发工具类和ExecutorService,能处理大量并发请求,提升系统性能。 4. Web开发:结合Servlet...

    新建 WinZip 文件.zip_Java聊天程序_java 聊天程序_java聊天

    在实际部署聊天程序时,需要考虑安全性,如使用SSL/TLS加密通信、防止SQL注入等。此外,优化也是必要的,比如使用高效的缓存策略,减少不必要的网络传输,以及优化多线程处理等。 总结,这个Java聊天程序项目是一个...

    Java真实项目

    **Hibernate** 是一个对象关系映射(ORM)框架,它简化了数据库操作,通过将Java对象与数据库表之间的映射关系自动化,使得开发人员可以更加专注于业务逻辑,而不是底层的SQL查询。Hibernate支持事务处理、缓存机制...

    java开发手册

    安全方面,手册列举了一些常见的安全风险,如SQL注入、XSS攻击,并给出了预防措施。 总的来说,《阿里Java开发手册》是一份全面而细致的Java编程指南,它将帮助开发者编写更健壮、更高效的代码,提升团队协作效率,...

    java修改请求参数

    例如,限制字符串长度,检查数字范围,防止SQL注入等。 - **使用HTTPS**:加密传输数据,防止中间人攻击,保护请求参数不被篡改。 - **使用CSRF Token**:防止跨站请求伪造,每个表单提交都携带一个随机生成的安全...

    Java库源码

    1. **java.lang**:这是每个Java程序的基础,包含基本类型包装类、字符串类(String)以及运行时异常。 2. **java.io**:提供输入输出流,用于读写文件、网络通信等。 3. **java.util**:包括集合框架(ArrayList、...

    55道Java面试题及答案

    - `PreparedStatement`:预编译SQL语句,避免SQL注入,且执行速度快于`Statement`。 - 数据库连接池:如C3P0、HikariCP等,用于高效管理和复用数据库连接。 - 结果集获取:通过列名而非下标获取结果,确保代码对...

    过滤器过滤用户输入的非法字符

    在网络安全领域,过滤用户输入的非法字符是防止跨站脚本攻击(Cross-Site Scripting,简称XSS)和防止SQL注入等恶意攻击的重要措施。本文将深入探讨标题中的两个关键类:`XssFilter.java` 和 `...

    黑马程序员JAVA面试宝典2018年5月最新版

    此外,还可能深入讲解异常处理、字符串处理、包装类与原始类型的关系,以及Java 8的新特性,如lambda表达式、Stream API等。 其次,面向对象编程是Java的核心,书中可能会详细解释如何进行类的设计,接口的使用,...

    web安全扫描问题疑问 AppScan

    2. **SqlInjection.java** - 这是一个可能包含SQL注入攻击示例或防御策略的Java源代码文件。SQL注入是常见的Web安全问题,攻击者通过输入恶意SQL语句来获取、修改或删除数据库中的数据。开发人员需要对用户输入进行...

    Java 上传文件的源代码

    7. **安全性考虑**: 需要确保上传的文件不会导致安全问题,如SQL注入或执行恶意代码。应验证文件类型,避免上传脚本或可执行文件,限制文件大小,并对文件名进行清理,防止路径遍历攻击。 8. **用户体验优化**: ...

Global site tag (gtag.js) - Google Analytics