文章目录

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注入

  • $方式一般用于传入数据库对象
  • 使用$要么不允许用户输入这些字段,要么进行转义并检验
  • 能用#就不用$