4

質問:

新しいユーザーにほぼすべての特権を与えながら、1つ以上のテーブル/データベースをそれらから保護するにはどうすればよいですか。

詳細:

データベースが1つある場合、

  • life

そして3つのテーブル

  • passwords
  • friends
  • hobbies

このユーザーに次の特権を与えるにはどうすればよいですか。

  • 入れる
  • アップデート
  • 消去
  • 作成
  • 落とす
  • ALTER

最初の3つに関しては、次のようなものから始めます。

GRANT INSERT, UPDATE, DELETE ON life.friends TO username@'localhost' IDENTIFIED BY 'password';
GRANT INSERT, UPDATE, DELETE ON life.hobbies TO username@'localhost' IDENTIFIED BY 'password';

しかし、私はどのように使用するかについて混乱していCREATEますDROP。このようにデータベース全体にドロップ権限を付与すると、次のようになります。

GRANT DROP ON life TO username@'localhost' IDENTIFIED BY 'password';

次に、ユーザーはpasswordsテーブルを削除できますが、これは不要です。代わりに、次のようなテーブルに基づいて付与することができます。

GRANT DROP ON life.friends TO username@'localhost' IDENTIFIED BY 'password';
GRANT DROP ON life.hobbies TO username@'localhost' IDENTIFIED BY 'password';

CREATEしかし、次のような特権を付与するとどうなりますか。

GRANT CREATE ON life TO username@'localhost' IDENTIFIED BY 'password';

つまり、ユーザーは自分が作成したテーブルそのものを削除することさえできないということですか?私の質問は、データベースの作成/削除にも関連しています。ユーザーが自分のデータベースをできるだけ多く作成および削除できるようにしたいが、データベースは許可したくない場合はどうすればよいですlifeか?

passwords代わりに、テーブルを別のデータベースに移動してアプローチを変更する必要がありますか?

よろしくお願いします。

4

1 に答える 1

2

個別のデータベースを使用するという@TheScrumMeisterの提案の代わりに、ラップするプロシージャを定義するCREATE TABLEだけでなく、呼び出し元のユーザーにそのプロシージャに対するDROPアクセス許可を付与することもできます。

DELIMITER ;;

CREATE PROCEDURE create_table(
  tbl_name VARCHAR(64) -- maximum length of a table name
) BEGIN
  DECLARE EXIT HANDLER FOR SQLEXCEPTION ROLLBACK;
  START TRANSACTION;
    SET @usr = SUBSTRING_INDEX(USER(), '@', 1);  -- invoking username
    SET @tbl = REPLACE(tbl_name, "`", "``");     -- prevent SQL injection

    -- just create some dummy table initially - the user can modify it after
    SET @qry = CONCAT("
      CREATE TABLE `", @tbl, "` (
        id INT NOT NULL AUTO_INCREMENT PRIMARY KEY
      );
    ");
    PREPARE stmt FROM  @qry;
    EXECUTE stmt;
    DEALLOCATE PREPARE stmt;

    -- now grant DROP to the invoking user but only from localhost
    SET @qry = CONCAT("
      GRANT DROP ON life.`", @tbl, "`
      TO CONCAT(?, \"@'localhost'\") IDENTIFIED BY 'password';
    ");
    PREPARE stmt FROM  @qry;
    EXECUTE stmt USING @usr;
    DEALLOCATE PREPARE stmt;

    -- clean up
    SET @qry = NULL;
    SET @usr = NULL;
  COMMIT;
END;;

DELIMITER ;

ユーザーが他の方法でテーブルを作成しないようにするために、ユーザーはCREATE TABLE特権を持ってはなりません。

データベースに対しても同様のことができます。

于 2012-04-30T16:23:32.787 に答える