2011-01-18 6 views
1

レポートに手動でクエリを入力できるレポートページがあります。 INSERT、UPDATE、またはDELETE文をブロックするにはどうすればよいですか?SELECTのみを実行しますか?sqliteをINSERT、UPDATEではなくSELECTステートメントのみを実行するように制限する方法

using (var connection = new SQLiteConnection(connectionString)) 
      { 
       var da = new SQLiteDataAdapter 
       { 
        SelectCommand = new SQLiteCommand(query, connection) 
       }; 
       try 
       { 
        da.Fill(table); 
       } 

クエリ文字列は、「INSERT」、「UPDATE」または「DELETE」が含まれている場合、私がチェックできるが、私はそれは良い習慣だとは思いません。

+4

...私は今、sqliteのと何もしていないが、私はそれがトリックを行うべきだと思うことはありますこれは、読み取り権限のみを持つ接続を使用して処理できない理由ですか? – Sorax

+1

@Sorax - sqliteにユーザーと権限がないと思った。読み取り専用セッションはどのように作成しますか? –

答えて

1

EXPLAINステートメントを使用すると、クエリをVM命令に分解し、出力のopcode列を調べることができます。値"OpenWrite"が発生した場合、クエリは読み取り専用ではありません。

+0

ありがとうございます。私はDROPのような他の悪意のあるコマンドによって可能なので、これを選んだ。 –

1

クエリ文字列を確認するのは良い方法ではありませんか?何に比べて?ユーザーがレポート・ページに必要なSQL文を入力できるようにしますか?私はそれよりもずっと悪い習慣を考えることはできません。あなたがそのようなことを許すつもりなら、どういうわけか彼らが入力するステートメントのタイプを制限する必要があり、おそらくWhere句が返されます(何百万もの行が返されるのを避けるため)。

+0

データベース内に読み取り権限のみを持つユーザーを作成することをお勧めします。しかし、私はsqliteがユーザ/権限をサポートしているとは考えていません。そのため、ユーザは質問をしています。 OPが話している悪い習慣は、ユーザーが入力する可能性のあるあらゆる悪意のあるものを推測しようとしていることです。これをしようとすると、困ったことをしています。 –

1

実際にクエリ変数のselect以外のものを持つデータアダプタでテーブルを埋めるとどうなるか確認してください。私はあなたが空のテーブルやデータセットを得ることは疑いがありますが、私はトランザクションをロールバックすることができる場合は例外が予想されます。

私はとにかく上記のSoraxで示唆したように読み取り専用で接続を作成しようとしますが、実際にはクエリ変数も解析します。

+0

はい、私はINSERT文を試して、データベースに行を挿入しました。 –

0

SQliteデータベースは単なるファイルなので、私はファイルシステムを通してデータベースを読み取り専用にすることができます。もちろん、これは素晴らしい解決策ではありませんが、コードを必要としないソリューションです(もちろん、書き込みが不可能な場合に例外を投げる場合を除いて)。

+0

Webインターフェイスを使用して、管理者が書き込み可能である必要があります。もしそうなら、これは動作しません。 – finnw

0

A)読み取り専用接続を使用してください - 私はそれがほとんどの最善の解決策

Bになると思います)入力として1つのTextBox以上のものを使用します(これは挿入などの文字列をチェックするようなより多くの解決策になるだろう。)例

SELECTの

| _ ___ |から| __ _ __ _ ___ |どこに| __ _ __ _ _ |

編集:ちょうどhttp://www.sqlite.org/c3ref/open.htmlで特に話題「SQLITE_OPEN_READONLY」を見て、あなたのコメントに答えるために -

+0

どのように読み取り専用接続を作成しますか? –

関連する問題