不要列出不属于用户的数据库

不要列出不属于用户的数据库

使用 MySQL 和 PHPMyAdmin,我想授予某些用户创建数据库和删除自己的数据库的所有权限。基本上,用户只能看到自己创建的数据库,并且可以对它们执行任何操作,但不能与其他用户的数据库交互,也不能查看其他用户的数据库。

我见过一个带有 GRANT ALL ON 前缀的解决方案但这意味着用户知道前缀并使用它来创建所有数据库。

有没有限制较少的替代方案?

答案1

我使用这个 PHP 脚本来添加具有您指定的权限的用户。此脚本还会随机化密码并将其转储到用户主目录中的文件中。您需要稍微修复它,因为它依赖于其他一些文件,但只需获取 Sql 语句并使用它们就足够简单了。

#! /usr/bin/php
<?php
error_reporting(E_ALL);
define('ADMIN','true');
require_once 'utils/utils.php';

if (count($argv) < 2)
{
    echo "usage : php -f ". $argv[0] . " user\n";
    return;
}
$user = $argv[1];
$pass = createRandomPassword(10);

global $conn;
if(false === $conn->query("CREATE USER '$user'@'localhost' IDENTIFIED BY '$pass'")) die("mysql error\n");
if(false === $conn->query("GRANT USAGE ON * . * TO '$user'@'localhost' IDENTIFIED BY '$pass'")) die("mysql error\n");
if(false === $conn->query("GRANT ALL PRIVILEGES ON `$user\_%` . * TO '$user'@'localhost'")) die("mysql error\n");
echo "Created mysql user $user/$pass\n";
savePasswordFile($user,$pass);

function savePasswordFile($user,$pass)
{
        $passfile = "/home/$user/passwords.txt";
        $f = fopen($passfile,"a");
        if (!$f) die("Error opening passwords file");
        fputs($f, "Mysql login:\nuser : $user\npass : $pass\n\nYou may create databases named ".$user."_*, for example ".$user."_blog\n");
        chown($passfile,"$user");
        chgrp($passfile,"$user");
        chmod($passfile,0700);
        fclose($f);
}

function createRandomPassword($length)
{
    $chars = "abcdefghijkmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ023456789-!@#$%^&*";
    srand((double)microtime()*1000000);
    $i = 0;
    $pass = '' ;
    while ($i <= $length) {
        $num = rand() % strlen($chars);
        $tmp = substr($chars, $num, 1);
        $pass = $pass . $tmp;
        $i++;
    }
    return $pass;
}

?>

答案2

您可以使用 webmin 并创建个人用户,然后他们可以创建数据库。 http://www.webmin.com/

相关内容