什么是SQL注入?:
SQL注入是一种常见的安全漏洞,它利用用户输入的数据未经过充分验证或过滤,直接拼接到SQL查询语句中,从而改变原始的查询意图,或者执行恶意的SQL语句。
- 攻击者可以通过SQL注入攻击来获取敏感数据、修改数据库内容、执行任意操作或者绕过认证等。SQL注入是一种非常危险的漏洞,需要开发人员在编写SQL查询语句时进行输入验证和参数化处理,以防止此类攻击。
- 总的来说,sql注入就是开发者在开发中写SQL中出现的BUG,客户端可以通过传入更改sql语句本来的结构和意义的参数,来避开sql验证。
如何避免SQL注入?
1、检查客户端传入的参数是否会更改sql语句本身的结构和意义
2、在写sql语句的时候就避开sql语句被更改的可能
3、不要将用户输入拼接到sql语句中
PreparedStatement避免sql注入的原理:
preparedStatement通过预编译SQL语句的方式来避免SQL注入。
预编译SQL语句:
预编译是指,在执行sql语句之前,数据库服务前先将sql语句进行编译,确定sql语句的基本“结构”,放在缓存区,当正真执行sql语句时,直接从缓存区中去拿取,而不会进行再次编译。这样,即使在执行sql语句时,发现用户传入的参数中带哟sql关键字,也不会被识别编译,只会被当成参数替换占位符,拼接在sql语句中,这样就很好的避免的sql注入。
具体实现的代码如下:
//使用占位符表示这些位置有参数
String sql = "INSERT INTO userino (username,password,nickname,age)VALUES(?,?,?,?)";
//预编译sql语句,确定sql的结构
PreparedStatement ps = connection.prepareStatement(sql);
//将用户传入的参数替换占位符
ps.setString(1, user.getUsername());
ps.setString(2, user.getPassword());
ps.setString(3, user.getNickName());
ps.setInt(4, user.getAge());
//最后执行 完整的sql语句
int i = ps.executeUpdate();