我正在使用jdbc PreparedStatement进行数据插入。
Statement stmt = conn.prepareStatement(
"INESRT INTO" + tablename+ "("+columnString+") VALUES (?,?,?)");
tablename和columnString是动态生成的。
我试图参数化tablename和columnString,但是它们只会解析为“ tablename”之类的东西,这会违反语法。
我在网上找到了一些建议,建议我查找数据库以检查有效的表名/列字符串,并将其缓存在某个地方(可能是哈希集)以进行其他查询,但是我正在寻找性能更高/快速破解的方法来解决此问题,也许可以解决问题的字符串验证器/正则表达式。
有没有人遇到过这个问题,您如何解决?
最佳答案
我不是Java专家,所以只是理论。
您可以格式化动态添加的标识符或将其列入白名单。
第二种选择更好。因为
大多数开发人员对标识符的格式不够熟悉。说,引用第一个评论中提供的标识符,将使其完全不受保护。
可能还有另一个攻击媒介,不完全是注入,而是类似的:假设您的表中有一列,不允许普通用户-称为“ admin”。使用来自客户端的数据动态构建的columnString
,伪造特权升级是小菜一碟。
因此,最好先列出代码中所有可能的(和允许的)变体,然后根据它验证输入的值。
从columnString
开始-由单独的列名称组成。因此,为了保护它,必须对照白名单来验证每个单独的列名称,然后从中组合最终的columnString
。
关于java - 在处理动态表/列名称时如何防止SQL注入(inject)?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32883053/