#{} 和 ${}
#{}
执行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 数据库名称 # : 可以导致删库