当用户提供任意SQL标识符时如何防止注入?

时间:2014-04-26 19:00:45

标签: postgresql jdbc

我需要使用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;
}

2 个答案:

答案 0 :(得分:0)

使用RegExp解析channel_name。这样,您就可以验证用户条目的格式是否正确,并且不包含任何可能影响您请求的特殊字符。

答案 1 :(得分:0)

对于笔记,如果您不想在数据库中使用疣,那么您当前的方法是唯一理智的方法。

如果你坚持使用它,内置的Postgres方法是使用评论中指出的quote_ident()。但要小心,因为在这种情况下,"(?!: .之类的输入会成为有效的标识符。 psql将很好地处理(希望如此),但输入类似标识符可能会很痛苦。

也许你的ORM有后一个函数的包装器 - 如果没有,并且cHao强调它关于"字符处理。

如果它是一个表名,您也可以将该事物转换为regclass以确保标识符存在。