【发布时间】:2016-04-29 18:51:09
【问题描述】:
我有一个要传递给 SQL 的字符串。为了防止 SQL 注入和其他引用和转义问题,最佳实践是使用 PreparedStatement 和 ?。例如:
val ps = conn.prepareStatement("select * from foo where name = ?")
ps.setString(1, name)
但对于某些 SQL 代码,这将不起作用。比如这里是PostgreSQL,试图创建一个视图。
val ps = conn.prepareStatement("create temp view v1 as select * from foo where name = ?")
ps.setString(1, name)
val rs = ps.execute()
这会引发错误:
org.postgresql.util.PSQLException: ERROR: there is no parameter $1
它显然不允许create view 的参数。你如何解决这个问题并安全地逃脱字符串?
【问题讨论】:
-
也许您应该只使用
Statement而不是PreparedStatement? -
这将如何帮助我逃离
name?我必须将它连接到字符串中,然后我就会受到 SQL 注入攻击。 -
我明白你的意思。抱歉,在我发表评论之前,我应该更仔细地查看您想要做的事情。从那以后,我尝试了一些变体,但它们都会导致您收到相同的错误。似乎 PostgreSQL 真的不喜欢 DDL 中的参数替换,即使尝试从函数调用它也是如此。
标签: postgresql jdbc escaping postgresql-9.4