¿La adición de datos de un formulario a una URL con encodeURIComponent sanea de forma segura las opiniones de los usuarios?

2

En mi aplicación web, deseo enviar una solicitud AJAX de varios dominios a otro sitio. Quiero tomar el texto que el usuario ingresa en un formulario y adjuntar ese texto a la cadena de consulta en la URL a la que le envío la solicitud, así que evito el texto del usuario usando encodeURIComponent() primero, así:

function sendAJAXRequext(textThatUserEntered) {
  const hopefullyThisStringIsSafe = encodeURIComponent(textThatUserEntered);
  const xhr = new XMLHttpRequest();
  xhr.open('GET', 'https://www.example.com/api?query=${hopefullyThisStringIsSafe}');
  // snip...
  xhr.send();
}

¿El uso de encodeURIComponent() es lo suficientemente bueno para garantizar que no haya formas de inyectar algo malo en la URL que solicito, o hay algo más que deba hacer para desinfectar textThatUserEntered ?

    
pregunta Kevin 06.01.2017 - 22:50
fuente

2 respuestas

3

Sí, encodeURIComponent() es la forma correcta de rellenar de forma segura un parámetro de consulta con datos no confiables.

  

La función encodeURIComponent () codifica un componente URI.   Esta función codifica caracteres especiales. Además, codifica los siguientes caracteres:, /? : @ & = + $ #

(de w3schools)

  

¿hay algo más que deba hacer para limpiar textThatUserEntered?

No, si solo lo usa para codificar un valor de parámetro de consulta como en su ejemplo, no tiene que tomar medidas adicionales. Un atacante no tendrá forma de introducir un nuevo parámetro o cambiar la URL de forma que cree directamente una vulnerabilidad XSS o similar.

Pero eso no significa de ninguna manera que el parámetro sea seguro para procesarse en el sitio de destino. Simplemente significa que es seguro para el script que solicita . El parámetro todavía podría desencadenar una vulnerabilidad de inyección en el servidor de destino.

También tenga en cuenta que algunos caracteres están excluidos del escape ( !'()* ). Es por eso que Mozilla propone una función de envoltorio que también escapa a estos personajes, aunque no suponga una amenaza inmediata ya que no tienen un significado asignado en la sintaxis de consulta:

function fixedEncodeURIComponent (str) {
  return encodeURIComponent(str).replace(/[!'()*]/g, function(c) {
    return '%' + c.charCodeAt(0).toString(16);
  });
}
    
respondido por el Arminius 06.01.2017 - 23:06
fuente
-1

Como recomendación adicional, JavaScript se interpreta en el lado del cliente, luego se puede manipular para un usuario experto y omitir los métodos de codificación. Además, si alguien sabe cómo enviar una solicitud a su aplicación, puede crear una solicitud con parámetros no autorizados. , entonces tiene que implementar las mismas validaciones o métodos de codificación en el lado del servidor. JavaScript y AJAX son buenos para mejorar el rendimiento de una aplicación, pero la seguridad que ofrecen no es suficiente, las medidas de seguridad siempre deben estar en el lado del servidor.

Espero que esta información te ayude.

    
respondido por el hmrojas.p 07.01.2017 - 18:50
fuente

Lea otras preguntas en las etiquetas