我的代码有效,所以我觉得问这个问题很脏,但我似乎找不到任何地方使用相同类型的技术,所以想问问它是否有任何我看不到的明显错误。
我有一个存储过程,其中一个输入参数决定返回哪些字段,方法是将其放在准备好的语句中的 SELECT
和 FROM ...
之间 - 我猜这是很容易发生 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'
我不确定这是否符合您的真正要求。它将找到 PREINSERTION
和 DELETING
。但它更简单并且等同于您的逻辑。
关于MySQL在准备好的语句中检测关键字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49982193/