0

一部の管理者がテキストフィールドに SQL ステートメントを手動で入力できるようにしたいと考えています (統計データなどを取得するため)。データベース層では、選択のみ可能で更新/削除などはできないユーザーを作成してデータを保護しました。

DROP挿入された SQL に、 、などの不適切な単語がDELETEないかどうかをチェックして、2 つ目のセキュリティを追加したいと考えていますUPDATE。私は preg_match でそれを行う方法を見つけましたが、 aDROPと次のようなものを区別できるスマートなスクリプトが欲しいですWHERE name = 'DROP 1'

編集:管理者がそのようなステートメントを使用しようとすると、ログに記録したいと思います。そのため、この第 2 レベルのセキュリティ チェックが必要です。これは説明のためです。

この例に適合する切り取られたコードを知っている人はいますか?

ありがとう!!

4

4 に答える 4

10

新しい応答

探しているものを明確にするために質問を更新したので、別の解決策を提供したいと思いました。ユーザーがクエリとして何を送信するかについて心配する必要はありません。ユーザーが何かを行うのに十分な権限を持っていない場合、MySQL はエラーを返します。

そのエラーを でキャプチャしmysql_error()、エラー番号を でキャプチャしますmysql_errno()。エラー メッセージに「DROP コマンドが拒否されました...」と表示されるか、エラー番号が1142の場合は、彼らがいたずらを試みたことがわかります。このエラー内の用語を探すことは、クエリで用語を探すよりも優れています.

元の応答

ユーザーが しかできない場合、またはSELECTはできません。データベースは、その特定のユーザーに対して明示的に許可されていないクエリを拒否するため、これらの単語を探しても、混合物にセキュリティが追加されることはありません。DROPDELETE

于 2010-01-25T22:18:35.603 に答える
3

SQL のような複雑なものには正規表現を使用しません。

まず、PHP で使用できる SQL パーサーを確認し、そのうちの 1 つを使用して、使用されている SQL ステートメントを解析および分析します。

次のいずれかを試してください。

http://pear.php.net/package/SQL_Parser

http://sourceforge.net/projects/osqlp/

于 2010-01-26T01:31:08.843 に答える
1

これは、このレベルのセキュリティを導入する場所としては間違いなく間違っています。データベースをセットアップして、SELECT 権限しか持たない限り、データを変更することはできません。ただし、データを変更できる権限を付与すると、SQL ステートメントのセマンティック チェックをいくら行ってもセキュリティが確保されません。

于 2010-01-25T22:26:56.690 に答える
0

統計データ用のコマンドを作成し、管理者がそれらのコマンドを呼び出せるようにしないのはなぜですか? それは簡単ではありませんか?

管理者が意図的に危害を加えるとは言っていませんが、それが起こる可能性があります!

于 2010-01-25T22:22:49.087 に答える