Sonar PreparedStatement - sql注入
Posted
技术标签:
【中文标题】Sonar PreparedStatement - sql注入【英文标题】:Sonar PreparedStatement - sql injection 【发布时间】:2014-05-30 06:30:35 【问题描述】:Sonar 抱怨一个方法:
“从非常量字符串生成准备好的语句”
我明白了,通过字符串连接来参数化查询是不安全的,但是我在这里定义了表的名称。 如何摆脱声纳警告?更重要的是,如何解决这个问题,如何避免sql注入? 我是否应该开始在 db 和节点变量中搜索无效值,例如。不得包含空格或 ; (通常检查输入的东西),还是有一种优雅的方式?
顺便说一句,该方法在应用程序中非常深入,我怀疑是否有机会通过 ui 对这些参数强制任何值。
方法的简化版:
private PreparedStatement getPs(Connection conn, String db, String node, String ext)
StringBuilder sql = new StringBuilder("select name, sum(counter) cnt");
sql.append(" from ").append(db).append(".").append(node).append("_stuff");
sql.append(" where something = ?");
sql.append(" group by name");
PreparedStatement ps;
try
ps = conn.prepareStatement(sql.toString());
ps.setString(1, ext);
catch (SQLException sqle)
throw new MyRuntimeException(sqle);
return ps;
感谢您的帮助。
【问题讨论】:
【参考方案1】:声纳警告准确地说明了它警告的内容:
“从非常量字符串生成准备好的语句”
这并不意味着您的代码容易受到 SQL 注入攻击。这只是意味着它可能是。如果您绝对确定用户无法注入数据库架构或表名,则只需忽略警告即可。
【讨论】:
以上是关于Sonar PreparedStatement - sql注入的主要内容,如果未能解决你的问题,请参考以下文章
sonar8.5.0升级为sonar8.5.3之后为啥很卡?