下面的代码是否受SQL注入的影响,如果是,则修改它的任何建议。感谢
def Function(x: Int, y: Int) = {
var query = s"SELECT * FROM table LIMIT $x, $y"
}
答案 0 :(得分:1)
<强>更新强>
经过反思,我刚才意识到,因为这是一个LIMIT
字段,并且因为Int.MAX_INT
如此之高,我会认为这是一个潜在的安全问题,尽管可能不是SQL注入。这是因为如果输入数据来自不受信任的来源,调用者将能够使数据库执行比预期更多的工作。
传递给LIMIT
的值应验证在预期的合理范围内,我还会考虑使用PreparedStatement
。
因为传递给函数的类型是Int
类型,所以Scala类型系统的类型安全性意味着它们保证是整数值。因此,任意SQL都无法注入SQL,因此我不会将此视为受SQL注入。
然而,除了安全性之外,使用带有参数标记的PreparedStatement
更好是出于其他原因,例如性能,因此切换到使用PreparedStatement
或其他具有抽象PreparedStatement
s的功能的SQL库在这里很有用。
请注意,包含PreparedStatement
的Java JDBC API在Scala中可用,因此可以使用,并且可以使用许多可以使用的Scala特定库,这些库通过原始JDBC API进行抽象。