我正在准备一个MySQL测试,用户将看到一个小型数据库,我们将显示一些问题。用户将回答问题作为查询。他将创建一个查询并运行它,看看他是否得到了所需的结果。
所有问题均基于“选择”查询问题。因此,在运行查询之前,我想确认查询中没有任何内容可以更改数据库的当前状态。用户无法明显地运行更新,删除,插入等任何修改数据库的其他类型的查询。
我该怎么做?有些图书馆可以帮助我吗?我目前只是在查询字符串中搜索关键字insert,update和delete来防止这种情况。我正在使用PHP和codeigniter MVC。
答案 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