Open Genzhen opened 3 years ago
每日一题会在下午四点在交流群集中讨论,五点小程序中更新答案 欢迎大家在下方发表自己的优质见解 二维码加载失败可点击 小程序二维码
每日一题会在下午四点在交流群集中讨论,五点小程序中更新答案 欢迎大家在下方发表自己的优质见解
XSS 攻击一般指攻击者通过在网页注入恶意脚本,当用户浏览网页时,恶意脚本执行,控制用户浏览器行为的一种攻击方式。
通过 URL 链接点击触发,是一次性行为,本质上是服务器端没有对用户恶意输入做安全处理,直接反射输入内容。如输入baidu.com/?id=<script>alert(1)</script>,弹出弹窗内容为 1。谷歌这类安全性高的浏览器基本可以自动处理这类攻击。
baidu.com/?id=<script>alert(1)</script>
顾名思义,一般涉及后端数据存储,常见场景意见反馈模块,前端通过接口把用户信息传给后端,当后台管理系统展示反馈意见时,就会读取数据库中这些数据,当这些数据含有攻击的脚本,那就造成了存储型 XSS 攻击。这种攻击是持久性的。
客户端脚本程序可以动态地检查和修改页面内容,而不依赖于服务端的数据。可能引起 DOM 型 XSS 攻击。如:使用innerHTML、document.write等。
innerHTML
document.write
目前支持 IE、Chrome、Safari 浏览器,可检测到 XSS 攻击时,阻止页面加载。使用如下:
X-XSS-Protection: 0 X-XSS-Protection: 1 X-XSS-Protection: 1; mode=block X-XSS-Protection: 1; report=<reporting-uri>
X-XSS-Protection 为 0 表示禁止使用 XSS 过滤,为 1 表示允许使用 XSS 过滤。mode=block:若检测到 XSS 攻击,阻止页面加载。report=<reporting-URI> (仅限 Chromium):若检测到跨站点脚本攻击,浏览器将清理页面并报告违规行为。使用 CSP report-uri 指令发送报告。
report=<reporting-URI>
防御范围:反射型 XSS 攻击
将标签符号"<",">"等全局转义
const escapeHtml = (str) => { str = str .replace(/&/g, "&") .replace(/</g, "<") .replace(/>/g, ">") .replace(/"/g, "&quto;") .replace(/'/g, "'") .replace(/ /g, " "); return str; };
大体思路将 HTML 字符串解析成实体对象,若白名单里属性存在在该实体对象中则做相应的处理。这里使用 cheerio 将 HTML 解析成实体。
const whiteList = { img: ["src"], }; const xssFilter = (html) => { if (!html) return ""; const $ = cheerio.load(html, { normalizeWhitespace: true, xmlMode: true, }); $("*").each((index, elem) => { if (!whiteList[elem.name]) { $(elem).remove(); return; } for (var attr in elem.attributes) { if (whiteList[elem.name].indexOf(attr) === -1) { $(elem).attr(attr, null); } } }); return $.html(); };
实质就是白名单制度,开发者明确告诉客户端哪些外部资源可以加载和执行。
<meta http-equiv="Content-Security-Policy" content="script-src 'self'; object-src 'none'; style-src cdn.example.org third-party.org; child-src https:" />
以上代码说明:
<object>
cdn.example.org
third-party.org
在运营商的路由器节点上,设置协议检测,一旦发现是 HTTP 请求且是 HTML 类型请求,则拦截处理。常见有两种:
<meta http-equiv="Cache-Control" content="no-siteapp"> <meta http-equiv="Cache-Control" content="no-transform " />
el.addEventListener("DOMNodeInserted", function (e) { console.log(e.srcElement); }); el.addEventListener("DOMNodeRemoved", function (e) { console.log(e.srcElement); });
扫描下方二维码,收藏关注,及时获取答案以及详细解析,同时可解锁800+道前端面试题。
一、XSS(Cross Site Scripting)跨站脚本攻击
1.1 什么是 XSS 攻击
XSS 攻击一般指攻击者通过在网页注入恶意脚本,当用户浏览网页时,恶意脚本执行,控制用户浏览器行为的一种攻击方式。
1.2 XSS 攻击分类
通过 URL 链接点击触发,是一次性行为,本质上是服务器端没有对用户恶意输入做安全处理,直接反射输入内容。如输入
baidu.com/?id=<script>alert(1)</script>
,弹出弹窗内容为 1。谷歌这类安全性高的浏览器基本可以自动处理这类攻击。顾名思义,一般涉及后端数据存储,常见场景意见反馈模块,前端通过接口把用户信息传给后端,当后台管理系统展示反馈意见时,就会读取数据库中这些数据,当这些数据含有攻击的脚本,那就造成了存储型 XSS 攻击。这种攻击是持久性的。
客户端脚本程序可以动态地检查和修改页面内容,而不依赖于服务端的数据。可能引起 DOM 型 XSS 攻击。如:使用
innerHTML
、document.write
等。1.3 XSS 防御
目前支持 IE、Chrome、Safari 浏览器,可检测到 XSS 攻击时,阻止页面加载。使用如下:
X-XSS-Protection 为 0 表示禁止使用 XSS 过滤,为 1 表示允许使用 XSS 过滤。mode=block:若检测到 XSS 攻击,阻止页面加载。
report=<reporting-URI>
(仅限 Chromium):若检测到跨站点脚本攻击,浏览器将清理页面并报告违规行为。使用 CSP report-uri 指令发送报告。将标签符号"<",">"等全局转义
大体思路将 HTML 字符串解析成实体对象,若白名单里属性存在在该实体对象中则做相应的处理。这里使用 cheerio 将 HTML 解析成实体。
实质就是白名单制度,开发者明确告诉客户端哪些外部资源可以加载和执行。
以上代码说明:
<object>
标签:不信任任何 URL,即不加载任何资源cdn.example.org
和third-party.org
二、HTTP 挟持
2.1 什么是 HTTP 挟持
在运营商的路由器节点上,设置协议检测,一旦发现是 HTTP 请求且是 HTML 类型请求,则拦截处理。常见有两种:
2.2 HTTP 挟持防御
<meta http-equiv="Cache-Control" content="no-siteapp"> <meta http-equiv="Cache-Control" content="no-transform " />
禁止转码