3

残念ながら、MySQL WHERE 句で使用する正規表現をユーザーが提供する必要があるサイトを作成しています。そしてもちろん、SQL インジェクションを防ぐためにユーザー入力を検証する必要があります。このサイトは PHP で作成されており、次の正規表現を使用して正規表現を確認しています。

/^([^\\\\\']|\\\.)*$/

これは、PHP の正規表現の処理方法のため、二重にエスケープされています。動作するはずの方法は、エスケープされていない単一引用符なしで、安全な正規表現のみに一致することです。しかし、ほとんど独学なので、これが安全な方法であるかどうかを知りたい.

4

3 に答える 3

9

プリペアドステートメントを使用する場合、SQLインジェクションは不可能になります。プリペアドステートメントを常に使用する必要があります。

Roborgは、高価な正規表現については優れた点を示しています。

于 2008-10-19T14:03:33.847 に答える
2

文字列をmysql_escape_stringまたはmysql_real_escape_stringに渡すだけです。

ただし、古い正規表現を受け入れることには慎重です-それらのいくつかは長時間実行でき、DBサーバーを拘束します.

パターン構文から:

入れ子になった無限の繰り返しを含むパターンに注意してください。一致しない文字列に適用すると、実行に時間がかかる場合があります。パターンフラグメント (a+)* を考えてみましょう

これは 33 通りの方法で "aaaa" に一致し、文字列が長くなるにつれてこの数は急速に増加します。

于 2008-10-19T12:09:20.780 に答える
-2

この reg 式を表示するだけの場合、ほとんどのプログラムは単純に値を Html エンコードして DB に格納し、途中でデコードします。これも表示目的のためだけですが、提出された正規表現を使用する必要がある場合、これは機能しません。

また、注入しようとする人がそこに SQL を書き込み、それを varbinary に変換し、過去にヒットしたクエリの base 64 表現で exec コマンドを送信する方法があることも知っています。

于 2008-10-19T12:08:22.170 に答える