我在MySQL中有这样的查询
val selectQ = "SELECT NAME FROM EMPLOYEE"
val date = "2010-10-10"
val age = 10现在我有了一些动态和从句,比如
val whereNameFilter = "WHERE date = $date"
val andAgeFilter = "AND age = $age"我根据条件将whereNameFilter和andAgeFilter连接起来,因为有时我根本不需要连接它
我不想使用ORM,因为ORM已经证明性能很慢,并且希望在平原SQL中实现,因为它已经证明了很高的性能。类似地,我有一些子查询,这是基于输入字段的动态查询。假设我的所有输入都经过了清理并抛出了相关的错误,那么在查询构造之前,SQL注入的可能性有多大?
如果有机会的话,有什么办法可以防止呢?有什么实用工具可以帮助我用动态和/或/ IN和动态子查询动态地构造查询吗?
我的编程语言是Scala。
发布于 2020-03-07 07:10:58
通过在应用程序中对字符串进行硬编码控制的字符串与来自不受信任来源的字符串之间存在差异。
我不是Scala程序员,所以我将像伪代码一样形成如下代码:
conditions = Array()
params = Array()
selectQ = "SELECT NAME FROM EMPLOYEE WHERE true
if (date_input) {
selectQ += "AND date = ?"
params.append(date_input)
}
if (age_input) {
selectQ += "AND age = ?"
params.append(age_input)
}
query = prepare(selectQ)
fore (params as i=>p) {
query.setString(i, p)
}这种技术确保只有硬编码的字符串才会附加到SQL查询中。
其他内容作为绑定参数组合。查询参数不只是附加到查询中,它们一直保持独立,直到查询的prepare()之后。之后,SQL引擎已经解析了查询语法,所以任何内容都不会影响解析。
关于你的评论:
如果表达式本身是不受信任内容的一部分(包括但不限于用户输入),那么将它们逐字插入到SQL查询中当然是SQL注入。你不能这样做。
你可以用白名单来表达。也就是说,将它们与已知的可接受表达式列表进行比较,如果它们不在该列表中,则拒绝它们。
更好的做法是允许客户端通过某种标识符选择一个已知的安全表达式。例如,客户端将传递一个整数7,这将对应于“和年龄= ?”这是硬编码在你的应用程序。
如果您真的不能限制所接受的表达式的种类,并且不能白化它们,那么是的,这就是设计中的SQL注入。--这永远不是一个安全的应用程序。在我看来,不应该实现这样做的代码。
这就像你是一名电工而不是软件工程师,你的雇主告诉你在一桶油腻的破布上用一些没有绝缘的电线。我认为拒绝服从他们的命令是你的专业责任。他们可能会解雇你,找其他人来做这件事,但至少你不会对引发不可避免的房屋火灾负责。
https://stackoverflow.com/questions/60568247
复制相似问题