是否应该在准备好的查询中准备非变量列名?
Should non-variable column names be prepared in a prepared query?
在 npm 上使用带有 mysql 包的预处理语句的示例如下所示:
var sql = "SELECT * FROM ?? WHERE ?? = ?";
var inserts = ['users', 'id', userId];
sql = mysql.format(sql, inserts);
'users' 和 'id' 这里是硬编码的。 userId 是由用户提供的变量。鉴于 'users' 和 'id' 不是由用户提供的,将它们包含在查询准备中是否有意义?这样做会不会更不安全?
var sql = "SELECT * FROM users WHERE id = ?";
var inserts = [userId];
sql = mysql.format(sql, inserts);
SQL 参数仅用于值,因此不能用于列或 table 名称。在后台,准备语句时,RDBMS 需要完全理解稍后将执行的查询。更改列或 table 名称确实会更改查询的含义,因此不受支持。
最重要的是,您提到列和 table 名称并非来自用户输入,因此无论如何都消除了 SQL 注入的风险。如果它们来自程序外部,那么解决方案是以编程方式验证它们(例如,针对预定义的值列表)。
在 npm 上使用带有 mysql 包的预处理语句的示例如下所示:
var sql = "SELECT * FROM ?? WHERE ?? = ?";
var inserts = ['users', 'id', userId];
sql = mysql.format(sql, inserts);
'users' 和 'id' 这里是硬编码的。 userId 是由用户提供的变量。鉴于 'users' 和 'id' 不是由用户提供的,将它们包含在查询准备中是否有意义?这样做会不会更不安全?
var sql = "SELECT * FROM users WHERE id = ?";
var inserts = [userId];
sql = mysql.format(sql, inserts);
SQL 参数仅用于值,因此不能用于列或 table 名称。在后台,准备语句时,RDBMS 需要完全理解稍后将执行的查询。更改列或 table 名称确实会更改查询的含义,因此不受支持。
最重要的是,您提到列和 table 名称并非来自用户输入,因此无论如何都消除了 SQL 注入的风险。如果它们来自程序外部,那么解决方案是以编程方式验证它们(例如,针对预定义的值列表)。