我需要使用JDBC对PostgreSQL数据库运行LISTEN channel_name
,其中channel_name
由用户在Web应用程序中提供。
channel_name
可以是任何PostgreSQL标识符。
我不相信我可以使用参数化,并且没有要检查的白名单。
如何让用户安全地这样做?
我考虑过regexp,但我想知道是否有任何预先构建的内容,因为我不想犯错误。
当前代码(不支持带引号的标识符或非ascii字符):
public String checkIdentifier(String value) {
if (!value.matches("(?i)^[a-z_][a-z_0-9\\$]{0,63}$")) {
throw new RuntimeException("Not a valid SQL identifier.");
}
return value;
}
答案 0 :(得分:0)
使用RegExp解析channel_name。这样,您就可以验证用户条目的格式是否正确,并且不包含任何可能影响您请求的特殊字符。
答案 1 :(得分:0)
对于笔记,如果您不想在数据库中使用疣,那么您当前的方法是唯一理智的方法。
如果你坚持使用它,内置的Postgres方法是使用评论中指出的quote_ident()
。但要小心,因为在这种情况下,"(?!: .
之类的输入会成为有效的标识符。 psql
将很好地处理(希望如此),但输入类似标识符可能会很痛苦。
也许你的ORM有后一个函数的包装器 - 如果没有,并且cHao强调它关于"
字符处理。
如果它是一个表名,您也可以将该事物转换为regclass
以确保标识符存在。