MySQL& JDBC:管理多个模式最安全的方法是什么?

时间:2016-10-09 15:04:22

标签: java mysql jdbc

我正在使用JDBC和MySQL处理应用程序,我担心SQL注入。数据库将是多租户,具有不同的"架构"对于每个租户。因此,应用程序需要能够创建和删除模式。

我的挑战是,这些类型的查询似乎不适用于PreparedStatements,我无法对它们进行参数化。这让我有点害怕,我不喜欢用SQL命令连接字符串。

我唯一的安慰是应用程序用户无法直接创建模式名称。它们由租户组织名称的前五个字符组成,加上一个唯一索引。这至少是一些安慰。

然而,我正在寻找最佳实践,我可以采取哪些措施来保护以下SQL语句免受潜在的注入攻击(参数显然只是这个问题的占位符,这些语句不能参数化) :

CREATE SCHEMA ?

SHOW TABLES FROM ? (used to verify that the schema DDL script was executed properly)

DROP SCHEMA IF EXISTS ?

1 个答案:

答案 0 :(得分:2)

如果您使用字符串连接“注入”的唯一字符串完全由您控制,那么您将没事。

但是,即使在您的控制之下,您仍然可以通过拒绝或转义带有特殊字符的值(SQL注入问题的原因)来保护自己。假设您使用'引用字符串文字,需要考虑以下两个特殊字符:'\

如果你正确地转义字符串,你“注入”SQL,那么即使是用户提供的字符串也可以使用。缺少转义字符串会导致SQL注入漏洞。

请注意,上述内容仅保证为真,因为您使用的是MySQL。其他RDBMS可能会在'引用的字符串文字中使用其他特殊字符,这就是为什么使用PreparedStatement标记通常是防止SQL注入攻击的最佳方法,其中JDBC驱动程序可以执行正确的转义在需要的地方。