mybatis #$区别 【vaynexiao】

引出问题:sql注入怎么发生的
    原来的sql:SELECT * FROM user WHERE username LIKE ‘%${value}%’
    java传的参数:List list=userMapper.findUserByName("’ or ‘1’='1");
    实际的sql:SELECT * FROM student WHERE stu_name LIKE ‘%’ or ‘1’=‘1%’
    相当于查询全部:SELECT * FROM student

在JDBC中,主要使用的是两种语句,
一种是支持参数化和预编译的PrepareStatement,能够支持原生的Sql,也支持设置占位符的方式,参数化输入的参数,防止Sql注入,
一种是支持原生Sql的Statement,有Sql注入的风险。

• #{value} 这种取值是编译好SQL语句再取值,是安全的;
	在预处理时,会把参数部分用一个占位符 ? 替代,其中 value 表示接受输入参数的名称。
• ${value} 这种是取值以后再去编译SQL语句,是非安全的,
	表示使用拼接字符串,将接受到参数的内容不加任何修饰符拼接在 SQL 中,将引起 SQL 注入问题。

1,#自动加单引号,KaTeX parse error: Expected 'EOF', got '#' at position 63: …ORG_NAME LIKE  #̲{orgname} --使用#…{orgname}%’
–使用$解析为:SELECT * FROM SYS_PUB_ORGANIZATION  WHERE ORG_NAME LIKE 长亮科技

一般能用#就不要使用 使 ,若不得已使用 {xxx}这种形容,需要手工做好过滤工作,来防止sql注入

$方式一般用于传入不需要加双引号的sql片段,比如数据库对象和表名

发布了75 篇原创文章 · 获赞 106 · 访问量 16万+

猜你喜欢

转载自blog.csdn.net/vayne_xiao/article/details/105318414