2

C# 正規表現を使用して、Web 入力で許可されている文字のホワイトリストを実装する際に、いくつかの問題に遭遇しました。SQL インジェクションと XSS 攻撃を回避しようとしています。許可された文字のホワイトリストが進むべき道であることを読みました。

入力は人名と会社名です。

問題のいくつかは次のとおりです。

  1. アンパサンドを含む会社名。「ジム&サンズ」みたいな。アンパサンドは重要ですが、危険です。

  2. 名前に Unicode 文字を使用 (たとえば、アジアの顧客がいます)。文字セットを使用して名前を入力します。これらすべてをホワイトリストに登録する必要があります。

  3. 会社名には、「S/A」や「S\A」など、あらゆる種類のスラッシュを含めることができます。それらは危険ですか?

DB に既にある (そして新しいユーザーによって入力されている) すべてのデータを確認した後、ほぼすべての文字を許可したいと思っています。

これら (およびその他) の問題を処理する適切なホワイトリストに関する提案はありますか?

注: これはレガシー システムであるため、すべてのコードを制御することはできません。そもそも不正なデータがシステムに侵入するのを防ぐことで、攻撃の数を減らしたいと考えていました。

4

6 に答える 6

4

この SO スレッドには、インジェクション攻撃から身を守ることについて多くの良い議論があります。

要するに:

  1. 入力をできる限りフィルタリングします
  2. フレームワーク ベースのメソッドを使用して文字列をエスケープする
  3. SQL ステートメントをパラメーター化する

あなたの場合、名前フィールドを小さな文字セットに制限できます。会社の分野はより難しくなり、サイトのセキュリティの必要性とユーザーの入場の自由の必要性を考慮し、バランスを取る必要があります。他の人が言ったように、独自のカスタム サニテーション メソッドを作成しようとするのはトリッキーで危険です。サニタイズ後であっても、文字列が「安全」であることに単純に依存しないでください。

編集:

明確にするために-ホワイトリストを作成しようとしている場合、それは必要なデータに完全に依存しているため、コミュニティが配布できるものではありません. しかし、おそらく名前の正規表現ホワイトリストの例を見てみましょう。AZ と az と space をホワイトリストに登録したとします。

Regex reWhiteList = new Regex("^[A-Za-z ]+$")

文字列全体がそれらの文字で構成されているかどうかを確認します。数字、ピリオド、引用符などを含む文字列は、この正規表現と一致しないため、ホワイトリストに失敗することに注意してください。

if (reWhiteList.IsMatch(strInput))
   // it's ok, proceed to step 2
else
   // it's not ok, inform user they've entered invalid characters and try again

うまくいけば、これはもう少し役立ちます!名前と会社名を使用して、チェックする厳密なパターンを開発するのは困難から不可能ですが、ここで示したように、単純な許容文字リストを作成することはできます。

于 2009-05-14T21:47:39.317 に答える
3

特に正規表現を使用して、名前をサニタイズしようとしないでください。

値を適切にエスケープしてDBに安全に保存していること、およびHTMLで表示するときに値をエスケープしていることを確認してください

于 2009-05-14T21:34:14.747 に答える
2

会社名にはほとんどすべての種類の記号が含まれている可能性があるため、これがどの程度うまく機能するかはわかりません. あなたの弦が「自然に」安全であることを期待するのではなく、さまざまな攻撃から直接身を守ることに集中したいと思います。

(確かに、アンパサンド、コロン、セミコロン、感嘆符、ハイフン、パーセント記号など、多くのコンテキストで「安全でない」可能性のあるあらゆる種類のものを使用できます。)

于 2009-05-14T21:23:17.597 に答える
1

データをフィルタリングまたは正規表現したり、エスケープしたりする理由は、バインド変数を使用してデータベースにアクセスする必要があるためです。

このようにして、顧客は次のようなものを入力できます: any' OR 'x'='x

また、ステートメントを準備するときに変数が設定されていないため、SQL コードが変数を解析しないため、アプリケーションは気にしません。いえ

'SELECT count(username) FROM usertable WHERE username = ? and password = ?'

次に、それらの変数を設定してそのコードを実行します。

これは、PHP、PERL、J2EE アプリケーションなどで機能します。

于 2009-05-15T03:25:35.277 に答える
0

独自の正規表現を書くのは得策ではないと思います。非常に難しいでしょう。Web フレームワークの既存の機能を活用してみてください。ネット上にはたくさんのリソースがあります。C# と言う場合は、ASP.NET を使用していると思います。次の記事を試してください: How To: Protect From Injection Attacks in ASP.NET

于 2009-05-14T21:37:01.747 に答える
0

これは、会社名の現在の正規表現ホワイトリストです。これらの文字以外の入力は拒否されます。

"^[0-9\p{L} '\-\.,\/\&]{0,50}$"
  • は、\p{L}任意の Unicode「文字」に一致します。したがって、アクセントとアジアの文字はホワイトリストに登録されています。

  • これ\&は、JavaScript の特殊文字を許可する可能性があるため、少し問題があります。

  • パラメータ化された\'クエリを使用しない場合、SQL インジェクションが原因で問題が発生します。

  • パラメータ化されたクエリを使用しない場合、SQL インジェクションの\-可能性もある「--」が許可される可能性があります。

また、\p{L}クライアント側では機能しないため、クライアント側の検証を無効にしない限り、ASP.NET 正規表現バリデーターで使用することはできません。
EnableClientScript="False"

于 2009-05-16T16:46:48.277 に答える