防止sql注入

2018-12-05  本文已影响0人  你若撒野_今生我把酒奉陪

什么是sql注入:

    原文地址:https://blog.csdn.net/u014590757/article/details/79637015


防止sql注入:

1,第一种采用预编译语句集,它内置了处理SQL注入的能力,只要使用它的setString方法传值即可:

        String sql= "select * from users where username=? and password=?;

        PreparedStatement preState = conn.prepareStatement(sql);

        preState.setString(1, userName);

        preState.setString(2, password);

        ResultSet rs = preState.executeQuery();

        ...

    2,第二种是采用正则表达式将包含有 单引号('),分号(;) 和 注释符号(--)的语句给替换掉来防止SQL注入

        public static String TransactSQLInjection(String str)

        {

              return str.replaceAll(".*([';]+|(--)+).*", " ");

        }

        userName=TransactSQLInjection(userName);

        password=TransactSQLInjection(password);

        String sql="select * from users where username='"+userName+"' and password='"+password+"' "

        Statement sta = conn.createStatement();

        ResultSet rs = sta.executeQuery(sql);

3,使用Hibernate框架的SQL注入防范Hibernate是目前使用最多的ORM框架,在JavaWeb开发中,很多时候不直接使用JDBC,而使用Hibernate来提高开发效率。在Hibernate中,仍然不应该通过拼接HQL的方式,而应使用参数化的方式来防范SQL注入。有两种方式, 一种仍然是使用JDBC一样的占位符“?”,但更好的方式是使用Hibernate的命名参数,例如检测用户名和密码是否正确,使用Hibernate可以写成:

    String queryStr = “from user where username=:username ”+”password=:password”;

    List result = session.createQuery(queryStr).setString("username",

            username).setString("password", password).list();

    4,字符串过滤

        比较通用的一个方法:(||之间的参数可以根据自己程序的需要添加)

        public static boolean sql_inj(String str){

            String inj_str = "'|and|exec|insert|select|delete|update|           

            count|*|%|chr|mid|master|truncate|char|declare|;|or|-|+|,";

            String inj_stra[] = split(inj_str,"|");

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

            if (str.indexOf(inj_stra[i])>=0){

            return true;

            }           

        }         

            return false;         

    }

    5,JSP页面判断代码

        使用javascript在客户端进行不安全字符屏蔽

        功能介绍:检查是否含有”‘”,”\\”,”/”

        参数说明:要检查的字符串

        返回值:0:是1:不是

        函数名是

        function check(a){

            return 1;       

            fibdn = new Array (”‘” ,”\\”,”/”);       

            i=fibdn.length; 

            j=a.length;   

            for (ii=0; ii<i; ii++)

            { for (jj=0; jj<j; jj++)

            { temp1=a.charAt(jj);

            temp2=fibdn[ii];

            if (tem'; p1==temp2)

            { return 0; }

            }

           }

            return 1;

            }

    在编写MyBatis的映射语句时,尽量采用#{xxx}这样的格式。若不得不使用${xxx}这样的参数,要手工地做好过滤工作,来防止SQL注入攻击。

    #{}:相当于JDBC中的PreparedStatement

    ${}:是输出变量的值

    简单说,#{}是经过预编译的,是安全的;${}是未经过预编译的,仅仅是取变量的值,是非安全的,存在SQL注入。

上一篇 下一篇

猜你喜欢

热点阅读