我有一个API,它对调用方指定的表执行一些查询。表名通过字符串替换放置在查询中,SQL注入的风险也是如此。
示例:
tableName = req.body.tableName;
sql = "SELECT * FROM <<TABLE_NAME>>;";
sql = sql.replace("<<TABLE_NAME>>", tableName);我需要保持查询的动态性,因为我们不希望每次添加新表时都重新部署这段代码。换句话说,我不能只维护一个有效表名的列表。
因此,为了使其不受sql注入的影响,对表名执行regex验证是否足够?我们可以确定表名将始终是schema.table_name格式,其中table_name将仅为a、0 - 9、-、_
是否有任何sql注入可以通过这个表名regex?
^myschema\.[a-zA-Z0-9-_]+$
发布于 2021-09-04 01:58:06
由于减号不是表名中的有效字符,所以可以将正则表达式更改为:
^myschema\.\w+$\w等价于[a-zA-Z0-9_]
没有注射的危险。
如果使用特殊的语法,大多数数据库都允许表名中的特殊字符,甚至空格和minuses,例如
MySQL: `my stupid table-name!`
Postgres: "my stupid table-name!"
SQL Server: [my stupid table-name!]首先允许非标准字符出现在名称中是很糟糕的做法,在您的情况下拒绝这样的名称也是很好的。
发布于 2021-09-04 00:37:34
减号不能用作SQL中的标识符。对于表名,我不认为它会导致SQL注入攻击,但是如果在列名中允许减号,则可以插入减法。对于MySQL,下面的SQL语句将返回所有用户,而不仅仅是'tom‘。这是因为从字符串减去时发生的隐式类型转换。
SELECT * FROM users WHERE myschema.user-0 = 'tom'解决办法是排除减号或引用标识符。以下操作不会导致SQL注入攻击。
SELECT * FROM users WHERE `myschema`.`user-0` = 'tom'.以上是为MySQL编写的方法,标准SQL的编写方式如下所示
SELECT * FROM users WHERE "myschema"."user-0" = 'tom'https://stackoverflow.com/questions/69035735
复制相似问题