XXS(跨站脚本攻击) 的防御 (HTML注入)

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, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/"/g, "&quot;").replace(/'/g, "&apos;");;
}

exports.htmlDecode = function (a) {
  a = "" + a;
  return a.replace(/&lt;/g, "<").replace(/&gt;/g, ">").replace(/&amp;/g, "&").replace(/&quot;/g, '"').replace(/&apos;/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

声明:本站所有文章和图片,如无特殊说明,均为原创发布。商业转载请联系作者获得授权,非商业转载请注明出处。
随机推荐
HTML input datetime 日期时间选择器
Express 使用 method-override 处理动词覆盖
如何调整 iconfont 图标的位置和基线
用 JavaScript 实现数字增加滚动动画
Nginx 通过日志统计访问数据
macOS 生成 icns 图标
Debian11 安装笔记2:编译安装PHP
WordPress 插入文章函数 wp_insert_post()