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,导致整个数据库数据的删除。
具体场景
![](https://img.haomeiwen.com/i18628873/7fcb08db4343b4a3.png)
![](https://img.haomeiwen.com/i18628873/698d7390543e64e3.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的数据。
网友评论