これはちょっと不満ですが、最後に本当の質問があります。
最近、サイトに名前のない新しいPerlスクリプトをインストールしましたが、エラー403で不思議な失敗をしました。最終的に、Apacheエラーログでこのエラーの手がかりを見つけました
[エラー] mod_security:アクセスがコード403で拒否されました。REQUEST_URIでのパターン一致 "select。+ from" [重大度 "EMERGENCY"]
これは、 "select"の後に "from"が続くHTTPリクエストを拒否することによる、SQLインジェクション攻撃を防御するためのまったく単純な試みからのものであると私は考えています。
明らかに、パターンははるかに複雑になる可能性がありますが、アプローチ全体が破産したように見えます。問題は、実際に機能する可能性のある一般的なアプローチがあるのか、それとも実際のデータベース操作により近い方法で行う必要があるのかということです。
SQLインジェクションを防ぐ唯一の一般的なアプローチは、準備されたステートメントとも呼ばれるパラメーター化されたクエリを使用することです。これらは基本的にプロトコルレベルでクエリ言語からデータを分離するため、DBMSソフトウェアはパラメータからクエリ言語を解析しようとしません。
あなたが説明したメカニズムは、ブラックリストパターンでリクエストをフィルタリングしているように見えますが、これは必ずしも悪いことではありませんが(深層防御は良いです!)、クエリが適切に処理されている場合はかなり冗長に見え、実際のセキュリティ対策に取って代わることはできません。
ModsecurityのようなWebアプリケーションファイアウォールは、悪意のある入力からWebアプリケーションを保護するための運用セキュリティ対策にすぎません。 WAFは、各リクエストとレスポンスをWAFルールセットで提供された悪意のある署名と比較できるアプリケーションレイヤーフィルターにすぎません。 Modsecurity Core Ruleは、さまざまな攻撃のバリエーションに対して包括的な包括的なルールセットを提供します。 WAFの品質は、使用するシグネチャの品質に依存し、システム管理者が彼のニーズに合わせて調整し、誤検知の原因となっているルールを破棄しない限り機能しません。しかし、残念ながらこれにはいくつかの真剣な努力と深い知識が必要です。セキュリティを3つのフェーズに分類します
高セキュリティ環境の私の好みは、言語の翻訳を要求することです。つまり、私のアプリがPHPで記述されている場合、クエリパラメーターを非PHPアプリに渡してクエリを実行します。これにより、レイテンシと計算オーバーヘッドが追加されますThings That Matter(tm)を保護している場合、これは簡単に価値があります。
それが明確でない場合は、ユーザーからパラメーターを取得してサニタイズし、SQL DBに送信するのではなく、ユーザーからパラメーターを取得してサニタイズしてから、アンパッケージ、サニタイズ、再パッケージ化、送信するクエリサービスに渡します処理用のDB。このように、1つの言語、API、クエリクラスなどの脆弱性は、妥協を可能にするのに十分ではない可能性があります。何でも完璧にするのは難しいので、セキュリティはレイヤーで行うのが最善です。
多項式に応じて私の怒りから続く;)....
パラメーターのパラメーターを適切にエスケープすることは、非常に基本的な予防策です。パラメーターバインディングを使用することは、これを実現する1つの方法です。
データを保護するためのもう1つの(補完的な)アプローチは、ロジック層からセッションへの基になるデータとの直接のやり取りを禁止することです-WebサーバーアカウントがデータテーブルでSELECT/UPDATE/DELETE/INSERT ...などを許可しないようにしてください-代わりに、(権限を委任された)関数とプロシージャの実行を許可します。ただし、これには、手続き型言語/転送された権限をサポートしないデータベースに実装するための追加の層が必要です。
ALi Ahmadが言うように、あなたは自由にツールを設定して、うまく連携する必要があります。 one-config-fits-allの状況はありません。