#{}, ${} 的区别,谨防 SQL 注入

#{}, ${} 的区别?

  • #{} 在 Mybatis 中就是 占位符 ? , 无论我们传递任何数据,都会 只会被 当成 来处理

  • $ {} 是简单的 字符串 替换,因为是 替换,所以 ${param} 传递的参数会被当做 sql 中的一部分。

    其与原 SQL 语句只是 sql 语句拼接形式 的组合,那么 ${} 传递的值中如果有 其他sql 语句,也会被执行。这也就是黑客实现 Sql 注入 的机会所在。

对照示例:

${param} 传递的参数会被当成 sql 语句中的一部分,即使有一段完整的 SQL 语句他也会被执行。
    
以传入值为 id 为例,对照样本如下:
 
${param} 就是简单的 替换
	 
	select * from table where name = ${param}
	解析成的 sql 为:
	select * from table where name = id
 
        
#{parm} 传入的数据都当成一个字符串,会对自动传入的数据加一个双引号
 
	select * from table where name = #{param}
 	解析成的sql为:
	select * from table where name = "id"
 
为了安全,能用 # 就用 # 方式传参,有效的防止 sql 注入攻击。

对于这个题目我感觉要抓住两点:
(1)$ 一般就作 占位符。既然是占位符,那就是被用来替换的。知道了这点就能很容易区分 $# ,也就不容易记错了。
(2)预编译的机制。 预编译是对 SQL 语句进行预编译,而其后注入的参数将不会再进行 SQL 编译。

​ 我们知道,SQL 注入是发生在编译的过程中,因为恶意注入了某些特殊字符,最后被编译成了恶意的执行操作。而预编译机制则可以很好的防止 SQL 注入。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值