文章目录
1、第一个#{}
解释:
- 使用#{}格式的语法在mybatis中使用preparement语句来安全的设置值
PreparedStatement ps = conn.prepareStatement(sql);
ps.setInt(1,id);
举列子:
- 执行sql语句:
select * from user where name = #{username}
- 参数:username :xiaowang
- 解析后执行的sql语句:
select * from user where name = ?
#方式能够很大程度上防止sql注入
2、第二个${}
解释
- 有时你只想直接在SQL中插入一个不改变的字符串,$将传入的数据直接显示生成在sql中
Statament st =conn.createStatement();
ResultSet rs = st.executeSuery(sql);
举列子:
执行sql语句:select * from user where name = ${username}
参数:username= xiaoming
解析后执行的SQL语句:select * from user where name = xiaoming
sql注入的实际例子
select id from users where username = '"+username +"' and password = '"
这里的username和password从前台获取,假如未对传入的数据进行验证,用户输入的是or 1= 1
,执行的sql变成select id from users where username = '' or 1=1-- and password = '随便输入'
,由于1=1 是正确的,则直接不执行后边的验证。就离谱
3、区别
#方式能够很大程度防止sql注入,$无法防止sql注入
- $方式一般用于传入数据库对象
- 使用$要么不允许用户输入这些字段,要么进行转义并检验
- 能用#就不用$