Tengo un servicio que le permite al usuario especificar un nombre de función de devolución de llamada que ajusta los datos que se devuelven para respaldar las devoluciones de llamada jsonp. Quiero asegurarme de que estoy cubriendo todas mis bases con respecto a la prevención de ataques XSS.
Nota, he leído la Lista de verificación de seguridad OWASP pero ninguna de las recomendaciones parece Dirigir directamente esta pregunta.
Estos son los métodos actualmente soportados para especificar la función jsonp donde el nombre de la función es cbFn
y cbFn
se declara solo, un método en un objeto, o al que se accede desde un objeto / matriz:
https://service.com/cbFn
https://service.com/?callback=cbFn
https://service.com/?callback=obj.cbFn
https://service.com/?callback=obj['cbFn']
https://service.com/?callback=obj[1]
Estos vuelven:
cbFn({data: 'data being returned'})
obj.cbFn({data: 'data being returned'})
obj['cbFn']({data: 'data being returned'})
obj[1]({data: 'data being returned'})
Sin embargo, las siguientes solicitudes también funcionan y son los problemas conocidos de XSS que quiero evitar:
// executes an anonymous function
https://service.com/?callback=(()=%3E{alert(1)})
// replaces the user's callback function with our own
https://service.com/?callback=cbFn=((data)=>{alert(data)})
¿Es suficiente simplemente reemplazar / eliminar los caracteres ()=>
en el nombre de devolución de llamada para evitar vulnerabilidades de XSS? Quiero permitir el conjunto de caracteres de javascript válido completo para los nombres de funciones, por lo que restringir el rango de caracteres válido a /[$_\w]+/
(alfanumérico más $ y _) no parece ser una buena opción.