2012-01-09 15 views
4

私は自分のクエリを入力するためのメソッドを含むpostgreSQLデータベースリーダーを作成しています。私は、入力されたクエリに修正コードが含まれているかどうかをチェックして、データベースを保護したい。これは私のチェックです:読み取り専用のクエリ文字列を確認する

private bool chech_unwanted_text(string query) 
    { 
     if (query.Contains("DELETE") || query.Contains("delete") || query.Contains("CREATE") || 
      query.Contains("create") || query.Contains("COPY") || query.Contains("copy") || 
      query.Contains("INSERT") || query.Contains("insert") || query.Contains("DROP") || 
      query.Contains("drop") || query.Contains("UPDATE") || query.Contains("update") || 
      query.Contains("ALTER") || query.Contains("alter")) 
     { 
      return false; 
     } 
     else return true; 
    } 

が、これは編集セーフクエリをチェックする権利の方法であるか、これを達成するために、他の、より信頼性の高い方法は何ですか?

私はスーパーユーザーアカウントを持っていないので、ユーザーに権限を与えることについて知っていますが、それは機能しません。

答えて

9

これは、クエリをチェックするのではなく、データベースの読み取りアクセスのみを持つアカウントを使用して処理する必要があります。ほとんどのDBMSにはこの種の処理に特権機構があり、PostgreSQLは確かにそうしています。少し短いcomparsionため、この時

+0

で失敗し、私は私のプログラム – Moonlight

0

ルック: Case insensitive 'Contains(string)'

は、基本的にはそうでなければ、などを削除する(deleteの異なるバージョンを確認するために多くのコードが必要になります(comparsionの大文字小文字を区別しません作る)

また、あなたは、そのを通じて多分少しクリーナーを禁止されたキーワードと、ループのリストを構築することができる?

ユーザーがこれらのキーワードで何かを照会する必要がある場合はどうなりますか?

SELECT IsDeleted FROM Users; 

クエリーの複雑さ(データベースのwhatsに基づいたドロップダウンの束?)に応じて、パラメータを許可したり、独自の「クエリービルダー」を構築することができます。

ほんの少しの提案。

ただし、可能な場合は、読み取り専用ユーザーに関する提案に従ってください。

+0

をhandelingの準備専用アカウントを取得しようと私はすべての90%を扱うことができる独自のビルドクエリの作成者を持っているalreaddyあなたが望むかもしれないものは、私は '挿入可能な'クエリを実装したいと思っていました。大文字小文字を使用する方法は、読み取り専用ユーザーが動作していないかどうかを確認する方法です – Moonlight

+0

linqの使用に関するポストは、この問題を処理するための良い選択のようです+可能です(しかし、私はあなたが最初にカスタムクエリを書く能力を必要としないと思います)。 – Sverker84

1

ユーザに決して良い考えで自分のクエリを入力させることはできません。それを行う唯一の安全な方法は、あなたには読めない権利(あなたがすることができないと言った)を与えることです。お問い合わせは、LINQを使用している動詞が含まれている場合は、あなたのコードスニペットについて

、より良い方法は確認する:

private readonly string[] verbs = new string[] 
    { "delete", "create", "insert", ... }; 

private bool check_unwanted_text(string query) 
{ 
    // convert to lowercase 
    query = query.ToLowerInvariant(); 

    // can any verb be found in query? 
    return verbs.Any(v => query.Contains(v)); 
} 

しかし、いや、私は、SQLの消毒のためにこれを使用することを検討していないでしょう。

1

特定のクエリがデータベースの内容を変更しているかどうかを確認するための、信頼性の高い一般的な方法はなく、クエリテキストのみに基づいています。次のように

SELECT * FROM myview; 

myviewが定義されています:

このクエリを考えてみ

CREATE VIEW myview AS select foo, bar FROM myfunc(); 
1

アカウントを作ることができない場合は読み取り専用で、あなたはまだ、特定の取引を行うことができます読み取りトランザクションの開始直後にSET TRANSACTION READ ONLY SQLコマンドを発行するだけです。 そして、このトランザクション内のデータを変更する試みが

ERROR: transaction is read only

+0

でも、その失敗を避けることはできません(ユーザーはクエリの後ろに置くことができます)。 (私はこれを使用していない私はいくつかの周りを回った後に私の読み取り専用のアカウントを持っているので) – Moonlight

関連する問題