Lista de permissões, impedindo o XSS com controle de armas de destruição em massa em C#

StackOverflow https://stackoverflow.com/questions/2104520

Pergunta

Há algum problema com o que estou fazendo aqui? Esta é a minha primeira vez para lidar com algo assim, e eu só quero ter certeza de que entendi todos os riscos, etc. para métodos diferentes.

Estou usando o WMD para obter entrada do usuário e estou exibindo com um controle literal. Como não é editável uma vez inserido, estarei armazenando o HTML e não o Markdown,

input = Server.HTMLEncode(stringThatComesFromWMDTextArea)

E depois execute algo como o seguinte para tags que eu quero que os usuários possam usar.

// Unescape whitelisted tags.
string output = input.Replace("&lt;b&gt;", "<b>").Replace("&lt;/b&gt;", "</b>")
                     .Replace("&lt;i&gt;", "<i>").Replace("&lt;/i&gt;", "</i>");

Editar Aqui está o que estou fazendo atualmente:

 public static string EncodeAndWhitelist(string html)
 {
     string[] whiteList = { "b", "i", "strong", "img", "ul", "li" };
     string encodedHTML = HttpUtility.HtmlEncode(html);
     foreach (string wl in whiteList)
         encodedHTML = encodedHTML.Replace("&lt;" + wl + "&gt;", "<" + wl + ">").Replace("&lt;/" + wl + "&gt;", "</" + wl + ">");
     return encodedHTML;
 }
  1. Vai o que estou fazendo aqui me manterá protegido de XSS?
  2. Existem outras considerações que devem ser feitas?
  3. Existe uma boa lista de tags normais na lista de permissões?
Foi útil?

Solução

Se seus requisitos são realmente tão básicos que você pode fazer substituições tão simples de string, então sim, isso é "seguro" contra o XSS. (No entanto, ainda é possível enviar conteúdo não formado por poços onde <i> e <b> são mal aninhados ou não-desligados, o que pode potencialmente atrapalhar a página em que o conteúdo acaba inserido.)

Mas isso raramente é suficiente. Por exemplo atualmente <a href="..."> ou <img src="..." /> não é permitido. Se você quisesse permitir que essas ou outra marcação com valores de atributo, teria muito mais trabalho a fazer. Você pode então abordá-lo com o Regex, mas isso oferece problemas infinitos com o ninho acidental e a substituição do conteúdo já substituído, visto como o Regex não pode analisar o HTML, e isso.

Para resolver os dois problemas, a abordagem usual é usar um analisador [x] [ht] ml na entrada e depois caminhar o DOM removendo todos os elementos e atributos, exceto o bem conhecido, e finalmente serializam para [x] html. O resultado é então garantido bem formado e contém apenas conteúdo seguro.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top