我目前正在开发PHP扩展,我将授予用户编写SQL的权限(在textarea
中),并将执行它。
但是对于明显的安全性问题,我想在实际执行之前“验证” SQL。我肯定知道的一件事是,我的用户应该编写的SQL仅用于读取/获取数据。因此,我想做的是检查SQL是否正在读取(SELECT,SHOW)或写入(UPDATE,DELETE,DROP,CREATE,INSERT等),而没有实际执行(出于明显的原因)。
那么有什么方法可以在PHP / MySQL中做到这一点?
注意我不能限制MySQL用户的访问权限,因为同一用户正在其他扩展中使用,并且需要写访问权限。我也不能为此创建新用户。
答案 0 :(得分:0)
哇。这听起来像个雷区!!而是你,而不是我,哥们! 我的想法:
UPDATE
,INSERT
等...),字段,表名,并且只有一个语句(在主选择之后或之前没有狡猾的辅助命令运行)SELECT
)应遵循一定的模式,以便确保 是SELECT语句此外,要在不在数据库上运行潜在危险的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