检查MySQL语句是否正在读取或写入

时间:2018-12-11 14:03:03

标签: php mysql zend-framework

我目前正在开发PHP扩展,我将授予用户编写SQL的权限(在textarea中),并将执行它。

但是对于明显的安全性问题,我想在实际执行之前“验证” SQL。我肯定知道的一件事是,我的用户应该编写的SQL仅用于读取/获取数据。因此,我想做的是检查SQL是否正在读取(SELECT,SHOW)或写入(UPDATE,DELETE,DROP,CREATE,INSERT等),而没有实际执行(出于明显的原因)。

那么有什么方法可以在PHP / MySQL中做到这一点?

注意我不能限制MySQL用户的访问权限,因为同一用户正在其他扩展中使用,并且需要写访问权限。我也不能为此创建新用户。

1 个答案:

答案 0 :(得分:0)

哇。这听起来像个雷区!!而是你,而不是我,哥们! 我的想法:

  • 您显然可以剖析提交的SQL,以查找(并删除)不需要的命令(UPDATEINSERT等...),字段,表名,并且只有一个语句(在主选择之后或之前没有狡猾的辅助命令运行)
  • SQL(如果是SELECT)应遵循一定的模式,以便确保 是SELECT语句
  • 您可以限制可以运行的SELECT语句的范围,即无联接
  • 确保仅提交A-Za-z0-9字符

此外,要在不在数据库上运行潜在危险的SQL的情况下测试其语法有效性,则可以将执行包装在事务中并始终回滚...所以也许:

BEGIN TRANSACTION

SELECT field1, field2, field3 FROM The_Table WHERE field1 = 'test';

ROLLBACK TRANSACTION

...只是我最初的想法!希望他们能帮上忙。

更新:

您可以按照下面的建议使用SQL解析器。这种事情可能会破坏提交的SQL的意图,使您可以确保一切都正常(或可以确认的正常!) https://github.com/greenlion/PHP-SQL-Parser

我个人会为此抛出解析器以及上面的部分/全部逻辑。 PAIN有很多范围! :O