首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >表模式和名称的Regex验证

表模式和名称的Regex验证
EN

Stack Overflow用户
提问于 2021-09-02 18:55:26
回答 2查看 581关注 0票数 0

我有一个API,它对调用方指定的表执行一些查询。表名通过字符串替换放置在查询中,SQL注入的风险也是如此。

示例:

代码语言:javascript
复制
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-_]+$

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-09-04 01:58:06

由于减号不是表名中的有效字符,所以可以将正则表达式更改为:

代码语言:javascript
复制
^myschema\.\w+$

\w等价于[a-zA-Z0-9_]

没有注射的危险。

如果使用特殊的语法,大多数数据库都允许表名中的特殊字符,甚至空格和minuses,例如

代码语言:javascript
复制
MySQL: `my stupid table-name!`
Postgres: "my stupid table-name!"
SQL Server: [my stupid table-name!]

首先允许非标准字符出现在名称中是很糟糕的做法,在您的情况下拒绝这样的名称也是很好的。

票数 1
EN

Stack Overflow用户

发布于 2021-09-04 00:37:34

减号不能用作SQL中的标识符。对于表名,我不认为它会导致SQL注入攻击,但是如果在列名中允许减号,则可以插入减法。对于MySQL,下面的SQL语句将返回所有用户,而不仅仅是'tom‘。这是因为从字符串减去时发生的隐式类型转换。

代码语言:javascript
复制
SELECT * FROM users WHERE myschema.user-0 = 'tom'

解决办法是排除减号或引用标识符。以下操作不会导致SQL注入攻击。

代码语言:javascript
复制
SELECT * FROM users WHERE `myschema`.`user-0` = 'tom'.

以上是为MySQL编写的方法,标准SQL的编写方式如下所示

代码语言:javascript
复制
SELECT * FROM users WHERE "myschema"."user-0" = 'tom'
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69035735

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档