ここで考慮すべきことがいくつかあります。まず、一般的なXSSパターンの多くをキャッチするASP.NETリクエスト検証があります。これだけに頼らないでください、しかしそれはちょっとした付加価値です。
次に、入力をホワイトリストに対して検証する必要があります。この場合、ホワイトリストは、URLの予想される構造に準拠することを目的としています。RFC2396およびRFC273に準拠するために、Uri.IsWellFormedUriStringを使用してみてください。
var sourceUri = UriTextBox.Text;
if (!Uri.IsWellFormedUriString(sourceUri, UriKind.Absolute))
{
// Not a valid URI - bail out here
}
AntiXSSにはEncoder.UrlEncodeがあります。これは、URLに追加される文字列、つまりクエリ文字列をエンコードするのに最適です。問題は、元の文字列を取得し、スラッシュなどの文字をエスケープしたくないということです。http://troyhunt.com
そうしないhttp%3a%2f%2ftroyhunt.com
と、問題が発生します。
エンコードするコンテキストはHTML属性(設定している「href」属性)であるため、Encoder.HtmlAttributeEncodeを使用します。
MyHyperlink.NavigateUrl = Encoder.HtmlAttributeEncode(sourceUri);
これが意味するのは、のような文字列http://troyhunt.com/<script>
がエスケープされるということですhttp://troyhunt.com/<script>
-しかしもちろん、RequestValidationはとにかく最初にそれをキャッチします。
また、OWASPトップ10の未検証のリダイレクトと転送もご覧ください。