这里有几件事需要考虑。首先,您有ASP.NET 请求验证,它将捕获许多常见的 XSS 模式。不要完全依赖于此,但这是一个不错的小增值。
接下来,您要根据白名单验证输入,在这种情况下,您的白名单就是要符合 URL 的预期结构。尝试使用Uri.IsWellFormedUriString来遵守 RFC 2396 和 RFC 273:
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>
- 但当然请求验证无论如何都会首先捕获那个字符串。
另请查看 OWASP Top 10 Unvalidated Redirects and Forwards。