MySQL在准备好的语句中检测关键字

标签 mysql sql

我的代码有效,所以我觉得问这个问题很脏,但我似乎找不到任何地方使用相同类型的技术,所以想问问它是否有任何我看不到的明显错误。

我有一个存储过程,其中一个输入参数决定返回哪些字段,方法是将其放在准备好的语句中的 SELECTFROM ... 之间 - 我猜这是很容易发生 SQL 注入(inject),所以我对变量进行了扫描,如果参数包含任何危险的关键字或分隔符,我将拒绝任何内容:

这里,x 可以是 table1.col1, table1.col4, table2.col1

IF LOCATE('DROP', x) > 0 OR LOCATE('INSERT', x) > 0 OR LOCATE('UPDATE', x) > 0
    OR LOCATE(';', x) > 0 OR LOCATE('DELETE', x) > 0 THEN

我是不是漏掉了什么重要的东西?或者实际上是否有在 MySQL 中执行此操作的预制方法?

最佳答案

没有“预制”方式,但正则表达式可以简化您的代码:

where x regexp 'DROP|INSERT|UPDATE|;|DELETE'

我不确定这是否符合您的真正要求。它将找到 PREINSERTIONDELETING。但它更简单并且等同于您的逻辑。

关于MySQL在准备好的语句中检测关键字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49982193/

相关文章:

php - 错误 : Unknown column 'joinedactivities.searchact id = searchact.id' in 'on clause'

mysql - OR 的 SELECT 语句问题

Python SQL 连接到错误的 IP 地址

php - 循环遍历 MySQL 数据库直到字段 = 'specified value'

sql - 比较两个 SQL 数据库

sql - 在不破坏序列的情况下对列进行分组

mysql - 简单 mysql 连接的 On 子句中的未知列

MySQL 获取24小时内收到评论且未回复的用户

mysql - SQLbuilder LIKE 参数带 %

sql - 选择 SQLite3 中的每第 n 行