Conteúdo


Evite ataques cross-site scripting codificando as respostas HTML

Comments

Nota: consulte o tutorial, "Proteja seus apps de ataques cross-site scripting (XSS)" para usar o sandbox do desenvolvedor. O fragmento de código naquele tutorial mostra como usar sequências de escape para que qualquer código injetado não possa ser executado.

Ataques cross-site scripting

Em um ataque cross-site scripting (XSS), o invasor injeta código malicioso em uma página da web legítima que, em seguida, executa o script malicioso do lado do cliente. Quando um usuário visita a página da web infectada, o script é transferido por download e executado no navegador do usuário. Há muitas variações para esse esquema. O script malicioso poderia acessar cookies do navegador, tokens de sessão ou outras informações sigilosas retidas pelo navegador. No entanto, todos os ataques XSS seguem o padrão mostrado na Figura 1.

Figura 1. Ataque XSS típico
Ataque XSS Típico
Ataque XSS Típico

Vulnerabilidades do XSS

Em um ataque XSS típico, o invasor encontra uma maneira de inserir uma sequência na página da web de um servidor. Suponha que o invasor injete a seguinte sequência na página da web: <script>alert("attacked")</script> . Toda vez que um usuário final visitar essa página, seu navegador fará download desse script e o executará como parte da renderização da página. Nesse caso, o script será executado e o usuário verá um pop-up de alerta dizendo "atacado".

Impacto do XSS

Quando invasores exploram com sucesso as vulnerabilidades do XSS em um aplicativo da web, eles podem inserir um script que dá acesso às credenciais da conta do usuário final. Os invasores podem executar uma variedade de atividades maliciosas, como:

  • Sequestrar uma conta
  • Espalhar worms da web
  • Acessar o histórico do navegador e o conteúdo da área de transferência
  • Controlar o navegador remotamente
  • Varrer e explorar dispositivos e aplicativos de intranet

Evitando ataques XSS

Para ajudar a evitar ataques XSS, um aplicativo precisa assegurar que toda saída de variável em uma página seja codificada antes de ser retornada para o usuário final. A codificação da saída de variável substitui a marcação HTML por representações alternativas chamadas entidades. O navegador exibe as entidades, mas não as executa. Por exemplo, <script> é convertido para &lt;script&gt;.

A Tabela 1 mostra o nome da entidade para alguns caracteres HTML comuns.

Tablela 1. Nomes de entidade para caracteres HTML
ResultadoDescriçãoNome da entidadeNúmero da entidade
 Espaço sem quebras&nbsp;&#160;
<Menor que&lt;&#60;
>Maior que&gt;&#62;
&E comercial&amp;&#38;
¢Centavo&cent;&#162;
£Libra&pound;&#163;
¥Iene&yen;&#165;
Euro&euro;&#8364;
§Seção&sect;&#167;
©Copyright&copy;&#169;
®Marca registrada&reg;&#174
Marca comercial&trade;&#8482;

Quando um navegador da Web encontrar as entidades, elas serão convertidas novamente em HTML e impressas, mas não serão executadas. Por exemplo, se um invasor injetar <script>alert("you are attacked")</script> em um campo de variável da página da web de um servidor, o servidor irá, usando essa estratégia, retornar &lt;script&gt;alert("you are attacked")&lt;/script&gt;.

Quando o navegador da Web fizer download do script codificado, ele converterá o script codificado novamente para <script>alert("you are attacked")</script> e exibirá o script como parte da página da web, mas o navegador não executará o script.

Incluindo código HTML em um aplicativo Java do lado do servidor

Para assegurar que o código de script malicioso não seja enviado como parte de uma página, seu aplicativo precisa codificar todas as sequências de variáveis antes que elas sejam exibidas em uma página. Codificar é meramente converter cada caractere em seu nome de entidade HTML, conforme mostrado no exemplo de código Java na Listagem 1.

Lista 1. Converter caracteres para o nome de entidade HTML
public class EscapeUtils {

	public static final HashMap m = new HashMap();
	static {
		m.put(34, "&quot;"); // < - less-than
		m.put(60, "&lt;");   // < - less-than
		m.put(62, "&gt;");   // > - greater-than
	//User needs to map all html entities with their corresponding decimal values.
     //Please refer to below table for mapping of entities and integer value of a char
              }

	public static String escapeHtml() {
		String str = "<script>alert(\"abc\")</script>";
		try {
			StringWriter writer = new StringWriter((int)
                           (str.length() * 1.5));
			escape(writer, str);
			System.out.println("encoded string is " + writer.toString() );
			return writer.toString();
		   } catch (IOException ioe) {
			ioe.printStackTrace();
			return null;
		                                            }
	                                                 }

	public static void escape(Writer writer, String str) throws IOException {
		int len = str.length();
		for (int i = 0; i < len; i++) {
			char c = str.charAt(i);
			int ascii = (int) c;
			String entityName = (String) m.get(ascii);
			if (entityName == null) {
				if (c > 0x7F) {
					writer.write("&#");
					writer.write(Integer.toString(c, 10));
					writer.write(';');
				} else {
					writer.write(c);
				}
			} else {
                     writer.write(entityName);
			}
		}
	}
}

No exemplo de Java na Listagem 1, para a codificação HTML a entrada é String "<script>alert(\"abc\")</script>". Use as etapas a seguir.

  1. Crie um mapa hash de todas as entidades HTML e seus valores decimais. O exemplo mostra apenas três entradas. É necessário mapear todas as entidades HTML com seus valores decimais nesse mapa. A Tabela 2 mostra uma das entidades usadas mais comumente e seus valores decimais. Para obter uma referência completa de todas as entidades de caracteres, consulte a Referência de Entidades HTML em Recursos.
  2. Crie um StringWriter de buffer 1,5 vezes o tamanho do comprimento da sequência de entrada.
  3. Transmita esse gravador e a sequência de entrada para o método escape, que seleciona cada caractere da sequência um por um e obtém o valor inteiro do caractere.
  4. Tansmita o valor inteiro para o mapa criado na etapa 1, busque o nome da entidade e grave esse valor no lançador.

    Cada caractere da sequência será convertido em seu nome de entidade.

A saída é &lt;script&gt;alert(&quot;abc&quot;)&lt;/script&gt;.

A Tabela 2 mapeia as entidades HTML para seus valores decimais.

Tablela 2. Os valores decimais das entidades HTML
DecimalEntidadeDescrição
160&nbsp;Espaço sem quebras
60&lt;Menor que
62&gt;Maior que
38&amp;E comercial
162&cent;Centavo
163&pound;Libra
165&yen;Iene
8364&euro;Euro
167&sect;Seção
169&copy;Copyright
174&reg;Marca registrada
8482&trade;Marca comercial

Conclusão

Cross-site scripting ainda é uma das maneiras mais comuns de atacar a máquina de um usuário. No entanto, é possível eliminar amplamente a capacidade de um invasor infectar seu aplicativo da web com código malicioso. Ao gravar seu aplicativo, tenha o cuidado de codificar toda saída de variável em uma página antes de enviá-la ao navegador do usuário final.


Recursos para download


Comentários

Acesse ou registre-se para adicionar e acompanhar os comentários.

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=80
Zone=Cloud computing
ArticleID=1063014
ArticleTitle=Evite ataques cross-site scripting codificando as respostas HTML
publish-date=09192018