【HTTP】HTTP安全相关知识
一、浏览器安全
- 跨网站脚本(Cross-site scripting,XSS)又称为跨站脚本攻击,是一种经常出现在 Web 应用程序的安全漏洞攻击,也是代码注入的一种。XSS 是由于 Web 应用程序对用户的输入过滤不足而产生的,攻击者利用网站漏洞把恶意的脚本代码注入到网页之中,当其他用户浏览这些网页时,就会执行其中的恶意代码,对受害者用户可能采取 Cookie 窃取、会话劫持、钓鱼欺骗等各种攻击。这类攻击通常包含了 HTML 以及用户端脚本语言。;
- iframe 的滥用品那个: iframe 中的内容是由第三方来提供的,默认情况下他们不受控制,他们可以在 iframe 中运行 JavaScirpt 脚本、Flash 插件、弹出对话框等等,这可能会破坏前端用户体验;
- 跨站点请求伪造(Cross-SiteRequest Forgeries,CSRF),是指攻击者通过设置好的陷阱,强制对已完成认证的用户进行非预期的个人信息或设定信息等某些状态更新,属于被动攻击
- 恶意第三方库: 无论是后端服务器应用还是前端应用开发,绝大多数时候都是在借助开发框架和各种类库进行快速开发,一旦第三方库被植入恶意代码很容易引起安全问题。
1 什么是 XSS 攻击?
1.1 概念
XSS 攻击指的是跨站脚本攻击,是一种代码注入攻击。攻击者通过在网站注入恶意脚本,使之在用户的浏览器上运行,从而盗取用户的信息如 cookie 等。
XSS 的本质是因为网站没有对恶意代码进行过滤,与正常的代码混合在一起了,浏览器没有办法分辨哪些脚本是可信的,从而导致了恶意代码的执行。
攻击者可以通过这种攻击方式可以进行以下操作:
- 获取页面的数据,如 DOM、cookie、localStorage;
- DOS 攻击,发送合理请求,占用服务器资源,从而使用户无法访问服务器;
- 破坏页面结构;
- 流量劫持(将链接指向某网站);
1.2 XSS 类型
XSS 可以分为存储型、反射型和 DOM 型:
- 存储型指的是恶意脚本会存储在目标服务器上,当浏览器请求数据时,脚本从服务器传回并执行。
- 反射型指的是攻击者诱导用户访问一个带有恶意代码的 URL 后,服务器端接收数据后处理,然后把带有恶意代码的数据发送到浏览器端,浏览器端解析这段带有 XSS 代码的数据后当做脚本执行,最终完成 XSS 攻击。
- DOM 型指的通过修改页面的 DOM 节点形成的 XSS。
1.2.1 存储型 XSS
- 攻击者将恶意代码提交到目标网站的数据库中。
- 用户户打开目标网站时,网站服务端将恶意代码从数据库取出,拼接在 HTML 中返回给浏览器。
- 用户浏览器接收到响应后解析执行,混在其中的恶意代码也被执行。
- 恶意代码窃取用户数据并发送到攻击者的网站,或者冒充用户的行为,调用目标网站接执行攻击者指定的操作。
这种攻击常用于带有用户保存数据的网站功能,如论坛发帖、商品评论、用户私信等。
1.2.2 反射型 XSS
- 攻击者构造出特殊的 URL,其中包含恶意代码。
- 用户打开带有恶意代码的 URL 时,网站服务端将恶意代码从 URL 中取出,拼接在 HTML 中返回给浏览器。
- 用户浏览器接收到响应后解析执行,混在其中的恶意代码也被执⾏。
- 恶意代码窃取用户数据并发送到攻击者的网站,或者冒充用户的行为,调用目标网站接执行攻击者指定的操作。
反射型 XSS 跟存储型 XSS 的区别是:存储型 XSS 的恶意代码存在数据库里,反射型 XSS 的恶意代码存在 URL 里。
反射型 XSS 漏洞常用于通过 URL 传递参数的功能,如网站搜索、跳转等。 由于需要用户主动打开恶意的 URL 才能奏效,攻击者往往会结合多种手段诱导用户点击。
例子:
<!D0CTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=10" />
<title>Document</title>
</head>
<body>
<!-- `http://xxx.com/?q=search` -->
<!-- 这个search可以传 </div><script>alert(1)</sciprt><div> 页面打开直接执行 -->
<div>{{ qs.search }}</div>
</body>
</html>
1.2.3 DOM 型 XSS
- 攻击者构造出特殊的 URL,其中包含恶意代码。
- 用户打开带有恶意代码的 URL。
- 用户浏览器接收到响应后解析执行,前端 JavaScript 取出 URL 中的恶意代码并执行。
- 恶意代码窃取用户数据并发送到攻击者的网站,或者冒充用户的行为,调查目标网站执行攻击者指定的操作。
DOM 型 XSS 跟前两种 XSS 的区别:DOM 型 XSS 攻击中,取出和执行恶意代码由浏览器端完成,属于前端 JavaScript 自身的安全漏洞,而其他两种 XSS 都属于服务端的安全漏洞。
1.3 如何防御 XSS 攻击?
可以看到 XSS 危害如此之大, 那么在开发网站时就要做好防御措施,具体措施如下:
- 可以从浏览器的执行来进行预防,一种是使用纯前端的方式,不用服务器端拼接后返回(不使用服务端渲染)。另一种是对需要插入到 HTML 中的代码做好充分的转义。对于 DOM 型的攻击,主要是前端脚本的不可靠而造成的,对于数据获取渲染和字符串拼接的时候应该对可能出现的恶意代码情况进行判断。
- 使用 CSP ,CSP 的本质是建立一个白名单,告诉浏览器哪些外部资源可以加载和执行,从而防止恶意代码的注入攻击。
- CSP 指的是内容安全策略,它的本质是建立一个白名单,告诉浏览器哪些外部资源可以加载和执行。我们只需要配置规则,如何拦截由浏览器自己来实现。
- 通常有两种方式来开启 CSP,一种是设置 HTTP 首部中的 Content-Security-Policy,一种是设置 meta 标签的方式
- 对一些敏感信息进行保护,比如 cookie 使用 http-only,使得脚本无法获取。也可以使用验证码,避免脚本伪装成用户执行一些操作。
2 什么是 CSRF 攻击?
2.1 概念
CSRF 攻击指的是跨站请求伪造攻击,攻击者诱导用户进入一个第三方网站,然后该网站向被攻击网站发送跨站请求。如果用户在被攻击网站中保存了登录状态,那么攻击者就可以利用这个登录状态,绕过后台的用户验证,冒充用户向服务器执行一些操作。
CSRF 攻击的本质是利用 cookie 会在同源请求中携带发送给服务器的特点,以此来实现用户的冒充。
2.2 XSS 类型
常见的 CSRF 攻击有三种:
- GET 类型的 CSRF 攻击,比如在网站中的一个 img 标签里构建一个请求,当用户打开这个网站的时候就会自动发起提交。
- POST 类型的 CSRF 攻击,比如构建一个表单,然后隐藏它,当用户进入页面时,自动提交这个表单。
- 链接类型的 CSRF 攻击,比如在 a 标签的 href 属性里构建一个请求,然后诱导用户去点击。
2.3 如何防御 CSRF 攻击?
CSRF 攻击可以使用以下方法来防护:
- 进行同源检测,服务器根据 http 请求头中 origin 或者 referer 信息来判断请求是否为允许访问的站点,从而对请求进行过滤。当 origin 或者 referer 信息都不存在的时候,直接阻止请求。这种方式的缺点是有些情况下 referer 可以被伪造,同时还会把搜索引擎的链接也给屏蔽了。所以一般网站会允许搜索引擎的页面请求,但是相应的页面请求这种请求方式也可能被攻击者给利用。(Referer 字段会告诉服务器该网页是从哪个页面链接过来的)
- 使用 CSRF Token 进行验证,服务器向用户返回一个随机数 Token ,当网站再次发起请求时,在请求参数中加入服务器端返回的 token ,然后服务器对这个 token 进行验证。这种方法解决了使用 cookie 单一验证方式时,可能会被冒用的问题,但是这种方法存在一个缺点就是,我们需要给网站中的所有请求都添加上这个 token,操作比较繁琐。还有一个问题是一般不会只有一台网站服务器,如果请求经过负载平衡转移到了其他的服务器,但是这个服务器的 session 中没有保留这个 token 的话,就没有办法验证了。这种情况可以通过改变 token 的构建方式来解决。
- 对 Cookie 进行双重验证,服务器在用户访问网站页面时,向请求域名注入一个 Cookie,内容为随机字符串,然后当用户再次向服务器发送请求的时候,从 cookie 中取出这个字符串,添加到 URL 参数中,然后服务器通过对 cookie 中的数据和参数中的数据进行比较,来进行验证。使用这种方式是利用了攻击者只能利用 cookie,但是不能访问获取 cookie 的特点。并且这种方法比 CSRF Token 的方法更加方便,并且不涉及到分布式访问的问题。这种方法的缺点是如果网站存在 XSS 漏洞的,那么这种方式会失效。同时这种方式不能做到子域名的隔离。
- 在设置 cookie 属性的时候设置 Samesite ,限制 cookie 不能作为被第三方使用,从而可以避免被攻击者利用。Samesite 一共有两种模式,一种是严格模式,在严格模式下 cookie 在任何情况下都不可能作为第三方 Cookie 使用,在宽松模式下,cookie 可以被请求是 GET 请求,且会发生页面跳转的请求所使用。
3 什么是中间人攻击?
中间人攻击(Man-in-the-MiddleAttack,简称“MITM 攻击”)是指攻击者与通讯的两端分别创建独立的联系,并交换其所收到的数据,使通讯的两端认为他们正在通过一个私密的连接与对方直接对话,但事实上整个会话都被攻击者完全控制。在中间人攻 击中,攻击者可以拦截通讯双方的通话并插入新的内容。
攻击过程如下:
- 客户端发送请求到服务端,请求被中间人截获。
- 服务器向客户端发送公钥
- 中间人截获公钥,保留在自己手上。然后自己生成一个伪造的公钥,发给客户端。
- 客户端收到伪造的公钥后,生成加密 hash 值发给服务器。
- 中间人获得加密 hash 值,用自己的私钥解密获得真秘钥。同时生成假的加密 hash 值,发给服务器。
- 服务器用私钥解密获得假密钥。然后加密数据传输给客户端。
3.1 如何防范中间人攻击?
就比如为什么 https 可以解决中间人攻击,为什么在 https 之前都无法解决中间人攻击
4 网络劫持有哪几种,如何防范?
⽹络劫持分为两种:
4.1 DNS 劫持
输入京东被强制跳转到淘宝这就属于 dns 劫持
- DNS 强制解析: 通过修改运营商的本地 DNS 记录,来引导用户流量到缓存服务器
- 302 跳转的方式: 通过监控网络出的流量,分析判断哪些内容是可以进行劫持处理的,再对劫持的内存发起 302 跳转的回复,引导用户获取内容
4.2 HTTP 劫持
访问谷歌但是一直有贪玩蓝月的广告,由于 http 明文传输,运营商会修改你的 http 响应内容(即加广告)
DNS 劫持由于涉嫌违法,已经被监管起来,现在很少会有 DNS 劫持,但 http 劫持依然非常盛行最有效的办法就是全站 HTTPS,将 HTTP 加密,这使得运营商非法获取明文,就没法劫持你的响应内容。
1 XSS 学习 CSDN 软件开发网 https://blog.csdn.net/uygygf/article/details/141687542 2 简述 XSS 防范方法。百度 https://easylearn.baidu.com/edu-page/tiangong/bgkdetail?id=d35b18fdf61fb7360b4c65a1&fr=search 3 面试遇到 Web 安全 XSS 攻击问题,该如何完美回答? 简书 https://www.jianshu.com/p/b986f669b001 4 什么是 XSS ,如何避免? 技术成就梦想 https://blog.51cto.com/u_16097317/6905429
XSS(Cross-Site Scripting)是一种常见的 Web 安全漏洞,攻击者通过在 Web 应用中注入恶意脚本代码,使得用户在浏览器中执行该恶意脚本,从而盗取用户信息、篡改网页内容或进行其他恶意操作。以下是关于 XSS 的触发方式、避免方法以及面试时如何回答的相关内容:
XSS 的触发方式 XSS 攻击通常分为三种类型:反射型 XSS、存储型 XSS 和 DOM 型 XSS。它们的触发方式各不相同:
反射型 XSS:触发方式:当用户访问含有恶意脚本的 URL 时,脚本会被服务器反射回来并在用户的浏览器中执行。常见来源:搜索框、登录表单、URL 参数等。示例:攻击者通过发送一个包含恶意脚本的 URL,诱使用户点击,当用户访问该 URL 时,恶意脚本会在用户的浏览器中执行。
存储型 XSS:触发方式:当服务器加载含有恶意脚本的数据时,脚本就会被执行。这些恶意脚本被持久化存储在服务器上,对所有访问该页面的用户都构成威胁。常见来源:评论、博客文章、论坛帖子等。示例:攻击者在评论区发布包含恶意脚本的评论,当其他用户访问该评论页面时,恶意脚本会被执行。
DOM 型 XSS:触发方式:由于客户端 JavaScript 错误处理输入导致恶意脚本在用户浏览器中执行。示例:攻击者通过修改 DOM 中的页面元素来实现攻击,当用户通过点击或键盘导航将焦点移动到一个被修改的元素上时,就会触发攻击。避免 XSS 的方法输入验证和过滤:对用户输入的数据进行有效的验证和过滤,防止恶意脚本注入。最好采用白名单过滤,只允许特定类型的数据出现。输出编码:在将用户输入的数据显示到网页上时,进行适当的输出编码。将特殊字符转换成对应的 HTML 实体,从而防止脚本在浏览器中执行。使用
HttpOnly Cookie:在设置 Cookie 时,使用 HttpOnly 属性。防止通过 JavaScript 获取 Cookie,降低 Cookie 被盗取的风险。 CSP(Content Security Policy):通过设置 CSP,限制网页中可以加载的资源。只允许从指定的源加载脚本和资源,减少 XSS 攻击的可能性。使用安全的 Web 框架和库:这些框架通常内置了 XSS 防御机制,避免手动编写不安全的代码。定期更新和修复:定期更新和修复 Web 应用,及时修复已知的安全漏洞。面试时如何回答在面试中,当被问到关于 XSS 的问题时,可以按照以下结构来回答:
定义和类型:简要介绍 XSS 的定义和类型(反射型、存储型、DOM 型)。触发方式:详细描述每种类型的 XSS 攻击的触发方式和常见来源。可以结合具体示例来解释。防御方法:列举并解释避免 XSS 的方法,如输入验证和过滤、输出编码、使用 HttpOnly Cookie、CSP 等。强调定期更新和修复 Web 应用的重要性。实践经验:如果有实际处理过 XSS 攻击的经验,可以分享具体的处理过程和结果。如果没有实际经验,可以谈论在项目中如何遵循最佳实践来预防 XSS 攻击。持续学习:强调 Web 安全是一个不断变化的领域,需要持续学习和关注最新的安全漏洞和防御方法。通过以上结构化的回答,可以清晰地展示你对 XSS 攻击的理解、防御方法以及实践经验,从而给面试官留下深刻的印象。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)