XSS的产生
很多人需要在nunjuck里面输出json数据的时候会这么写:
1 | {{ jsonData | dump | safe }} |
但是这么写一点都不安全(虽然有一个safe)
dump只是将json对象序列化(stringify),safe只是告诉nunjucks不要进行escape(让nunjucks以为已经是安全的字符串了)
所以json里面使用 </script><script>alert(1) 之类的,就XSS啦
正确做法
app/extend/filter.js
1 2 3 4 5 6 7 | let nunjucks = require('nunjucks'); let devalue = require('devalue'); export function jsonsafe(data) { let s = devalue(data); return nunjucks.runtime.markSafe(s); } |
模板文件:
1 | {{ jsonData | jsonsafe }} |