使用预准备语句在 MySQL 和 Java 中进行动态列名检索:一种更安全的方法
许多 MySQL 和 Java 开发人员已经探索使用准备好的语句来检索具有动态生成的列名称的数据。 但是,不支持直接将列名替换为准备好的语句的参数,这会带来重大的安全风险。 数据库架构重新设计通常是最好的解决方案。
尝试以这种方式使用准备好的语句,如下所示,会导致错误:
<code class="language-java">String columnNames = "d,e,f"; String query = "SELECT a,b,c,?" + " FROM " + name + " WHERE d=?"; // This results in "SELECT a,b,c,'d,e,f' FROM some_table WHERE d='x'", not the desired result.</code>
查询将 ?
占位符视为字符串文字,而不是列名称。
为了避免 SQL 注入漏洞,更可靠的方法是将动态列名称存储在数据库本身中。 考虑一个像“user_data”这样的表,其中包含以下列:
id
(主键)user_name
column_names
(以逗号分隔的列名称字符串)然后可以通过连接从此表中检索到的 column_names
来构造 SQL 查询:
<code class="language-java">String query = "SELECT a,b,c," + columnNames + " FROM " + name + " WHERE d=?";</code>
这种方法确保列名不会被视为容易受到注入攻击的参数。 虽然它使用字符串连接,但易受攻击的部分(列名)已经通过从数据库检索来进行清理。请记住,始终清理查询构造中使用的任何用户提供的数据,即使它不是 SQL 语句的直接一部分。 这种修改后的方法为处理动态列名称提供了更安全、更易于管理的解决方案。
以上是如何在 MySQL 和 Java 中使用预准备语句检索具有动态列名的数据?的详细内容。更多信息请关注PHP中文网其他相关文章!