2

一部のユーザーにデータベースからの読み取り権限を付与したいので、興味があります。SELECT、WHERE、およびJOIN演算子のみをサポートするSQLダイアレクトはありますか?

次のように使用します。

class MyModelWithSQLRule(models.Model):
    sql_rule = models.TextField()

    def what_data_i_will_get(self): 
        """
        Here we must get exception with attempt of query like
        DELETE * FROM users_users; SELECT id FROM users_users; 
        """
        parsed_sql_rule = select_only_parser(self.sql_rule)
        return Users.objects.raw(parsed_sql_rule)

それはデータベースエンジンについてではありません。SQLのサブファミリーに含まれる言語が必要ですが、のような危険な単語はありませんDELETE

4

4 に答える 4

4

あなたが言ったことに基づいて、答えはノーです。

あなたができることは、データベースに2つの接続文字列を用意することです。1つはDBレベルで読み取り専用に設定され、もう1つは読み取り/書き込み接続文字列になる可能性があり、適切な接続でデータベースセッションコンテキストを構築するだけですストリング。これにより、アプリケーション レベルで認識されたレベルのセキュリティが得られますが、エラーがそこからスローされるため、最終的には DB に依存します。

于 2012-10-04T11:19:10.877 に答える
1

ほとんどのSQL実装では、アクセス許可を使用してアクセスと権利を制御できます。通常は、、などのキーワードを使用しGRANTますDENYREVOKE

于 2012-10-04T11:11:17.680 に答える
1

サポートする必要があるのが django だけの場合、最も簡単な方法は、クエリをフィルター処理する独自のデータベース アダプターを作成することです。

これにより、独自の「SQL ダイアレクト」を作成できます。

于 2012-10-04T11:34:24.197 に答える
1

データベースに認可を行わせたくない場合は、SQL を使用するプログラミング言語に問題を移す必要があると思います。非変更クエリのみを許可する、使用できる SQL ダイアレクトはありません。

式を解析して、DELETE、UPDATE、INSERT などの禁止されたキーワードを使用しているかどうかを確認してください。SQL の解析 (大部分のサブセット) は Python で非常に実行可能です。代わりにそれを調べることをお勧めします。私はまだ、読み取り専用ユーザーを作成し、すべてのクエリを別の接続を介して渡す方がクリーンで簡単だと思います。

編集:

トランザクションを使用することはできるかもしれませんが、それらをコミットすることはありませんか? それはあなたのために働くでしょうか?

于 2012-10-04T11:24:08.687 に答える