【发布时间】:2015-09-22 04:20:26
【问题描述】:
我正在通过 AJAX 为搜索栏提供动力,该搜索栏传递了与数据库列相关的选定过滤器(单选按钮)和搜索栏中输入的任何内容的搜索字符串。我正在使用的 scala/play/anorm 代码是这样的:
def searchDB(searchString: String, filter: String): List[DatabaseResult] = {
DB.withConnection { implicit c =>
SQL(
"""
SELECT name, email, emailsecondary, picture, linkedin, title, company, companylink, companydesc, location, github, stackoverflow, twitter, blog
FROM mailinglistperson
WHERE {filter} LIKE '%{searchString}%'
""").on(
'filter -> filter,
'searchString -> searchString
).as(databaseResultParser.*)
}
}
当我使用与上述异常代码同构的psql 在数据库 (PostgreSQL) 上运行查询时,它返回 2 个结果,即:
select id, name, email from mailinglistperson where company like '%kixer%';
但是当传递完全相同的值时,异常代码返回 0 个结果(我已经通过 println 验证了这些值)
编辑:当我切换异常代码以使用字符串插值时,我得到:
[error] - play.core.server.netty.PlayDefaultUpstreamHandler - Cannot invoke the action
java.lang.RuntimeException: No parameter value for placeholder: 3
EDIT2:我还尝试将 '%...%' 与 searchString 一起传递给 LIKE,但仍然得到 0 个结果。
【问题讨论】:
-
过滤值:你试过
LIKE {searchString}和searchString = '%...%"吗?这意味着 SQL 命令中没有单个刻度(它们应该被自动处理),并且在searchString中传递“%” -
关于列名:一般来说,使用命名参数将列名传入SQL是不可能的。 Anorm 似乎以某种方式支持它,但生成的 SQL 命令包含单个刻度(因为名称是“字符串参数”)。所以你可能必须嵌入列名,比如
SQL(s"... where $column like {searchString}(这是简单的字符串插值,易受 SQL 注入攻击) -
异常混合插值
SQL"... WHERE #$column = $searchString"不易受到SQL注入的影响 -
@cchantep 我只评论过,正常的字符串插值很容易受到攻击。感谢您的提示,我不知道混合插值。但是使用 Play 2.4.0 和 2.5.0 进行的快速测试表明它容易受到 SQL 注入攻击?!
标签: postgresql scala anorm