-1

正規表現で困っています。

クエリ文字列で preg_match を使用しようとしています。'または`の間にあり、シーケンスと 2 つの記号の間に任意の数の文字がある大文字と小文字 (?i) に関係なく、ドロップまたは切り捨てのシーケンスを除外したいが、これらの 2 つの単語のいずれかをキャッチしたいは 2 つの記号の間にありません。

まだ推測していない場合は、入力が DROP | を試みているかどうかを検出したいと思います。何でも TRUNCATE しますが、悪意のない入力からそれらの単語を除外せずにそれを行う簡単な方法はありません。

例えば

これがトリガーされないようにしたい:

SELECT * FROM `drop`
SELECT * FROM 'drop_truncate' -- drop drop

しかし、これはトリガーします:

DROP TABLE `users`

編集:私の質問は正規表現に関するもので、データベースのセキュリティに関する回答を受け取りました。間違いなく、誤解を招いて申し訳ありません! いいえ、ここではデータベースのセキュリティについては気にしません。ここでは、ドロップまたはトランケートを使用する意図を確認し、それをどこかに記録することだけが目的でした。はぁ

4

2 に答える 2

3

データベースのセキュリティを完全に間違った方法で処理しています。

この声明はここにありますが、それを行う簡単な方法はありません。あなたは、トンネルビジョンの非常に狭い考え方でこの入力を「保護」しようとしているだけです。

ユーザーがユーザー定義のSQLを入力してクエリを壊すことを許可しないでください!!

少なくとも準備されたステートメントを調査してください。PHP.netには、PDOライブラリの説明に関する優れたスターターがあります。私は非常に**非常に*反対することをお勧めしますが、それが最善の行動であると本当に思う場合は、 AD7six"use preg_match to prevent malicious query intent"の回答を参照してください。(ヒント:そうではありません)。

于 2012-05-15T16:15:33.353 に答える
1

同じログインでアプリケーションクエリとユーザー生成クエリを実行するように見えます。これにより、ユーザー定義のクエリの健全性チェックが強制されます。

ここにある多数の回答とコメントを信頼してください。あなたは失敗します。あなたが思いついた巧妙な健全性チェックが何であれ、誰かがそれを越えて危険な何かをこっそりと忍び込む方法を見つけるでしょう。

したがって、彼らがあなたの健全性チェックを超えて何かを得ていると仮定します。どうすれば身を守ることができますか?
-データベース自体の権限を制限します。


同じログインですべてのクエリを実行する代わりに、ユーザーが生成したクエリ専用の個別のログインを用意します。

そのログインに対する他の権限のCREATEおよびDROPおよびEXECUTEを拒否します。選択させたくないデータへのSELECT許可を拒否します。DBで許可されていることをすべて使用して、新しいログインで実行できることと実行できないことを制御します。

少なくとも2つの異なるログインを使用することで、次のことが可能になります...-
アプリケーションのログインは、必要なすべてのことを実行
できます-user_generated_queryログインは、不要なことを実行できません

于 2012-05-15T16:48:26.597 に答える