2012-04-14 26 views
0

クライアントの検証にのみ依存しないことについて多く書かれています。これはユーザーにとって便利な機能であり、サーバーの処理を軽減します。これは、この質問が何であるかではありません。ASP.NET MVC JQueryデータval-regex-patternセキュリティ

これはASP.NET MVCまたはすべてのJQuery検証に固有のものかどうかわかりませんが、これは私の質問がどこから来るかです。 ReqularExpressionAttributeをclientsidevalidationを有効にして使用すると、HTMLの出力は基本的な例を投げるためにdata-val-regex-pattern = "^ [0-9a-zA-Z] {3,12} $"のように出力されます。

これはあまり安全ではないので、あなたの式がチェックしているものを明示的に示していますが、チェックしていませんか?ユーザーが正確に何を正確に読むことができる場合、検証スキームでホールを利用するほうがずっと簡単なようです。そして、サーバが使用するのと同じ表現であるため、サーバが何をチェックするかを見ることができます。

UPDATE

私の例の式は、問題を説明するための非常に良いではありません。これは、非常に厳密なフォーマットを持つより複雑なデータ値についてのもので、間違いなくいくつかの抜け穴を見過ごしています。

+0

パターンを悪用した結果がどのようなものかによって異なります。それがフィールドに置かれた唯一の検証で、検証を通過するものが壊滅的な副作用を引き起こす可能性がある場合は、追加の検証も追加します。 – SilverlightFox

答えて

0

検証する内容に応じてセキュリティホールになる可能性があります。しかし、N層アプリケーションのほとんどの場合、フロントエンドモデルはバックエンドモデルとは異なります。そして、あなたのバックエンドはまだそれを検証し、適切な例外をスローします。

unobstrusive検証に関するいくつかの情報:

jQueryのunobstrusive検証はデータ - 属性を使用しています。

あなたがunobstrusive検証をしたくない場合は、あなただけのweb.config

でそれを無効にすることができますweb.configファイルに行くと、これを発見してみてください。

<appSettings> 
    <add key="ClientValidationEnabled" value="true" /> 
    <add key="UnobtrusiveJavaScriptEnabled" value="true" /> 
</appSettings> 

をfalseにUnobtrusiveJavaScriptEnabled設定。しかし、それ以上の鍵があるかもしれません。

+0

それは部分的に私の主張でした。私はウェブサイトのクライアントレベルで検証します。バックエンドのデータサービスレベルでもう一度検証します。しかし、式を使って検証するプロパティがある場合、クライアント上でその式を使用することになります(これはユーザーに表示されます)。これはバックエンドで再度使用することになります。だから、彼らがあなたの表現の中で抜け穴を見つけたら(それを見て)、それを2回チェックするつもりですが、それは両方の時間を過ぎるでしょう。私の言っていることが分かるよね? – quitstalin

+0

もう1つのオプションは、正規表現をモデルに追加したり、HttpPostのコントローラの特定のプロパティを検証することではありません。コントローラからModelStateエラーを追加します。 –

1

説明していることは、あいまいさによるセキュリティです。つまり、攻撃者が攻撃方法を知らない場合、何かが安全であるという考えです。

これはセキュリティではなく、脆弱性が存在する場合は安全ではありません。 「あいまいさによる安全保障はまったく安全ではない」という言葉があります。

悪用されやすくなっていますか?たぶん、正直なところ、あなたのコードを修正するのが解決策です。

別の言い方をすると、攻撃者が誤って脆弱性を突き抜けてしまう可能性があります。あなたはまだ脆弱で、それはまだ安全ではありません。

+0

絶対に正しいですが、依然として脆弱性が存在します。しかし、私はそれが私の質問をあまり有効ではないと思って、それが搾取しやすい傾向にあると思う。私は、「不明瞭なセキュリティ」に何かがあると思います。人間の要素があります。人間は理由のために物事に導かれる。私はそれらを与えないようにしています。あなたは簡単に "あなたのコードを修正する"と言うことができますが、あなたのコードに修正が必要かどうかをどのように知っていますか?私が知っていれば、私はそれを修正するだろう。彼らが単体テストについて言うようなものです。すべてのテストは合格しますが、コードが完璧であることを意味しますか?いいえ、テストが完璧であることを意味します。そして、あなたは自分の考えを超えていることをテストすることはできません。 – quitstalin

+0

@quitstalin - 搾取しやすい!=あまり安全ではない、あなたが見逃した部分です。一例として、15年前、バッファオーバーランは悪用するには複雑すぎると考えられていました。数年前に早送りし、それを利用する知識が一般化したので、最も一般的な悪用方法でした。その間にコード内で変更されたものはありません。知識だけです。コードは今日のように安全である(または安全でない)。つまり、それが悪用されたことがどれほど簡単かにかかわらず、常に安全ではなかった –

+0

私は同じことを言っていませんでした。私は、より搾取しやすい傾向が同じくらい重要であると提案しました。私はあなたに例を挙げます。数年前、私は小さな会社のために働いていました。私の「友人」は私が働いた場所を私に尋ねました。私は彼に言った、彼は以前それを聞いたことがなかった。しばらくして私は彼が私たちのサイトに行って私たちのシステムを使いこなそうとしていたことが分かりました。私が働いていた場所に彼に言わなかったら、彼はその会社をターゲットにしていただろうか?彼が聞いたことのない会社?私は賭けないだろう。それは私が意味することです、人間の要素があります。彼は彼の悪行に座ったとき、その考えは理由のために頭の中に突っ込んだ。 – quitstalin

0

この質問をして1年後、私は以前の自分に言えば、検証の目的は入力されたデータの種類を検証することであり、要求を検証することではないと私は考えます。したがって、これは心配する問題ではありません。

関連する問題