首页 > 解决方案 > 避免在动态 MySQL CREATE TABLE 查询中注入

问题描述

通常在 Go 中,您可以通过使用参数化查询来避免 SQL 注入,例如:

db.Query("SELECT * FROM test WHERE name = ?", name)

但是,您不能以这种方式提供数据库、表或列名。

我正在编写一个从各种来源获取表并将它们放入 MySQL 数据库的程序,因此我需要动态创建表并因此动态提供列名。

例如,可以这样做:

db.Exec(fmt.Sprintf("CREATE TABLE test (%s VARCHAR(255)", columnName))

不幸的是,这对于 SQL 注入是不安全的,因为这绕过了通过使用参数化查询实现的卫生,如第一个示例所示。

对此有什么好的解决方案?我可以编写自己的卫生功能或从随机作者那里在线找到一个,但这些都没有经过很好的测试或官方,所以我认为它们很可能会丢失一些边缘案例。这个问题有什么规范的解决方案吗?

标签: mysqlgosql-injection

解决方案


推荐阅读