2013-02-25 10 views
7

私はもともとこれに似た見えたMVC副作用は

@Html.TextAreaFor(x => x.Text) 

私のコントローラのアクションで定義された私の強く型付けされたビュー内のTextAreaを持っていますこれはうまくいった。ユーザーがTextAreaに入力したテキストは、コントローラに渡され、Entity Framework経由でSQL ServerのPostテーブルに保存されました。このフィールドのデータ型はvarchar(1000)です。 ([StringLength(1000)]検証でMetadataTypeを使用するテキストフィールドのモデル検証もあります)。

一部のHTMLソースをコピーしてTextAreaに貼り付けて送信しようとすると、次のエラーが:

エラーがthis questionに私を導いた

「潜在的に危険のRequest.Form値がクライアントから検出された」、と私は単純に追加できるということがあったから奪う

[HttpPost, ValidateInput(false)] 
そのタイプの検証を停止するには、私のActionに

これは素晴らしく機能しましたが、私がTextAreaに何を入れようとしても、問題は発生しませんでした。私がjavascript、html、またはT-SQLステートメントを引用符で囲んで貼り付けると、それでも問題なく動作します。私は、SQLテーブルに表示されるTextAreaに入力された文字が正確に表示されていることを確認し、テキストを表示に戻すと、ソース内で各文字がHTMLに変換され、画面上の表示が私がそれを入力するとしました。私はこれを達成するためにテキスト変換を何もしませんでした。私がそれを望むように、デフォルトではすべてが正確に動作しているようです。もちろん、私はこれをうれしく思いますが、検証を無効にすることについて読んだときに、これを行うことの結果を理解する必要があるという警告がしばしば続き、私はそうは思わない。だから私は不思議です、結果は何ですか?入力検証を無効にした結果、誰かがTextAreaに入力する可能性のあるものがありますか?

関連する場合は、MVC4、.NET 4.0、Entity Framework 4.4、SQL Server 2012 Expressです。

答えて

9

あなたが検証をオフにしている場合は、など、あなたの出力は自動的にブラウザ内のテキストとして表示されるエンコードされますが、JavaScriptのように解釈されない任意のテキスト

かみそりを使用している場合は非常に注意する必要がありますすべてのユーザー入力をエンコードして確実に表示するようにして、ユーザーが入力した情報(例についてはXSSを参照)のために誤って一部のjavascriptを実行しないようにします。

データベース内のさまざまなvarcharフィールドにjavascript alert( 'hello')コールを追加して、ページにアクセスしたときに呼び出されるかどうかを確認することで、徹底的に(完全な検索ではありませんが)テストできます。

また、ユーザーデータを表示していない場合でも、データアクセスの仕方によっては影響を受ける可能性があります。

エンティティ・フレームワークのようなものを使用しても、ストアド・プロシージャを使用し、入力の検証チェックを行わなかった場合など、SQLインジェクションから保護されません。 Troy Huntのarticleを参照してください。

+0

ありがとうございました。正確に私が探していた情報の種類。 – TTT

+0

がリンクを追加しました、それはもともとそれをしたことを誓う! –