随着互联网的发展,各种Web应用变得越来越复杂。在满足用户各种需求的同时,各种网络安全问题也应运而生。相继。作为前端工程师,我们无法逃避这个问题。今天,我们就来看看Web前端存在的安全问题,以及如何检测和防范这些问题。非前端的攻击(如SQL注入、DDOS攻击等)本文不做讨论,毕竟后端不是我擅长的领域。QQ邮箱、新浪微博、YouTube、WordPress、百度等知名网站均遭到攻击。如果你从来没有出现过安全问题,那不是因为你开发的网站非常安全,更有可能是你的网站流量很低或者没有攻击价值。本文主要讨论以下几种攻击方式:XSS攻击、CSRF攻击、点击劫持和URL跳转漏洞。希望您在阅读本文后能够很好地回答以下面试问题。1.前端攻击方式有哪些?2、什么是XSS攻击?XSS攻击有几种类型?如何防止XSS攻击?3.什么是CSRF攻击?如何防止CSRF攻击4.如何检查网站是否安全?在开始之前,建议您先克隆代码。我已经为你准备了示例代码,并写了详细的注释。您可以比较代码以了解每种攻击以及如何预防它。毕竟,无论你读了多少文字,都比不上实用。(操作步骤在Readme中写的很详细):https://github.com/YvetteLau/...更多优质文章可戳:https://github.com/YvetteLau/...1.XSSXSS攻击(Cross-SiteScripting,跨站脚本攻击)是一种代码注入攻击。攻击者在目标网站注入恶意代码,当受害者登录网站时恶意代码就会被执行。这些脚本可以读取cookies、sessiontoken或其他网站敏感信息,钓鱼和欺诈用户,甚至发动蠕虫攻击等。XSS的本质是恶意代码不被过滤,与网站正常代码混合;浏览器无法分辨哪些脚本是可信的,导致恶意脚本被执行。由于直接在用户终端执行,恶意代码可以直接获取用户信息,并利用这些信息冒充用户向网站发起攻击者自定义请求。XSS分类根据攻击来源,XSS攻击可分为存储型(持久型)、反射型(非持久型)和DOM型三种。下面我们来详细了解一下这三种类型的XSS攻击:1.1ReflectedXSS当用户点击恶意链接,或者提交表单,或者进入恶意网站时,注入的脚本就会进入受害者的网站。网络服务器会注入脚本,如错误信息、搜索结果等,不经过滤直接返回给用户浏览器。反射型XSS攻击步骤:攻击者构造一个包含恶意代码的特殊URL。当用户打开带有恶意代码的URL时,网站服务器会从该URL中提取恶意代码,拼接成HTML返回给浏览器。用户浏览器收到响应后,解析并执行,其中混入的恶意代码也被执行。恶意代码窃取用户数据并发送到攻击者网站,或冒充用户调用目标网站的接口执行攻击者指定的操作。反射型XSS漏洞常见于通过URL传递参数的功能,例如网站搜索和重定向。由于需要用户主动打开恶意网址才能生效,因此攻击者往往会结合多种手段诱导用户点击。POST的内容也可以触发反射型XSS,但是触发条件比较苛刻(需要构建表单提交页面,引导用户点击),所以很少见。查看反射攻击示例请戳:https://github.com/YvetteLau/...根据README.md中的提示操作(实际情况需要诱导用户点击,以上代码为仅用于演示)。注意Chrome和Safari可以检测到url的xss攻击并屏蔽网页,但是其他浏览器不能,比如Firefox,如果不希望前端获取cookie,可以在后端设置httpOnly(但这不是XSS攻击的解决方案,只能减少破坏范围)如何防止反射型XSS攻击对字符串进行编码。在输出到页面之前对url的查询参数进行转义。app.get('/welcome',function(req,res){//编码查询参数以避免反射型XSS攻击res.send(`${encodeURIComponent(req.query.type)}`);});1.2DOM-typeXSSDOM型XSS攻击,其实是前端JavaScript代码不够严谨,会在页面中插入不可信的内容。在使用.innerHTML、.outerHTML、.appendChild、document.write()等API时要特别小心。不要将不受信任的数据作为HTML插入页面,尝试使用.innerText、.textContent、.setAttribute()、DOM型XSS攻击步骤:攻击者构造特殊数据,其中包含恶意代码。用户的浏览器执行恶意代码。恶意代码窃取用户数据并发送到攻击者网站,或冒充用户调用目标网站的接口执行攻击者指定的操作。如何防止DOM型XSS攻击防止DOM型XSS攻击的核心是对输入内容进行转义(DOM中的内联事件监听器和链接跳转可以将字符串作为代码运行,需要检查其内容)。1、对于url链接(比如图片的src属性),直接使用encodeURIComponent进行转义。2、非url,我们可以这样编码:functionencodeHtml(str){returnstr.replace(/"/g,'"').replace(/'/g,''').replace(//g,'>');}DOM型XSS攻击,恶意代码的提取和执行由浏览器完成,属于前端JavaScript本身的安全漏洞.查看DOM类型XSS攻击示例(根据readme提示查看)请戳:https://github.com/YvetteLau/...1.3StoredXSS恶意脚本永久保存在目标服务器上。当浏览器请求数据时,脚本从服务器传回并执行,影响范围比反射型和DOM型XSS要大。存储型XSS攻击的原因还是数据过滤没做好:前端向服务器提交数据时,没有做好过滤;当服务器收到数据时,在存储之前,不做任何过滤;前端从服务器请求数据而不过滤输出。存储型XSS攻击步骤:攻击者将恶意代码提交到目标网站的数据库中。当用户打开目标网站时,网站服务器从数据库中取出恶意代码,拼接成HTML返回给浏览器。用户浏览器收到响应后,解析并执行,其中混入的恶意代码也被执行。恶意代码窃取用户数据并发送到攻击者网站,或冒充用户调用目标网站的接口执行攻击者指定的操作。这种攻击常见于有用户保存数据的网站功能,如论坛帖子、产品评论、用户私信等。如何防止存储型XSS攻击:前端数据传到服务器前,先转义/过滤(不能防止数据被抓取修改)。服务端收到数据,在存入数据库之前,进行转义/过滤。在页面显示传入数据前,先转义/过滤查看存储的XSS攻击示例(根据Readme提示查看),请戳:https://github.com/YvetteLau/...另外注意逃逸,我们还需要一些其他的手段来防止XSS攻击:1.内容安全策略在服务器端使用HTTP的Content-Security-Policy头来指定策略,或者在前端设置meta标签。例如下面的配置只允许加载同域下的资源:Content-Security-Policy:default-src'self'在前端和服务器端设置CSP的效果是一样的,但是不能用meta上报。更多设置可以查看[Content-Security-Policy](https://developer.mozilla.org...StrictCSP可以防止XSS起到以下作用:禁止加载外域代码,防止复杂的攻击逻辑。禁止外域提交网站被攻击后,用户数据不会泄露到外域禁止内联脚本执行(规则比较严格,目前使用GitHub)禁止未经授权的脚本执行(新功能,谷歌地图手机版正在使用中。合理使用上报可以及时发现XSS,有助于尽快修复问题。2.输入内容长度控制对于不可信的输入,应该限制在一个合理的长度。虽然XSS不能被完全杜绝,增加XSS攻击的难度3.输入内容限制对于某些输入,可以限制不能包含特殊字符或只能输入数字。4.其他安全措施HTTP-onlyCookie:禁止JavaScript读取某些敏感cookie,攻击者完成XSS注入后无法窃取此cookie。Captcha:防止脚本冒充用户提交危险操作。1.5XSS检测看完本文相信你已经知道什么是XSS攻击,XSS攻击的种类,以及如何防范XSS攻击。但是有一个很重要的问题:我们如何检测XSS攻击,如何知道我们的页面是否存在XSS漏洞?很多大公司都有专门的安全部门负责这项工作,但是如果没有安全部门,开发者自己怎么检测呢?1.使用常见的XSS攻击字符串手动检测XSS漏洞如:jaVasCript:/*-/*`/*\`/*'/*"/**/(/**/oNcliCk=alert())//%0D%0A%0d%0a//\x3csVg/\x3e可以检测到存在HTML属性、HTML文本内容、HTML注释、跳转链接、内联JavaScript字符串、内联CSS样式表等XSS漏洞检测,还可以检测eval()、setTimeout()、setInterval()、Function()、innerHTML、document.write()等DOM型XSS漏洞,并可绕过部分XSS过滤器2.使用第三方工具扫描(见上一章)__2.CSRFCSRF(Cross-siterequestforgery)跨站请求伪造:攻击者诱导受害者进入第三方网站,在第三方网站中,向被攻击网站发送跨站请求,受害者已经在获取到的注册凭证绕过后台用户验证,达到冒充用户对被攻击网站进行操作的目的。典型的CSRF攻击流程:受害者登录站点A,并保留登录凭证(Cookie)。攻击者诱导受害者访问站点B,站点B向站点A发送请求,浏览器默认会携带站点A的cookie信息。A站点收到请求后,核实请求,确认是受害者的凭据,误认为是无辜受害者发送的请求。SiteA代表受害者执行了SiteB的请求。攻击完成,攻击者冒充受害者在受害者不知情的情况下完成攻击。一图抵千言:CSRF的特点1、攻击通常是在第三方网站发起的,比如图中的站点B,站点A无法阻止攻击的发生。2.攻击利用受害者在被攻击网站的登录凭证冒充受害者提交操作;不获取cookie信息(cookie有同源策略)3、跨站请求可以通过多种方式:图片URL、超链接、CORS、表单提交等(来源不明的链接,请勿点击)到运行代码,可以更直观的了解到用户loki银行存款10W。用户yvette在银行存款1000。下面我们就来看看江一楠是如何通过CSRF攻击把loki的钱偷偷转到自己的账户上的,按照提示看看如何防御CSRF攻击。请戳:https://github.com/YvetteLau/...【根据readme中CSRF部分操作】CSRF攻击防御1.添加验证码(体验不好)验证码可以防止CSRF攻击,但是我们不能't每次交互都需要验证码,否则用户体验会很差,但是我们可以在转账、交易等操作中添加验证码,以保证我们账户的安全。2、判断请求来源:DetectReferer(不安全,Referer可以修改)`Referer`可以作为判断请求来源是否安全的辅助手段,但是由于`Referer`本身是可以修改的,因为不能只依赖`Referer`3.使用Token(主流)的CSRF攻击之所以能够成功,是因为服务器误认为攻击者发送的请求是用户自己的请求。那么我们可以要求所有的用户请求都携带一个CSRF攻击者获取不到的Token。服务器通过验证请求是否携带正确的Token来区分正常请求和攻击请求。类似于验证码,但用户无感知。-服务器为用户生成一个token,加密后传递给用户-用户在提交请求时需要携带这个token-服务器验证token是否正确4.SamesiteCookie属性为了解决这个问题从源头上看,Google起草了一份Draft来改进HTTP协议,在Set-Cookie响应头中加入了Samesite属性,用来表示该cookie是“同站cookie”。同一站点cookie只能用作第一方cookie,不能用作第三方cookie。Samesite有两个属性值,分别是Strict和Lax。部署简单,可有效防御CSRF攻击,但存在兼容性问题。Samesite=StrictSamesite=Strict称为严格模式,表示此cookie在任何情况下都不能作为第三方cookie使用,具有防止所有CSRF攻击的能力。此时,如果我们在B站点下向A站点发起任何请求,则cookie请求头中不会包含A站点的cookie。**Samesite=Lax**`Samesite=Lax`称为松散模式。相比Strict,它放宽了限制,允许发送带有cookie的安全HTTP方法,如`Get`/`OPTIONS`,`HEAD`请求。但是,不安全的HTTP方法,如`POST`,`PUT`,`DELETE`请求,不能用作第三方链接的cookie。为了更好的防御CSRF攻击,我们可以结合使用以上防御方式。3、点击劫持点击劫持是指在网页中隐藏一个透明的iframe,利用虚假页面的外层诱导用户点击。其实就是在隐藏框上触发点击事件,进行一些用户不知道的操作。典型的点击劫持攻击流程攻击者建立一个非常有吸引力的网页【不知道什么内容对你有吸引力,就不写页面了,偷懒】并将被攻击页面放在当前页面的顶部使用iframe中的样式,将iframe叠加在非常吸引人的内容之上。将iframe设置为100%透明。您被诱导点击网页的内容。你以为你点了*,其实你被攻击成功了。点击劫持防御1.framebustingFramebustingif(top.location!=window.location){top.location=window.location}需要注意的是HTML5中iframe的sandbox属性和IE中iframe的security属性都可以限制执行iframe页面中的JavaScript脚本,可以使framebusting无效。2、X-Frame-OptionsX-FRAME-OPTIONS是微软提出的一个http头,专门用来防御利用iframe嵌套的clickjacking攻击。并且在IE8、Firefox3.6、Chrome4以上版本都能很好的支持。可以设置为以下值:DENY:拒绝任何域加载SAMEORIGIN:允许同源域加载ALLOW-FROM:可以定义允许加载frame的页面地址重定向时,传入的重定向地址客户端未进行合法性检查,导致用户浏览器跳转到钓鱼页面。URL重定向一般有以下几种实现方式:Header头重定向Javascript重定向META标签重定向URL重定向漏洞防御出现URL重定向漏洞的原因是服务器没有对客户端传递的重定向地址进行合法校验。因此,防止这种攻击的方法是验证客户端传递的重定向URL。1、对referer的限制如果确定了传递URL参数的来源,我们可以通过这种方式进行安全限制,保证URL的合法性,防止恶意用户自己生成跳转链接。2、添加有效性验证Token,保证所有生成的链接都来自可信域。通过在生成的链接中加入用户无法控制的token来验证生成的链接,可以防止用户自己生成恶意链接并被利用。安全扫描工具上面我们介绍了几种常见的前端安全漏洞,也学习了一些防范措施,那么我们如何发现自己网站的安全问题呢?没有安全部门的公司可以考虑以下开源代码扫描工具:1.ArachniArachni是一个基于Ruby的开源、综合、高性能的漏洞扫描框架。Arachni提供了一种简单快速的扫描方法。您只需输入目标网站的网址即可开始扫描。它可以通过分析扫描过程中获得的信息来评估漏洞识别的准确性,避免误判。Arachni默认集成了大量的检测工具,可以实现代码注入、CSRF、文件包含检测、SQL注入、命令行注入、路径遍历等多种攻击方式。同时还提供了各种插件,可以实现表单爆破、HTTP爆破、防火墙检测等功能。针对大型网站,该工具支持会话持久化、浏览器集群、快照等功能,帮助用户更好的进行渗透测试。2、MozillaHTTPObservatoryMozillaHTTPObservatory是Mozilla最近发布的一款名为Observatory的网站安全分析工具,旨在鼓励开发者和系统管理员加强网站的安全配置。使用方法很简单:输入网站URL,即可访问并分析网站HTTP头,然后为网站安全提供一个数字分值和字母安全级别。主要检查范围包括:Cookie跨源资源共享(CORS)内容安全策略(CSP)HTTP公钥固定(PublicKeyPinning)HTTP严格安全传输(HSTS)状态是否存在从HTTP到HTTPs的自动重定向子资源完整性(子资源完整性)X-Frame-OptionsX-XSS-Protection3。w3afW3af是一个基于Python的Web应用程序安全扫描器。帮助开发人员,帮助开发人员和测试人员识别Web应用程序中的漏洞。该扫描器能够识别200多个漏洞,包括跨站点脚本、SQL注入和操作系统命令。参考文章:[1]https://github.com/0xsobky/哈...[2]https://tech.meituan.com/2018...[3]https://zhuanlan.zhihu.com/p/...[4]https://mp.weixin.qq.com/s/up...[5]https://juejin.im/post/5b4e0c...[6]https://juejin.im/post/5c8a33...[7]https://github.com/OWASP/Chea...后续写作计划(写作顺序不定)1.《寒冬求职季之你必须要懂的原生JS》(下)2.《寒冬求职季之你必须要知道的CSS》3.《寒冬求职季之你必须要懂的一些浏览器知识》4.《寒冬求职季之你必须要知道的性能优化》5.《寒冬求职季之你必须要懂的webpack原理》对于React技术栈:1.《寒冬求职季之你必须要懂的React》系列2.《寒冬求职季之你必须要懂的ReactNative》系列写这篇文章,虽然花了不少时间,但是在这个过程中,我也学到了很多知识,感谢您愿意花宝贵的时间阅读本文,如果本文对您有一点帮助或启发,请不要吝啬您的点赞和star,您的肯定是最大的动力我继续前进。https://github.com/YvetteLau/...推荐关注我公众号: