XSS:Cross Site Scrit 跨站脚本攻击(为与 CSS 区别,所以在安全领域叫 XSS),通常是指黑客通过“HTML注入”,篡改了网页,插入了恶意脚本,从而在用户浏览网页时,控制用户浏览器的一种方法。跨站已经不重要,现在叫做“HTML注入”可能更加合适,单因为历史原因XSS这个名字一直保留下来。
一,输入检查
1.1 格式检查
比如用户注册时检查账户、电话号码、邮件和生日等信息,都有一定格式规范。比如 "lordwang" 是一个合法的用户名,而字符串 "lordwang';select..." 不是一个合法的用户名。某种意义上,这些都属于白名单,可以让大部分攻击无效。
Node.js 和 PHP 都有各种丰富的验证类,可以做这些事情。
1.2 特殊字符过滤
尾了XSS,攻击者通常会使用一些特殊字符,比如 <,>,',",`等。如果发现这些字符,将过滤这些字符,比如直接删除,或者编码成“HTML实体”。
Node.js 可以参考这两个函数:
exports.htmlEncode = function (a) { a = "" + a; return a.replace(/&/g, "&").replace(/</g, "<").replace(/>/g, ">").replace(/"/g, """).replace(/'/g, "'");; } exports.htmlDecode = function (a) { a = "" + a; return a.replace(/</g, "<").replace(/>/g, ">").replace(/&/g, "&").replace(/"/g, '"').replace(/'/g, "'"); }
一些专业的 XXS 防御工具也会提供这些功能。
二,按照标签、属性 样式放HTML注入的方法
。。。
三,富文本处理
当时使用富文本编辑器的时候,不可以直接过滤或者删除所有标签和属性。这时就应该使用,带有白名单功能的过滤器。比如这个比较流行的Node.js过滤包, https://www.npmjs.com/package/xss
基于白名单的过滤
通过 whiteList 来指定,格式为:{'标签名': ['属性1', '属性2']}。不在白名单上的标签将被过滤,不在白名单上的属性也会被过滤。以下是示例:
var options = { whiteList: { a: ["href", "title", "target"], // 只允许a标签,该标签只允许href, title, target这三个属性 img: ['src'], h1: [], h2: [], h3: [], h4: [], h5: [], h6: [], p: ['class'], br: [], strong: [], em: [], u: [], s: [], blockquote: [], pre: ['class', 'spellcheck'], span: [], img: ['src'] } }; html = xss('<script>alert("xss");</script>', options);
一个Node.js 基于白名单的 XSS filter 实现:https://github.com/rymohr/cockblock/blob/master/index.js
这个项目比较简单,可以用来了解XSS 的实现。在node.js端,使用cheerio作为html parser,根据白名单过滤标签和属性。
参考:
《白帽子讲WEB安全》
https://www.npmjs.com/package/xss
https://github.com/rymohr/cockblock
https://github.com/phith0n/XssHtml
-----------------------
关于 javascriptEncode 实现
https://www.cnblogs.com/princesong/p/5686249.html
https://www.cnblogs.com/lovesong/p/5211667.html
https://blog.csdn.net/u011872945/article/details/80747677
修改时间 2021-12-16