Red de conocimiento informático - Conocimiento informático - Cómo prevenir ataques XSS y qué se debe filtrar

Cómo prevenir ataques XSS y qué se debe filtrar

Los ataques XSS suelen ocurrir cuando los piratas informáticos manipulan páginas web e insertan scripts maliciosos mediante "inyección HTML", tomando así el control de los navegadores de los usuarios mientras navegan por la web.

A.HttpOnly previene el secuestro de cookies

HttpOnly fue propuesto por primera vez por Microsoft y ahora se ha convertido en un estándar. El navegador impedirá que la página Javascript acceda a las cookies con el atributo HttpOnly. Actualmente, los navegadores convencionales admiten HttpOnly. HttpOnly resuelve los ataques de soporte de cookies después de XSS.

Veamos si Baidu lo usa.

Información de las cookies cuando no estoy conectado

Puedes ver que no todas las cookies están configuradas en HttpOnly ahora que he iniciado sesión

, en una cookie llamada. BDUSS Encontró que HttpOnly está configurado. false);

setcookie('cookie3','test3',NULL,NULL,NULL,false);

setcookie('cookie4','test4',NULL,NULL, NULO, verdadero). gt;

lt; scriptgt;

alert(document.cookie);

lt;/scriptgt;

js solo puede ser leer Obtener cookies sin el logotipo HttpOnly

2: Verificación de entrada

La verificación de entrada generalmente verifica si los datos ingresados ​​por el usuario contienen algunos caracteres especiales, como lt;, gt;, ', ", etc. . Si se encuentran caracteres especiales, estos se filtrarán o codificarán.

Por ejemplo, al registrarse en un sitio web, un nombre de usuario normalmente solo permite una combinación de letras y números, o un teléfono de correo electrónico. número, que usamos en el front-end. js para verificarlo, pero el código del lado del servidor debe verificarlo nuevamente, porque la verificación del lado del cliente se puede omitir fácilmente

Hay muchas implementaciones de código abierto de "filtros XSS" en la web, pero deben usarse selectivamente porque su filtrado de caracteres especiales puede no ser la intención original de los datos. Por ejemplo, clase php lib_filter:

$filter = new. lib_filter();

echo $filter-gt; go. ('1 1gt; 1');

Genera 1, lo que distorsiona enormemente la semántica de los datos, por lo que debe filtrar selectivamente qué caracteres

3. Inspección de salida

La mayoría de las personas saben que la entrada debe verificarse, pero ignoran la verificación de salida.

1. Salida en etiquetas HTML

Por ejemplo, código:

lt;?php

$a = "lt;scriptgt ; alert(1);lt;/scriptgt;";

$b = "lt;img src=# onerror= alert(2) /gt;"; gt;

lt ;divgt;lt;? =$b?gt;lt;/divgt;

lt;a href="#"gt;lt; =$a?gt;lt;/agt;

p>

De esta manera, el cliente será atacado por xss. La solución es usar htmlEncode en la variable. La función en php es htmlentities

lt;?php

$a = "lt;scriptgt;alert(1);lt;/scriptgt;";

$b = "lt;img src=# onerror=alert(2) /gt; "; gt;

p>

lt;divgt;lt;?=htmlentities($b)?gt;lt;/divgt;

lt;a href="#"gt ;lt;?=htmlentities($ a)? gt;lt;/agt;

2. Salida en atributos HTML

lt;div id="div" name="$. var"gt;lt;/ divgt;

htmlEncode también se usa en owasp-php

para implementar la defensa en este caso:

$immune_htmlattr = array( ', ', ' .', '-', '_');

$this-gt;htmlEntityCodec-gt;encode($this-gt;immune_htmlattr, "\"gt;lt;scriptgt ;123123;lt; /scriptgt;lt;\"" );

3. Salida en la etiqueta lt;scriptgt;

Como se muestra en el código:

lt;?php

$c = "1; alerta(3)"; gt

lt; script type="text/javascript"gt;

var c = lt;? = $c?gt;;

lt;/scriptgt;

De esta manera xss volverá a tener efecto. En primer lugar, la salida de las variables js debe usar comillas, pero si uso $c = "\"abc;alert(123);//", encontrará que ponerlo entre comillas no funciona en absoluto. y las funciones integradas no son fáciles de usar. Esto solo puede usar la función JavascriptEncode más estricta para garantizar la seguridad: todos los caracteres, excepto los números y las letras, están codificados en modo hexadecimal "\ xHH".

Aquí, utilizo el método de código abierto owasp-php para lograr esto

$immune = array("");

echo $this-gt;javascriptCodec-gt;encode( $ inmune, "\"abc;alert(123);//");

El resultado final es:\x22abc\x3Balert\x28123\x29\x3B\x2F\x2F

4. Salida en el evento

lt;a href="#" onclick="funcA('$var')" gt;Testinglt;/agt;

Posibles ataques Método

lt;a href="#" onclick="funcA('');alter(/xss/;//')" gt;testlt;/agt;

Este elemento en realidad está escrito en