【发布时间】:2018-05-10 02:01:22
【问题描述】:
"#{variable}" Spring 表达式语言 SpEL 值是否可以免受 SQL 注入攻击?例如:
@Mapper
public interface UrlInfoMapper {
public static final String SELECT_BY_ID = "select * from url WHERE ID=#{ID}";
public static final String DELETE_BY_ID = "DELETE FROM url WHERE ID=#{ID}";
@Select(SELECT_BY_ID)
UrlInfo getFromUrlById(String ID);
@Update(DELETE_BY_ID)
void delete(@Param("ID")String ID);
我检查了参考资料,但没有发现替代值被转义为 SQL 字符(如引号)。
https://docs.spring.io/spring/docs/4.3.17.RELEASE/spring-framework-reference/htmlsingle/#expressions
我在网上找不到关于 SpEL 和 SQL 注入的信息(只有 JPA,这个项目没有使用)。
https://duckduckgo.com/?q=spel+sql+injection&ia=qa
本文在视图中讨论 SpEL 的漏洞,而不是数据库。
https://www.mindedsecurity.com/fileshare/ExpressionLanguageInjection.pdf
Spring Core 2.6.1、Spring Boot 1.5.6、Spring Expression 4.3.10。
【问题讨论】:
-
我发现这是使用一个名为 MyBatis 的库。
-
使用
PreparedStatements 的数据访问技术可以避免 SQL 注入。无论如何,通过创建一个简单的应用程序并尝试一些攻击向量来验证这一点应该很容易。
标签: java spring spring-mvc spring-boot