#{} 和 ${} 及SQL注入

#{} 和 ${}

#{}

  • 执行SOL时,会将#{···}替换为?,生成预编译SQL,会自动设置参数值

  • 使用时机:参数传递,都适用#{···}
  • #{}占位符常见于诸如MyBatis等SQL框架中,用于参数的预编译和安全过滤。它会将占位符#{}中的内容作为一个参数占位符(?),并在查询执行之前将参数进行替换和预编译。这种方式可以防止SQL注入攻击,并提供更高的安全性。

${}

  • 拼接SQL,直接将参数拼接在SQL语句中,存在SQL注入问题。
  • 使用时机:如果对表名、列名进行动态设置时使用
  • ${}占位符是直接进行文本替换的,不进行参数的预编译和安全过滤,存在潜在的安全风险

 关于Sql注入:

SQL注入通常发生在Web应用程序中,因为Web应用程序通常使用SQL查询来与数据库交互。攻击者可以通过在Web应用程序的输入字段中注入恶意的SQL语句来利用这种漏洞。为了防止SQL注入攻击,开发人员应该使用参数化查询或存储过程来执行SQL查询,而不是直接将用户输入的数据拼接到SQL查询中。

例如:

String sql="select * from user where account= ’ " + account + " ’ and password=’ " +password+ " ’ "
输入123和456
sql就变成: select * from user where account = ‘123’ and password = ‘456’
这个没问题,要不查询成功,要不失败

但如果他输入 ’ or 1=1 # 和 456
sql就变成: select * from user where account = ‘’ or 1=1 #’ and password = ‘456’
#在sql中表示注释,所以系统执行的是: select * from user where account =‘’ or 1=1
1=1一定成立,所以这个sql一定成功,登录就危险了

比如输入 ’ or 1=1 ; drop database 数据库名称 # : 可以导致删库

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值