【问题标题】: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

    【讨论】:

      猜你喜欢
      • 2013-09-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-08-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多