2016-07-05 15 views
1

私は人々がテーブルの数とデータベースの数に任意のselectクエリを行うにはしたいと思いシステムを持っています。内部SELECTクエリを使用して任意のSQLを「サニタイズ」しますか?

私は、すなわちSELECT * FROM ($USER_SELECT_QUERY)単にサブクエリでそれらを埋め込むことによって、クエリを「サニタイズ」することはできますか?

これは、クエリなど、ユーザーがどのような種類のSELECTクエリを実行できるようになるが、どのINSERTに構文エラーを生成する、UPDATEDELETEEXEC。データを変更/挿入/削除するか、ディレクトリリストなどのホストシステムに関する他の意図しない詳細を明らかにするあらゆる種類のクエリを考え出すことができますか?

仮定:

  • ユーザーが接続されているすべてのデータベース内のすべてのデータにアクセスすることができます。
  • クエリ時間とリソース使用状況の適切な設定/監視は、(D)DOS攻撃を軽減するための場所です。
  • (データベースには、私の場合は、読み取り専用のsqliteファイルがある)

また、私は、ユーザーが任意のSQLを実行することを可能にする一般的な危険性を十分に認識していたので、私は私が「ことを強調したいと思いますのでご注意ください特に、サニタイズクエリにselect-subqueriesを使用する際の制限について尋ねています。

+0

なぜセキュリティレベルとしてデータベースに読み取り専用アクセスをするユーザーを設定していませんか?これは不要な合併症のようです。 –

+0

私の推論は、許容されるステートメントの範囲を制限することでした。 'ATTACH'はsqliteで問題になる可能性があり、' EXPLAIN'や 'VACUUM'などの他の"奇妙な "文は、ユーザに許可されるべきものの範囲外です。 – jkgeyti

答えて

2

authorization callbackを使用し、これらのステートメントのほとんどを防ぐため。

また、任意の書き込みを防ぐためにsqlite3_stmt_readonly()を使用することができます。

危険なユーザー定義関数や仮想テーブルがないこと、およびload_extension()fts3_tokenizer()などの機能が無効になっていることを確認する必要があります。

関連する問題