7

強く型付けされたビューにTextAreaがあります。

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

私のコントローラーアクションは元々次のように見えました:

[HttpPost]
public ViewResult Index(MyViewModel vm)
{
    using (var db = new MyEntities())
    {
        Post p = new Post();
        p.Text = vm.Text;
        db.Posts.AddObject(p);
        db.SaveChanges();
    }
    return View();
}

これはうまくいきました。ユーザーがTextAreaに入力したテキストはコントローラーに渡され、EntityFrameworkを介してSQLServerのPostテーブルに保存されました。このフィールドのデータ型はvarchar(1000)です。([StringLength(1000)]検証でMetadataTypeを使用するTextフィールドのモデル検証もあります。)

HTMLソースをコピーしてTextAreaに貼り付けて送信しようとすると、次のエラーが発生することに気付きました。

「潜在的に危険なRequest.Form値がクライアントから検出されました」

エラーは私をこの質問に導きました、そしてそこからの持ち帰りは私が単に追加することができるということでした

[HttpPost, ValidateInput(false)]

そのタイプの検証を停止するための私のアクションに。これは素晴らしく機能しましたが、驚いたことに、TextAreaに何を入れようとしても、問題は発生しませんでした。引用符で囲まれたjavascript、html、またはT-SQLステートメントを貼り付けても、正常に機能します。TextAreaに入力した正確な文字がSQLテーブルに表示され、テキストをビューに戻すと、ソースで各文字が対応するHTMLに変換され、画面の表示は次のようになります。私がそれを入力したとき、それはしました。私はこれを達成するためにどんな種類のテキスト変換もしませんでした。デフォルトでは、すべてが希望どおりに機能しているようです。もちろん、私はこれを喜んでいますが、検証を無効にすることについて読んだとき、これを行うことの結果を理解する必要があるという警告が続くことがよくあります、そして、私はそうは思わない。だから私は、結果はどうなるのだろうか?入力検証を無効にした結果として物事を台無しにする可能性のある誰かが私のTextAreaに入力する可能性があるものはありますか?

関連する場合、私の特定のセットアップはMVC4、.NET 4.0、Entity Framework 4.4、SQL Server2012Expressです。

4

1 に答える 1

9

かみそりを使用している場合、出力するテキストは自動的にエンコードされ、ブラウザにはテキストとして表示されますが、JavaScriptなどとしては解釈されません。

検証をオフにする場合は、表示する場所ですべてのユーザー入力をエンコードしていることを確認する必要があります。これにより、ユーザーが入力した何かが原因でページ上で誤ってJavaScriptを実行しないようにします(いくつかの例についてはXSSを参照してください)。 。

データベース内のさまざまなvarcharフィールドに何らかのjavascriptalert('hello')呼び出しを追加して、ページにアクセスしたときに呼び出されるかどうかを確認することで、すばやくテストできます(全数検索ではありません)。

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

エンティティフレームワークのようなものを使用している場合でも、たとえば、ストアドプロシージャを使用し、入力に対して検証チェックを実行しなかった場合は、SQLインジェクションから保護されません。これに関するTroyHuntの記事を参照してください

于 2013-02-25T04:22:36.933 に答える