Cómo escapar correctamente una cadena de un campo de entrada, evitando ataques XSS en JavaScript

1

Tengo una aplicación pequeña y he leído mucho sobre XSS, así que quiero limpiar la entrada que tengo.

Al buscar en Google, encontré la guía OWASP que indica que se debe usar lo siguiente para sanear correctamente la entrada:

String safe = ESAPI.encoder().encodeForJavaScript( request.getParameter( "input" ) );

Soy bastante nuevo en la codificación, así que lo copié / pegué en mi función de JavaScript y parece que no funciona.

Una representación aproximada de lo que estoy tratando de hacer es ejecutable aquí , el código:

<input name="this" type="text" maxlength="16" id="this" />
<button onclick="run()">run</button>

<script>
function run() {

// how I used to do it
// a = document.getElementById("this").value;

safe = ESAPI.encoder().encodeForURL( document.getElementById("this").value );

alert(safe);
}

</script>

Los caracteres válidos para mis aplicaciones son solo los números [0-9] y un punto ( . ).

¿Cómo puedo escapar / desinfectar correctamente un campo de entrada en JavaScript para evitar ataques XSS?

    
pregunta MikeDyson 09.03.2017 - 09:49
fuente

1 respuesta

4
  

Soy bastante nuevo en la codificación, así que lo copié / pegué en mi función de JavaScript y parece que no funciona.

Es posible que no esté funcionando porque ESAPI es una biblioteca a la que debe hacer referencia en una etiqueta de secuencia de comandos HTML; no es parte del javascript principal que viene con el navegador. ESAPI parece estar disponible en github , que también contiene un archivo README.md que explica cómo cargarlo en HTML . ¿Te puedes perder esa parte? Tu pregunta no dice.

Además, tenga en cuenta que debería ser

var safe = ....

no solo

safe = ....

Esto es importante en javascript. No puedes crear variables globales y contaminar el espacio de nombres global si puedes ayudarlo.

  

Los caracteres válidos para mis aplicaciones son solo los números [0-9] y un punto (.).

En ese caso, te sugiero que uses una expresión regular de javascript para ver si tu entrada coincide con estos caracteres y muestra un mensaje de error si no coincide. ESAPI parece ser una exageración para eso. Validar la entrada "conocida" es mucho más seguro que tratar de pensar en todas las entradas problemáticas y eliminar / transformar eso a través de una rutina de saneamiento. Haz algo como eso:

var validationRegex = new RegExp('^[0-9.]+$');
var text = document.getElementById("this").value;
if (text.match(validationRegex)) { }; // do something when text matches

No tengo mucha experiencia con javascript, por lo que es posible que desees leer cómo funcionan las expresiones regulares en javascript para volver a comprobar ese código. Tenga cuidado con el carácter de punto: fuera de [ ] , significa "cualquier carácter excepto una nueva línea" en expresiones regulares.

Finalmente, si está enviando sus datos de campo de entrada extraídos a un servidor (asumo inteligentemente que no solo desea generar los datos a través de alert(safe) , en cuyo caso no tendría que desinfectar En primer lugar, sería mucho mejor desinfectar los datos en el servidor, porque allí se puede confiar en el saneamiento. Si lo desinfecta en el cliente, un usuario malintencionado podría seguir enviando datos no desinfectados a su servidor.

    
respondido por el Pascal 09.03.2017 - 10:03
fuente

Lea otras preguntas en las etiquetas