2011-09-19 31 views
8

Tengo un formulario en mi página donde los usuarios ingresan los datos de su tarjeta de crédito. ¿Es posible en HTML marcar que la acción del formulario sea constante para evitar que JavaScript malicioso cambie la propiedad de acción del formulario? Me imagino un ataque XSS que cambia la URL del formulario para que los usuarios publiquen sus datos secretos en el sitio del atacante.Impedir que se modifique la acción del formulario HTML

¿Es posible? O bien, ¿hay alguna característica diferente en los navegadores web que impida este tipo de ataques?

+0

¿Cómo sería el JavaScript malicioso entrar en el formulario en primer lugar? ¿El formulario de pago permite que se muestre el contenido enviado por el usuario (XSS)? Ese sería un formulario de pago inusual. –

Respuesta

5

Este tipo de ataque es posible, pero este es el camino equivocado para prevenir contra ella. Si un hacker puede cambiar los detalles del formulario, puede enviar fácilmente los datos secretos a través de un AJAX GET sin enviar el formulario. La forma correcta de prevenir un ataque XSS es asegurarse de codificar todo el contenido que no sea de confianza en la página, de forma tal que, en primer lugar, un hacker no tenga la capacidad de ejecutar su propio JavaScript.


Más sobre la codificación ...

El código de muestra en StackOverflow es un excelente ejemplo de codificación. Imagínese qué desastre sería si cada vez que alguien publicara algún ejemplo de JavaScript, realmente se ejecutara en el navegador. Por ejemplo,

<script type="text/javascript">alert('foo');</script>

Si no fuera por el hecho de que codificaba el fragmento anterior, se habría visto simplemente un cuadro de alerta. Este es, por supuesto, un guión bastante inocuo: podría haber codificado un código JavaScript que secuestró su cookie de sesión y lo envió a evil.com/hacked-sessions. Afortunadamente, sin embargo, SO no supone que todos tengan buenas intenciones, y en realidad codifica el contenido. Si se va a ver la fuente, por ejemplo, se vería que también lo ha codificado mi HTML perfectamente válido y JavaScript en esto:

&lt;script type="text/javascript"&gt;alert('foo');&lt;/script&gt;

Así, en lugar de incorporar reales < y > caracteres en el que los utilizó, han sido reemplazados por sus equivalentes codificados en HTML (&lt; y &gt;), lo que significa que mi código ya no representa una etiqueta de script.

De todos modos, esa es la idea general detrás de la codificación. Para obtener más información sobre cómo debe codificar, eso depende de lo que esté usando en el lado del servidor, pero la mayoría de todos los marcos web incluyen algún tipo de utilidad de codificación HTML "lista para usar". Su responsabilidad es garantizar que el contenido proporcionado por el usuario (o que no sea de confianza) sea SIEMPRE codificado antes de ser procesado.

+1

¿Qué quiere decir con 'codificar' exactamente? Suena genial, pero no estoy seguro de qué tecnologías implicaría esto. –

+0

Sé que la mejor manera de prevenir ataques XSS es codificar todo. Pero es difícil, siempre puedes olvidarte de un campo. No es tan fácil enviar los datos secretos usando AJAX debido a la misma política de origen. Todavía puedo ver algunas ventajas de tener una función como esa. –

+0

@Michal: es bastante fácil enviar datos a un servidor de origen cruzado. Todo lo que tiene que hacer es insertar una etiqueta de script que apunte al script src = xxx "en otro servidor y ponga los datos como parámetros de consulta en la URL de la etiqueta de script. Así es como funciona JSONP, aunque JSONP no es necesario aquí para simplemente enviar datos a otro servidor. – jfriend00

1

No hay nada que realmente lo evite.

Lo único que sugeriría es tener alguna validación de del lado del servidor de cualquier información que llegue al servidor desde un formulario de usuario.

Como dice el refrán: Nunca confíes en el usuario

+0

Creo que esta pregunta es más sobre la protección del usuario. –

+0

¿Proteger al usuario? ¿de qué? – Neal

+0

De enviar su información a un sitio de atacantes. –

Cuestiones relacionadas