Здесь нужно рассмотреть несколько вещей.Во-первых, у вас есть ASP.NET Request Validation , который поймает многие из распространенных шаблонов 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 .