2017-02-02 3 views
-3

データベース(SQLite3)で生のクエリを実行するためのSQLコンソールがあるDjangoでWebサイトを構築しています。SQLインジェクションが発生しやすい?

私はこれが危険なアイデアであることを知っています。なぜなら、私のむしろ控えめで頭取った解決策がうまくいくのではないかと思います。

私は、SELECT文だけを実行できるようにしたいので、データベース上でクエリが実行される前に、単に 'DROP'、 'UPDATE'または 'CREATE'という単語がチェックされていることを確認するassert文を作成していますクエリ文字列にはなく、もう1つは「SELECT」という単語が存在することを主張します。

これが満たされない場合、クエリは処理されていません。

ここで何か不足していますか?

+0

これでは不十分です。あなたはSQLインジェクションについて心配していますが、あなたのアプリケーションは文字通りSQLインジェクションだけです。データを変更しないようにするには、アクセスしているSQLアカウントに読み取りアクセスのみを許可し、必要なテーブルのみにアクセス権を設定します。 – Siyual

+1

明示的に 'ALTER'を除外する以外に、誰でもSQLで見つけたあらゆる可能性のあるセキュリティーホールを常に最新の状態に保つ必要があります。個人的には、私は寝ることができるようにしたい – Sayse

+0

私は、なぜこれをやりたいのですか?あなたの決定の背景は何ですか? – trixn

答えて

1

あなたのコードに十分な自信があれば、おそらくうまくいくでしょう。個人的に、私は決して自信を持っていることができませんでした。
ユーザまたはファイルレベルでパーミッションをカットするほうが良いかもしれません。また、sqliteにはユーザがまったくないので、ファイルレベルで書き込み機能を切ることができます。 hereから見
、それが常駐するデータベースやフォルダが書き込み権限を許可しない場合、彼らは、DELETE、UPDATE、INSERTを行うことができません、など

0

ビューのユーザーエクスペリエンスとセキュリティの観点から

(A)これは、自分のデータベースに接続する1人のユーザーについて話しているPHPAdminのようなアプリですか?

(B)すべてのユーザーがチームと同じテーブルで作業する閉じたアプリケーションですか、データが破損している場合、これは同じ方法ですべてのユーザーに影響しますか? Djangoの認証テーブルで釣り合ってお互いを相手にしたくないという自信がチームには本当に必要です。

(C)これは、各ユーザが独自のテーブルで作業する公に登録するためのアプリケーションであり、djangoにとって重要なテーブルに影響を与えることによってシステムを停止させる可能性はほとんどないはずです(auth_*など)。

これが(A)よりも(C)の場合は、これを行わないでください。むしろ(A)よりもむしろ(B)、それでは - むしろしないでください。これが有料のプロジェクトであり、データベースがスニッフィングされたり破損したりしないことを保証しなければならない場合、独自のSQLパーサーを作成して十分なセキュリティテストを行う必要はありません。また

ツールとしてのジャンゴで

、およびビジネスニーズに応じて、ユーザがDjangoのモデルを選択することができ、そこから複雑なフォームを作成するための有効な選択肢かもしれません(:= SQLテーブルを)とフィルタ(:= joins/where句)を使用して独自のレポートを作成します。

これはレポートツールについてのものです - あなたはDjangoの既存のレポートモジュールとDjango管理者が提供する可能性をチェックしたいかもしれません。

関連する問題