共计 1353 个字符,预计需要花费 4 分钟才能阅读完成。
自动写代码机器人,免费开通
丸趣 TV 小编给大家分享一下 SQL 注入指的是什么,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!
SQL 注入 1. 什么是 SQL 注入
看一下下面的案例场景,这是正常情况下的登陆场景:
而当我们使用 用户名‘:– 的时候,密码随便输入也可以登陆成功↓
这时候对比两条 sql 就能发现,其实用户通过在用户名写入的 sql 符号将内部 sql 提前结束,并且将后半句检索条件注释起来达到免密码登陆效果。
sql 注入就是本来我只有我能操作数据库,本来只是让你输入内容就走,而你却输入命令,从而在我不知情下操作数据库
2. 漏洞的修复
会产生上门面的情况是因为上面的 sql 是使用动态拼接的方式,所以 sql 传入的方式可能改变 sql 的语义。
动态拼接就是在 java 中 java 变量和 sql 语句混合使用:select * from user where userName=’”+userName+”’and password =‘”+password”’
所以要使用 preparedStatement 的参数化 sql,通过先确定语义,再传入参数,就不会因为传入的参数改变 sql 的语义。(通过 setInt,setString,setBoolean 传入参数)
3. 参数化 sql 使用案例
// 建立数据连接
conn=ds.getConnection();
//1. 设置 prepareStatement 带占位符的 sql 语句
PreparedStatement ptmt = conn.prepareStatement( select * from user where userName = ? and password = ?
ptmt.setString(1, 张三 //2. 设置参数
ptmt.setString(2, 123456
rs=ptmt.executeQuery();
while(rs.next()){
System.out.println( 登陆成功
return;
}
System.out.println(登陆失败
参数化特点:
1. 设置 preparedStatement 带占位符的 sql 语句
statement 执行 sql 语句的方式:
stmt=conn.createStatement();
rs=stmt.executeQuery(select userName from user
2. 设置参数
PerparedStatement 继承于 Statement,这里主要使用的使他参数化 sql 的特性。
转:https://blog.csdn.net/qq_30258957/article/details/78145885
加:1. 都是用来执行 SQL 的 PreparedStatement extends Statement;
2.Statement 适合执行静态 (无条件)SQL PreparedStatement 适合执行动态 (有条件)SQL;
3.PreparedStatement 可以避免注入攻击;
以上是“SQL 注入指的是什么”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注丸趣 TV 行业资讯频道!
向 AI 问一下细节