Mybatis中的$和#

#用于预编译,表示参数占位符,例如:#{username}。在SQL语句执行时,Mybatis会将占位符替换为对应的参数值,并将SQL语句发送到数据库执行。使用#占位符可以有效地防止SQL注入攻击,因为Mybatis会将参数值转义后再替换占位符。

$则直接将参数的值替换到SQL语句中,例如:${username}。在SQL语句执行时,Mybatis会将$占位符替换为对应的参数值,并将SQL语句发送到数据库执行。使用$占位符可以在某些情况下提高SQL语句的性能,因为在预编译时不需要处理参数占位符。

使用哪种占位符取决于具体的需求,如果需要防止SQL注入攻击,则应该使用#占位符;如果需要在SQL语句中使用动态参数或者拼接字符串,则应该使用$占位符。

Mybatis使用预编译语句(Prepared Statement)来防止SQL注入攻击。预编译语句是一种将SQL语句和参数分开处理的方法,可以在执行SQL语句之前先将SQL语句预编译成一个执行计划,然后再将参数传入执行计划中执行,从而避免了SQL注入攻击。

预编译语句的工作原理如下:

1. 将SQL语句发送给数据库服务器。
2. 数据库服务器将SQL语句进行预编译,生成一个执行计划。
3. 在执行SQL语句之前,应用程序将参数传递给数据库服务器。
4. 数据库服务器将参数和执行计划结合起来执行SQL语句。

预编译语句将SQL语句和参数分开处理,从而避免了将参数与SQL语句拼接在一起的情况,这样可以有效地防止SQL注入攻击。Mybatis使用的#占位符就是预编译语句的一种体现。

SQL注入攻击的原理是利用了应用程序没有对用户输入进行足够的校验,从而允许攻击者通过在输入中注入恶意的SQL代码,进而破坏数据库的安全性。

例如,一个简单的登录功能可以使用如下的SQL语句:


SELECT * FROM users WHERE username = 'admin' AND password = '123456';

如果应用程序没有对用户输入进行校验,攻击者可以在用户名和密码的输入框中注入恶意的SQL代码,比如输入:

`
username = 'admin' OR '1'='1'
password = '123456' OR '1'='1'
 

攻击者可以将恶意的SQL代码注入到原来的SQL语句中,使其变成如下的形式:


SELECT * FROM users WHERE username = 'admin' OR '1'='1' AND password = '123456' OR '1'='1';
 

由于'1'='1'始终为真,攻击者可以绕过登录验证,成功登录到系统中。因此,为了防止SQL注入攻击,应用程序需要对用户输入进行足够的校验,并使用预编译语句等方法来防止恶意SQL代码的注入。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值