Estoy tratando de determinar si el código de un colega es vulnerable a XSS. Están creando un widget que acepta la entrada del usuario como parámetros de consulta para configurar una interfaz de usuario construida con Konva y lienzo HTML.
El programa utilizará la entrada del usuario para agregar texto a una interfaz de usuario o especificar una cadena de color hexadecimal para configurar algunos colores primarios de la interfaz de usuario. Están permitiendo que el widget se configure a través de parámetros de consulta para que los widgets configurados se puedan compartir fácilmente con otras personas.
Mi pregunta es, suponiendo que la aplicación web elimine o desinfecte correctamente todas las etiquetas HTML y las comillas de la entrada del usuario, ¿sigue siendo posible una vulnerabilidad XSS si el usuario envía a través de cualquier javascript codificado o de vainilla?
Ejemplo de Ruby on Rails (ERB):
<input id="widget-title" type="text" value="<%= params[:title] %>"> <input id="widget-color" type="color" value="<%= params[:color] %>">Tenemos javascript que tomará estos valores y los mostrará en un lienzo como:
new Konva.Text({ text: document.querySelector("#widget-title").value(), color: document.querySelector("#widget-color").value() });Nuevamente, suponiendo que las etiquetas HTML y las comillas se eliminen o desinfecten a hexadecimal, ¿podría un usuario ingresar javascript (codificado en hexadecimal) en los parámetros de consulta de alguna manera para ejecutar js arbitrario?
Si esto no es directamente posible, ¿hay otras preocupaciones con este enfoque? He visto algunos usos de javascript en línea como:
<tr background="javascript:alert(window.location)"></tr> Si un futuro desarrollador implementara esto mientras pasa la entrada del usuario, sería malo. Pero no puedo encontrar una especificación sobre qué atributos HTML permiten javascript en línea como este o si quizás haya otra forma de codificar javascript sin formato que podría ejecutarse cuando es el valor de la entrada de texto (excepto, por supuesto, usando algo como eval ).