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

问题描述:

我准备一个MySQL的测试,让用户将看到一个小的数据库,我们将展示一些问题。用户将回答问题作为查询。他会创建一个查询并运行它,看看他是否得到了预期的结果。如何防止Mysql数据库被更改/更新/删除?

所有问题都基于“选择”查询的问题。因此,运行查询之前,我想确认,有什么在改变数据库的当前状态的查询。用户显然不能运行更新,删除,插入等修改数据库的任何其他类型的查询。

我该怎么做?有一些图书馆可以帮助我吗?我目前只是在查询字符串中搜索关键字插入,更新和删除以防止出现这种情况。我正在使用PHP和codeigniter MVC。

+4

创建数据库用户这没有必须(删除,更新等)的作用附着在其上。 http://webmasters.stackexchange.com/questions/2242/how-to-create-separate-users-in-phpmyadmin-each-one-cant-see-others-databases –

创建仅SELECT分配给它的特权用户喜欢:

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

现在用username用户只有select特权。

虽然可以限制基于授予用户的设置,这将阻止未经授权的操作是最安全的解决方案的操作,您可以使用的preg_match检查的查询某些受限制词的存在。但是,可能会出现这样的用例,其中某些单词可能用在SELECT查询中,如果您需要它们用于基于文本的查找=,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选项和信息的命令集都允许,你可以使用这个网址作为一个伟大的资源: https://dev.mysql.com/doc/refman/5.7/en/privileges-provided.html