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