sql注入与sql预处理

2020-03-28  本文已影响0人  凉风拂面秋挽月

sql注入

什么是SQL注入

sql注入是指用户通过传递一些非法参数导致sql语句未按预想效果执行,从而导致用户能操纵不对用户开放的数据库,从而获得隐私信息。
这种情况一般是由于sql语句做字符串拼接参数执行的。

Connection conn=null;
//createStatement会导致sql注入,因为它采用拼接sql语句的方式获得参数
Statement createStatement=null;
        try {
            //加载驱动类
            Class.forName("com.mysql.jdbc.Driver");     conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/testjdbc", "root", "112358"); 
        createStatement = conn.createStatement();               
            String id="5 or 1=1";
            //拼接会引起sql语句出错,sql注入
            String sql="delete from t_user where id="+id;
            createStatement.execute(sql);//执行sql语句
        } catch (ClassNotFoundException e) {            
            e.printStackTrace();
        }

该条sql语句由于后面加入了1=1,导致整个数据库数据的删除。

具体场景

image.png
image.png

sql注入就是本来我只有我能操作数据库,本来只是让你输入内容就走,而你却输入命令,从而在我不知情下操作数据库。

sql预处理

createStatement会导致sql注入,而prepareStatement使用带占位符的sql语句,可以避免sql注入。

 String sql="insert into t_user(username,pwd,regTime) values(?,?,?)";
 PreparedStatement ps = conn.prepareStatement(sql);//预编译
ps.setString(2, "123456",new Date());

这样采取预编译的方式,输入的参数被当成字符串参数而不是当成一个sql语句,如果输入的是1=1,也只会不执行,因为数据库查不到一个id为1=1的数据。

上一篇 下一篇

猜你喜欢

热点阅读