java - 处理动态表/列名时如何防止SQL注入(inject)?

标签 java sql jdbc sql-injection

我正在使用 jdbc PreparedStatement 进行数据插入。

Statement stmt = conn.prepareStatement(
"INESRT INTO" + tablename+ "("+columnString+") VALUES (?,?,?)");

tablenamecolumnString 是动态生成的。

我尝试过参数化表名和列字符串,但它们只会解析为“表名”之类的内容,这会违反语法。

我在网上发现某个地方建议我查找数据库以检查有效的表名/列字符串,并将其缓存在某个地方(也许是哈希集)以供另一个查询使用,但我正在寻找更好的性能/快速破解解决这个问题,也许一个字符串 validator/正则表达式可以解决问题。

有没有人遇到过这个问题,你们是如何解决的?

最佳答案

我不是 java 专家,所以,只是一个理论。

您可以格式化动态添加的标识符或白名单它们。

第二种选择更好。因为

  • 大多数开发人员对标识符不够熟悉,无法正确设置它们的格式。比如说,引用第一条评论中提供的标识符,根本不会使其受到保护。
  • 可能还有另一种攻击媒介,不完全是注入(inject),但类似:假设您的表中有一列,不允许普通用户 - 比如说,称为“admin”。使用动态构建 columnString使用来自客户端的数据,打造特权升级是小菜一碟。

因此,最好事先在您的代码中列出所有可能(和允许)的变体,然后根据它验证输入的值,这将是最好的。

截至columnString - 由单独的列名称组成。因此,为了保护它,必须根据白名单验证每个单独的列名,然后组装最终的 columnString。来自他们。

关于java - 处理动态表/列名时如何防止SQL注入(inject)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32883053/

相关文章:

java - 连接到 Postgres 数据库失败

java - 需要帮助解决旋转图像问题

java - 在 java 中通过 objectoutputstream 发送字节数组

sql - sql server中具有多列的动态数据透视表

sql - 如何删除另一个表中存在的行?

python - 如何使用 pandas 按周对数据透视表结果进行分组?

java - 调用 WebElement 列表的单个索引

java - BitmapFactory 解码流在 ListView 中不起作用

Java JDBC MySQL异常: “Operation not allowed after ResultSet closed”

java - 在批处理模式下通过可调用语句调用 SP 时检索 OUT 参数