2009-05-14 1 views
2

私はC#正規表現を使用してWeb入力に許可された文字のホワイトリストを実装するいくつかの問題に遭遇しました。私はSQLインジェクションとXSS攻撃を避けようとしています。私は許可された文字のホワイトリストが行く方法であることを読んだ。C#正規表現でホワイトリストを使用して名前(人および企業)を拒否する方法は?

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

問題のいくつかは、次のとおりです。アンパサンドを持って

  1. 会社名。 「ジム&サンズ」のように。アンパサンドは重要ですが、それは危険です。

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

  3. 企業名には、「S/A」や「S \ A」などのすべての種類のスラッシュを使用できます。それらは危険ですか?

DBにあるすべてのデータを見た後(新しいユーザーが入力した)ほとんどすべての文字を許可したいと思っています。

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

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

+0

[これをEnableClientScript =「偽」 SOスレッド](http://stackoverflow.com/questions/188870/how-to-use-c-to-sanitize-input-on-an-html-page)は類似していると思われます。 –

答えて

4

This SO threadインジェクション攻撃から身を守るには良い議論をたくさん持っています。要するに

  1. することができます、
  2. SQL文お使いの場合には

をパラメータとして最高のあなたが フレームワークに基づいた方法を使用して文字列をエスケープ

  • することができ、あなたの入力をフィルタリング名前フィールドを小さな文字セットに制限します。会社の分野はより困難になり、ユーザーはサイトのセキュリティの必要性に応じて、自由にエントリーできるようにする必要があります。他の人が言っているように、独自のカスタム衛生方法を書こうとするのは難しく、危険です。シンプルにして、あなたのアーキテクチャーを守りましょう。衛生措置の後でさえも、文字列を単に「安全」に頼るだけではありません。

    EDIT:

    明確にするために - あなたはホワイトリストを開発しようとしているならば、それはそれはあなたが望むデータに完全に依存しますので、コミュニティは、配ることができるものではありません。しかし、おそらく名前の正規表現ホワイトリストの例を見てみましょう。私がA-Zとa-zとスペースをホワイトリストに入れたとします。

    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 
    

    この機能がさらに役立ちますように!名前と会社名では厳しい検査パターンを開発するのは難しい時がありますが、ここで示したように単純な許容文字リストを作成できます。

  • +0

    ステップ1は私が把握しようとしているものです。参照された記事はホワイトリストを言及しています。 –

    +0

    >>ホワイトリストを作成しようとすると、コミュニティが提供できるものではなく、コミュニティが手助けできるものだと思います。 私は人々の名前をホワイトリストに登録しようとしています。ほとんどの人はそれらを持っています:)それはいくつかの異国的で珍しいことではありません。私はあなたのアプローチに同意します。私はちょうど "reWhiteList"を把握する必要があります –

    2

    企業名にはほとんどすべての種類の記号が含まれている可能性があるため、これがどの程度うまく機能するのか分かりません。私はあなたの弦が「自然に」安全であることを望むのではなく、さまざまな攻撃から自分自身を直接遮蔽することに集中します。

    (確かに、彼らはアンパサンド、コロン、セミコロン、感嘆符、ハイフン、パーセント記号、およびコンテキストのホストで「安全でない」可能性があり、他のあらゆる種類のものを持つことができます。)

    3

    にしようとしないでください特にregexを使って名前をサニタイズする!

    ちょうど私があなた自身の正規表現を書くことは良いアイデアではないと思うあなたが適切な値をエスケープして、DBに安全に保存されていることを確認し、HTMLに

    0

    を提示するとき、それらはそれらをバックエスケープ:それは次のようになりとても厳しい。あなたのWebフレームワークの既存の機能を活用してみてください。ネット上には多くのリソースがあります。あなたは、C#を言うなら、私はあなたがASP.NETを使用していると仮定し、以下の記事を試してみてください。 How To: Protect From Injection Attacks in ASP.NET

    1

    なぜデータをフィルタリングするか、正規表現するか、エスケープするかのいずれかを選択するには、バインド変数を使用してデータベースにアクセスする必要があります。ときにそれが設定されていないので、あなたのSQLコードは変数を解析していないので、何も「OR 『X』 =」X

    そして、あなたのアプリケーションは気にしません:

    この方法では、顧客は次のように入力することができますステートメントを準備する。私。

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

    これらの変数を設定してコードを実行します。

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

    +0

    彼らはまだjavascriptを入力してXSS攻撃をすることはできませんか? –

    +0

    また、データをブラウザに送信するときに、そのデータをhtmlエンコードする必要があります。 – dave4420

    0

    これは私の現在の正規表現WHITELIST社の会社名です。これらの文字の外側の任意の入力が拒否されています

    "^ [0-9 \ pを{L}「 - 、/ & \。] {0,50} $"

    \ pを{L}のマッチユニコード "レター"。したがって、アクセントとアジア文字はホワイトリストに登録されています。

    \ &は、潜在的にjavascriptの特殊文字を許可するため、少し問題があります。

    SQLインジェクションのために、パラメータ化されたクエリを使用しない場合、\ 'は問題になります。

    - は " - "を許可する可能性があり、パラメータ化されたクエリを使用しない場合はSQL注入の可能性もあります。

    また、\ pを{L}は、クライアント側の検証を無効にすることなく、あなたがASP.NET正規表現のバリデータでそれを使用することはできませんので、クライアント側に動作しません。

    関連する問題