什么是 XSS 攻击?

这几天整理的一下过往的文章和笔记,备份到了 Github 上,地址👉 blog

如果我的内容帮助到了您,欢迎点个 Star 🎉🎉🎉 鼓励鼓励 :) ~~ 👆

我希望我的内容可以帮助你。现在我专注于前端领域,但我也将分享我在有限的时间内看到和感受到的东西。


XSS(Cross Site Scripting)是跨站脚本攻击。它是一种网站应用程序的安全漏洞攻击,是代码注入的一种。它允许恶意用户将代码注入到网页上,其他用户在观看网页时就会受到影响。这类攻击通常包含了 HTML 以及用户端脚本语言。

XSS 攻击原理

在 XSS 攻击中,恶意代码会被注入您的网站,然后被执行。例如:当注入具有渲染完整标签的属性的字符串时是可能的(如 Element.innerHTMLElement.outerHTML),而不仅仅是文本(如 Node.textContentElement.innerText)。

不过,有一个内置的保护措施。

仅仅注入一个 script 标签不会让你受到攻击,因为您注入的 DOM 部分已经被解析并运行了。

// 这行不通
const div = document.querySelector('#app')
div.innerHTML = '<script>alert("XSS 攻击")</script>'

但是,稍后运行的 JavaScript 将继续运行。

在此示例中,我们尝试从无效来源加载图像。当它失败时,onerror 事件会运行一些恶意 JavaScript。

// 这将运行
div.innerHTML = `<img src="/path/to" onerror="alert('XSS 攻击')">`

在这种情况下,它只是在提醒一条消息。但在真实的场景中,代码可能会从我们的网站上抓取敏感数据,并将其发送给第三方来源。

链接是另一个潜在的攻击媒介。如果 hrefsrc 属性是从第三方数据中设置的,则有恶意的用户可以在 URL 前加上 javascript:data:text/html,并在用户单击链接或元素加载时运行代码。

div.innerHTML = `<a href="javascript:alert('另一个 XSS 攻击')">点我有惊喜</a>`

这些攻击方式不需要你做任何的登录认证,只是通过简单、合法的操作,向你的页面注入脚本。

XSS 的攻击方式

  • 反射性 XSS
  • 存储型 XSS
  • DOM 型 XSS

这里不过多介绍,关于 XSS 攻击方式可以查看最后附加的链接,我们重点来看看如何防范 XSS 攻击。

XSS 防范措施

HTML 转义特殊字符

const escapeHTML = function (handleString){
  return handleString
    .replace(/&/g, "&amp;")
    .replace(/</g, "&lt;")
    .replace(/>/g, "&gt;")
    .replace(/ /g, "&nbsp;")
    .replace(/\'/g, "&#39;")
    .replace(/\"/g, "&quot;")
}

escapeHTML('<script>alert("xss")</script>')

使用 XSS 库针对用户输入源过滤,设置标签白名单

使用白名单指定的配置对不受信任的 HTML 进行清理(以防止 XSS),这里我们可以使用 jsxss

import xss from 'xss'
const html = xss('<script>alert("xss")</script>')

console.log(html)

Cookie 设置 HttpOnly

在 HTTP 的响应头 set-cookie 时设置 httpOnly,让浏览器知道不能通过 document.cookie 的方式获取到 cookie 内容。

app.get('/', (req, res) => {
  if (req.cookies.isVisit) {
    console.log(req.cookies)
    res.send('欢迎再次光临')
  } else {
    res.cookie('isVisit', 1, { maxAge: 3600 * 1000, httpOnly: true })
    res.send('欢迎初次光临')
  }
})

虽然避免了攻击者直接获取到 cookie,但是攻击者仍然可以在页面内发起别的请求,直接篡改用户的信息。我们可以配合 token 或者验证码的形式来防止这种情况的放生。而这两种相比,验证码的安全性会更搞些。

设置 CSP 安全策略

内容安全策略(CSP)用于检测和减轻用于 Web 站点的特定类型的攻击,例如 XSS 和数据注入等。

启用 CSP 的方式有 2 种

  • 添加 meta 标签 http-equive
<meta http-equiv="Content-Security-Policy" content="default-src 'self'; img-src https://*; child-src 'none';">
  • 服务器响应头设置

总结

  • 合适的 HTML 转义可以有效避免 XSS 漏洞,阻止浏览器将用户输入解析为实际 HTML,因此不会执行脚本
  • 对于不受信任的输入字段,限制其输入长度
  • 使用 textContent 而不是 innerHTML 可以阻止浏览器通过 HTML 解析器运行字符串,而 HTML 解析器将在其中执行脚本
  • 针对用户输入源和不可信数据源必须进行过滤和校验。如 <script><img><a> 等标签要进行过滤
  • 避免标签中使用 onLoad 等事件,在 JavaScript 中通过 .addEventlistener() 事件绑定会更安全
  • 避免拼接 HTML,采用比较成熟的渲染框架,如 Vue/React 等
  • 通过 CSP 安全策略和其他 HTTP 响应头的设置等进一步确保安全性
  • 为 cookie 设置 httpOnly 来禁止 JavaScript 读取某些敏感 Cookie,攻击者完成 XSS 注入后也无法窃取此 Cookie
  • 使用验证码可以防止脚本冒充用户提交危险操作
  • 使用 XSS 攻击字符串和自动扫描工具寻找潜在的 XSS 漏洞

更多资源

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,504评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,434评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,089评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,378评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,472评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,506评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,519评论 3 413
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,292评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,738评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,022评论 2 329
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,194评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,873评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,536评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,162评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,413评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,075评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,080评论 2 352

推荐阅读更多精彩内容