function escape(s) { // Pass inn "callback#userdata" var thing = s.split(/#/); if (!/^[a-zA-Z[]']*$/.test(thing[0])) return 'Invalid callback'; var obj = {'userdata': thing[1] }; var json = JSON.stringify(obj).replace(/</g, '\u003c'); return "<script>" + thing[0] + "(" + json +")</script>"; }
payload:callback#userdata
两个参数,两个输出点,要执行alert(1)或alert`1`就必须隔离,通过引号可以达到这样的效果,但双引号被转义了,可尝试单引号:
这里使用单引号闭合一堆无用内容而不用双引号,是因为JSON.stringify()有下面的特性: