Lista de permissões do HTML do .NET (anti-xss / Cross Site Scripting)

Eu tenho a situação comum onde eu tenho entrada do usuário que usa um subconjunto de HTML (entrada com tinyMCE). Eu preciso ter alguma proteção do lado do servidor contra ataques XSS e estou procurando uma ferramenta bem testada que as pessoas estão usando para fazer isso. No lado do PHP, estou vendo muitas bibliotecas como o HTMLPurifier que fazem o trabalho, mas não consigo encontrar nada no .NET.

Eu estou basicamente procurando por uma biblioteca para filtrar para uma lista branca de tags, atributos nessas tags, e fazer a coisa certa com atributos "difíceis" como um: href e img: src

Eu vi o post de Jeff Atwood emhttp://refactormycode.com/codes/333-sanitize-html, mas não sei como é atualizado. Tem algum significado para o que o site está usando atualmente? E, de qualquer forma, não tenho certeza se estou confortável com essa estratégia de tentar extrair informações válidas.

Este post do blog mostra o que parece ser uma estratégia muito mais atraente:

http://blog.bvsoftware.com/post/2009/01/08/How-to-filter-Html-Input-to-Prevent-Cross-Site-Scripting-but-Still-Allow-Design.aspx

Esse método é realmente analisar o HTML em um DOM, validar isso e reconstruir o HTML válido a partir dele. Se a análise de HTML puder lidar com HTML malformado de maneira sensata, então ótimo. Se não, não é grande coisa - eu posso exigir HTML bem formado desde que os usuários devem estar usando o editor tinyMCE. Em ambos os casos, estou reescrevendo o que sei que é um HTML seguro e bem formado.

O problema é que é apenas uma descrição, sem um link para qualquer biblioteca que realmente execute esse algoritmo.

Existe tal biblioteca? Se não, qual seria um bom mecanismo de análise HTML? E que expressões regulares devem ser usadas para realizar uma validação extra a: href, img: src? Estou faltando alguma coisa importante aqui?

Eu não quero reimplantar uma roda de buggy aqui. Certamente há algumas bibliotecas comumente usadas por aí. Alguma ideia?

questionAnswers(6)

yourAnswerToTheQuestion