【问题标题】:How to prevent Mysql database from being changed/updated/deleted?如何防止Mysql数据库被更改/更新/删除?
【发布时间】:2017-02-22 05:01:44
【问题描述】:
我正在准备一个 MySQL 测试,用户将看到一个小型数据库,我们将显示一些问题。用户将回答问题作为查询。他将创建一个查询并运行它,看看他是否得到了想要的结果。
所有问题均基于“选择”查询问题。因此,在运行查询之前,我想确认查询中没有任何内容会改变数据库的当前状态。用户显然不能运行更新、删除、插入等任何其他类型的修改数据库的查询。
我该怎么做?有什么图书馆可以帮助我吗?我目前只是在查询字符串中搜索关键字插入、更新和删除来防止这种情况。我正在使用 PHP 和 codeigniter MVC。
【问题讨论】:
标签:
php
mysql
database
codeigniter
【解决方案1】:
创建一个只分配了SELECT 权限的用户,例如:
"GRANT SELECT ON *.* TO 'username'@'host_or_wildcard' IDENTIFIED BY 'password';
现在username 的用户只有select 权限。
【解决方案2】:
虽然您可以根据授予用户的设置来限制操作,这将防止未经授权的操作作为最安全的解决方案,但您可以使用 preg_match 来检查查询中是否存在某些受限词。但是,如果您需要将其中一些词用于基于文本的查找 =、LIKE、REGEX 等,则可能会在某些用例中使用这些词。
要处理这个问题,您可以从字符串中去掉引号或撇号内的任何内容,以便将它们忽略。
$query = preg_replace('/"[^"]+"/','', $query);
$query = preg_replace("/'[^']+'/",'', $query);
然后,使用您留下的字符串,检查禁用的 MySQL 单词或短语列表。
if(preg_match('/[alter|set|update|insert|delete|replace|into|grant]/',strtolower($query))) {
$bad_query = true;
}
当然,这是一个更复杂的实际 PHP 解决方案。最安全的选择是限制对 MySQL 调用的访问,但是如果您的目标是测试特定语法 - 您可以做到这一点。
有关 GRANT 选项和每个允许的命令集的信息,您可以将此 URL 用作一个很好的资源:
https://dev.mysql.com/doc/refman/5.7/en/privileges-provided.html