そこで、フォーム要素で GET を使用し、それを cshtml ページにポイントすることにしました。(予想どおり) 渡されたフォーム値が自動的に URL エンコードされることがわかりました。
しかし、その後、山かっこがエンコードされているかどうかをテストすることにしました。驚くべきことに、WebMatrix バリデーターが危険な値が渡されている可能性があることを警告するサーバー エラーをスローしたときにエンコードされていないことがわかりました。
私は自分に言い聞かせましRequest.Unvalidated["searchText"]
たRequest.QueryString["searchText"]
。Request.Unvalidated
JavaScript を URL に変換するので、これについて心配する必要があるかどうかわかりません. アポストロフィ、引用符、括弧、およびその他の多くの JavaScript 特殊文字がエンコードされていることに気付きました (実際、山かっこが含まれているかどうかさえわかりません)。 JavaScript または URL で特別な意味を持ちますが、両方ではないにしても、おそらくどちらかで機能します. C# でリストを表すのに役立つことは知っていますが、いずれにしても、スクリプト タグを使用して取得する方法を見つけることができれば、それを使用してスクリプト タグを記述できます。 HTMLページなので、WebMatrixのバリデーターがそれらを見ると叫ぶのはそのためだと思います)。
このフォームを送信する別の方法を見つける必要がありますが、ユーザー データを自分で傍受してエンコードすることはできますRequest.Unvalidated
か? それとも、この場合、心配なく使用しても問題ありませんか?
すでにお気づきかもしれませんが、私の質問は WebMatrix C#.net 環境からのものです。
おまけの質問 (時間を節約したいと思っていて、頭のてっぺんから答えを知っている場合): Request.Unvalidated
will I を使用する場合、値を URL デコードする必要がありますか、それとも自動的に行われますRequest.QueryString
か?
- - - - - - - - - - - - - -アップデート - - - - - - - - - - - ------
ユーザーが「searchText」に山かっこを含めたという理由だけで、YSOD もカスタム エラー ページも表示したくないことがわかっているので、Request.Unvalidated
いずれかの方法を使用する必要があり、値が到達したら必要なものをエンコードできることがわかっています。 cshtml ページ。
したがって、質問は次のようになると思います:山かっこだけに基づく URL 内での XSS 攻撃 (またはその他の脅威) の可能性について心配する必要がありますか?
また、これが関連する場合:
実際、私が使用している値 (つまり、「searchText」) は、データベース内の多くのテーブルをクエリする (かなり複雑な) SQL クエリを介して値が実行される cshtml ページに直接移動します (JOINS と UNIONS の両方、およびエイリアスを使用します)。および関数ベースの計算) を使用して、該当する各フィールドで「searchText」に対して見つかった一致の数を決定します。次に、これらすべての一致のページの場所を記憶し、関連性 (見つかった一致の種類と数によって決定) に基づいて検索結果の順序を決定し、最後に C# を使用して検索結果を (もちろんリンクとして) ページに書き込みます。
また、データベースの値には山かっこが簡単に含まれる可能性があることに注意することが重要だと思います。これまでのところ安全であることはわかっていますが (HTML エンコーディングのおかげで)、実際にそれらに対して「検索」する必要はないかもしれません。どうすればセキュリティと機能を最大限に期待できるかについて混乱していますが、いずれかの方法を選択すると、手遅れになるまで間違った決定を選択したことに気付かない可能性があります...