如何防止Mysql数据库被更改/更新/删除?

时间:2017-02-22 05:01:44

标签: php mysql database codeigniter

我正在准备一个MySQL测试,用户将看到一个小型数据库,我们将显示一些问题。用户将回答问题作为查询。他将创建一个查询并运行它,看看他是否得到了所需的结果。

所有问题均基于“选择”查询问题。因此,在运行查询之前,我想确认查询中没有任何内容可以更改数据库的当前状态。用户无法明显地运行更新,删除,插入等任何修改数据库的其他类型的查询。

我该怎么做?有些图书馆可以帮助我吗?我目前只是在查询字符串中搜索关键字insert,update和delete来防止这种情况。我正在使用PHP和codeigniter MVC。

2 个答案:

答案 0 :(得分:2)

创建仅分配了SELECT权限的用户,如:

"GRANT SELECT ON *.* TO 'username'@'host_or_wildcard' IDENTIFIED BY 'password';

现在,username用户只拥有select权限。

答案 1 :(得分:1)

虽然您可以根据授予用户的设置限制操作,这可以防止未经授权的操作作为最安全的解决方案,但您可以使用preg_match检查查询中是否存在某些受限制的字。但是,可能存在这样的用例,其中一些单词可能在SELECT查询中使用,如果您需要它们用于基于文本的lookup =,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