我目前正在开发一个php扩展,我将授予用户编写sql的权限(在 textarea
),我将执行它。
但是对于明显的安全问题,我想在实际执行sql之前“验证”它。我可以肯定的是,我的用户应该编写的sql只用于读取/获取数据。因此,我要做的是检查sql是否正在读取(选择、显示)或写入(更新、删除、删除、创建、插入等),而没有实际执行它(出于明显的原因)。
那么在php/mysql中有什么方法可以实现这一点呢?
注意我不能限制mysql用户的访问权限,因为同一个用户正在其他扩展中使用,并且需要写访问权限。我也不能仅仅为此创建一个新用户。
1条答案
按热度按时间hsgswve41#
真 的。听起来像个雷区!!而不是你,伙计!我的想法:
显然,您可以剖析提交的sql以查找(并删除)不需要的命令(
UPDATE
,INSERT
字段、表名,并且只有一条语句(在主select之后或之前没有运行不可靠的辅助命令)sql(如果是
SELECT
)应该在一定程度上遵循模式,以便确保它是select语句您可以限制可以运行的select语句的范围,即没有联接
确保只提交了a-za-z0-9字符
此外,为了测试它的语法有效性而不在数据库上运行潜在危险的sql,您可以将执行 Package 在事务中并始终回滚…因此:
…只是我最初的想法!希望他们能帮忙。
更新:
您可以使用下面建议的sql解析器。这种情况可能会破坏提交的sql的意图,从而允许您确保一切正常(或者尽可能地正常!)https://github.com/greenlion/php-sql-parser
就我个人而言,我会把解析器加上上面的一些/所有逻辑放在这里。疼痛的空间很大!:o