我有一个字符串,我想传递给SQL。为防止SQL注入和其他引用和转义问题,最佳做法是使用PreparedStatement
和?
。例如:当PreparedStatement不起作用时,如何在JDBC中转义SQL参数?
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'? –
这将如何帮助我逃脱'名称'?我不得不将它连接到字符串,然后我打开SQL注入攻击。 –
我明白你的意思了。对不起,在我评论之前,我应该更仔细地看看你想做什么。我已经尝试了一些变化,但它们都会导致您收到相同的错误。看来PostgreSQL真的不喜欢DDL中的参数替换,即使试图从函数调用它。 –