以前是asked here.,因此再次要求获得更好的答复。
我有一项服务,允许用户指定一个回调函数名称,该名称将包装返回的数据以支持jsonp回调。我想确保我涵盖了防止XSS攻击的所有基础。
请注意,我已经阅读了OWASP security checklist,但似乎没有任何建议可以直接解决这个问题。
这些是当前支持的用于指定jsonp函数的方法,其中函数名称为cbFn
并且cbFn
单独声明,对象上的方法或从对象/数组访问的方法:
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]
这些返回:
cbFn({data: 'data being returned'})
obj.cbFn({data: 'data being returned'})
obj['cbFn']({data: 'data being returned'})
obj[1]({data: 'data being returned'})
但是以下请求也有效,并且是我想避开的已知XSS问题:
// 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)})
仅替换/删除回调名称中的字符()=>
就足以防止XSS漏洞吗?我想允许函数名称使用完整的有效javascript字符集,因此将有效字符范围限制为/[$_\w]+/
(字母数字加$和_)似乎不是一个好选择。