当前位置: 首页 > Web前端 > HTML

[面试专题]前端需要知道的web安全知识

时间:2023-04-02 22:29:56 HTML

【采访话题】前端需要知道的Web安全知识XSS【要点】??CSRF【要点】中间人攻击【要点】Sql/Nosql注入攻击CryptoNode.js的crypto模块封装了很多加密函数,包括OpenSSL的hash、HMAC、加密、解密、签名和验证功能等。加密如何保证用户密码的安全?客户端加密增加了密码在传输过程中被第三方嗅探后破解的成本。对于游戏,客户端加密是为了防止作弊/破解等,服务端加密(比如md5)是为了防止管理数据库的DBA或者攻击者攻击数据库后直接获取明文密码,从而提高安全性。TLS/SSL早期的网络传输协议只在大学里使用,所以默认相互信任。因此可以说,传统的网络通信是不考虑网络安全的。早期的浏览器厂商Netscape设计了SSL(SecureSocketLayer)来应对这种情况。SSL的主要目的是对用户和服务器进行身份验证,确保数据发送到正确的客户端和服务器;加密数据以防止数据被盗;维护数据完整性并确保数据在传输过程中不被更改。具有三个特点:保密性:SSL协议使用密钥对通信数据进行加密可靠性:服务器端和客户端都会进行认证,客户端的认证是可选的。完整性:SSL协议会对传输的数据进行完整性检查。1999年,SSL因其广泛的应用而成为互联网事实上的标准。IETF在当年Standardize/strengthenSSL。标准化后的名称更改为传输层安全性(TLS)。很多相关的文章都把两者一起提到(TLS/SSL),因为这两者可以看成是同一个不同阶段的东西。HTTPS是在网络上,每个网站都在自己的服务器上,要确保你访问的是正确的网站,并访问本网站的正确数据(未被劫持/篡改),除了需要传输安全之外,还需要进行安全认证。目标网站不能进行身份验证,否则恶意/钓鱼网站也可以说自己是对的。因此,为了维护互联网上网络之间的基本信任,早期的大厂商们联手推动了一种叫做PKI的基础设施,通过第三方方来认证网站。公钥基础设施(PKI)是一种符合标准的技术和规范,它使用公钥加密技术为电子商务的发展提供安全的基础平台。其基本建设包括认证中心(CertificationAuthority,CA)、注册中心(RegisterAuthority,RA)、目录服务(DirectoryService,DS)服务器。RA协调审核用户的证书申请,将证书申请发送给CA进行处理,颁发证书,并将证书公布给DS。在使用证书的过程中,除了检查证书的信任关系和证书本身的正确性外,还通过生成和发布证书撤销列表(CRL)来检查证书的状态。确认检查以了解证书是否因某种原因已失效。证书就像一张个人身份证,其内容包括证书序列号、用户名、公钥(PublicKey)、证书有效期等。在TLS/SLL中可以使用OpenSSL生成所用的公钥/私钥用于TLS/SSL传输期间的身份验证。但是这个公/私钥是自己生成的,可以通过PKI基础设施获取权威的第三方证书(密钥)来加密HTTP传输的安全性。目前博客圈比较流行的是Let'sEncrypt发放免费的HTTPS证书。需要注意的是,如果PKI被攻击,那么HTTPS也是不安全的。可以参考HTTPShijacking-讨论中了解情况,证书是由CA颁发的权威机构颁发的,一般浏览器遇到非权威的CA权威机构会警告(见12306),但如果你信任一个未知权限/证书在某些特殊情况下,也可能被劫持。另外,有些CA机构是通过邮件进行认证的,所以当某个网站的邮件服务被攻击/渗透时,攻击者也可能从CA机构获得权威正确的证书。XSS跨站脚本(Cross-SiteScripting,XSS)是一种代码注入方式,为了区别于CSS,称之为XSS。早期常见于互联网论坛,由于网站没有严格限制用户输入,允许攻击者上传脚本到帖子中供他人浏览带有恶意脚本的页面,其注入方式非常简单,包括但不限于JavaScript/VBScript/CSS/Flash等,当其他用户浏览到这些网页时,就会执行这些恶意脚本,进行cookie窃取/会话劫持/钓鱼和欺骗将对用户进行原理,比如使用js脚本收集当前用户环境的信息(Cookie等),然后通过img.src、Ajax、onclick将用户数据传递给攻击者的服务器/onload/onerror事件等。钓鱼是常见的使用脚本进行视觉欺骗,构建虚假的恶意按钮来覆盖/替换真实场景等。在真实评分数据上误导用户)。反射型XSS:非持久性,诱骗用户点击链接,url中包含攻击代码,用户点击后执行攻击代码。StoredXSS:持久化,攻击提交恶意代码到服务器,服务器存储代码,这样当其他用户请求时,服务器返回gai'go'n发送给用户,用户在浏览时可能被攻击这样一个页面例如:恶意用户的HTML或JS输入服务器->进入数据库->查询数据库->服务器响应时用户浏览器。预防与过滤输入编码过滤:对每一次输入,验证字符是否合法,长度是否合法,格式是否正确,对每一次输入的字符进行转义。非法字符过滤。输出编码过滤:对于所有动态输出到页面的内容,进行相关的编码和转义。主要包括HTML字符过滤转义、JS脚本转义过滤、url转义过滤。设置http-only以避免攻击脚本读取cookie。CPS策略是无奈,在没有统一解决方案的情况下,厂商纷纷推出CPS策略。以Node.js为例,计算脚本的hash值:constcrypto=require('crypto');functiongetHashByCode(code,algorithm='sha256'){returnalgorithm+'-'+crypto.createHash(algorithm).update(code,'utf8').digest("base64");}getHashByCode('console.log("helloworld");');//'sha256-wxWy1+9LmiuOeDwtQyZNmWpT0jqCUikqaqVlJdtdh/0='设置CSP标头:content-security-policy:script-src'sha256-wxWy1+9LmiuOeDwtQyZNmWpT0jqCUikqaqVlJdtdh/0='console.log('helloworld');Policy说明可以参考CSPPolicyDirectives和RuanYifeng的博文,屈大神的博文CSRFCross-SiteRequestForgery(Cross-SiteRequestForgery)是一种伪造跨站请求的攻击方式。例如,利用你在A站点(攻击目标)上的cookie/permissions来组装B站点(恶意/钓鱼网站)上A站的请求。已知某站点A的删除接口是到某个地址,指定一个帖子的id。组织一个get请求删除A站在B网站上的一篇文章,然后A站用户访问B站,触发请求。一个帖子可以在不知情的情况下被删除。同源策略是最早用来防止CSRF的方法之一,这种方式只能在同源/信任的情况下才能请求跨站请求(Cross-SiteRequest)。但是如果一个网站组,在相互信任的情况下,一个网站出现了问题:a.public.comb.public.comc.public.com...以上情况,如果c.public.com不防xss等情况下,攻击者可以基于该站点对其他可信站点发起CSRF攻击。另外,同源策略主要是通过浏览器来验证,不同的浏览器有不同的实现,所以在一些浏览器上可以直接绕过,也可以直接通过浏览器短信绕过。预防措施:在HTTPheader中的CSRFtoken.cookie中加入一个hash随机数。通过检查过滤简单的CSRF攻击,主要检查两个头:通信的一部分认为他们正在通过专用连接直接相互交谈,但实际上整个会话都被阻止了,攻击者拥有完全的控制权。在中间人攻击中,攻击者可以拦截双方的通信并插入新的内容。目前比较常见的是在公共场所放置精心准备的免费wifi,劫持/监控通过wifi的流量。或攻击路由器,连接到您的家庭wifi,然后在入侵您的家庭wifi后劫持其上的流量。对于通信过程中的MITM,常见的解决方案是通过PKI/TLS来防范,甚至通过第三方中间人的wifi来防范。你通过HTTPS访问的页面还是安全的。HTTP协议是明文传输的,根本没有任何保护。拥有强大的相互认证并不常见。你确认他之后,他也会确认你;延迟测试,统计传输时间,如果通信延迟过高,则认为可能有第三方中间人;etc.SQL/NoSQLinjection注入攻击是指当执行的某些操作由用户传入时,用户可以将自己的恶意逻辑注入到操作中。当你使用eval时,newFunction等,如果执行的字符串中有部分用户输入,则可能会被注入。上面提到的XSS是一种注入攻击。上一章也提到,Node.js的child_process.exec调用bash分析,如果执行的命令有一部分属于用户输入,也有可能被注入攻击。SQLSql注入是网站常见的注入攻击方式。主要原因是登录时需要验证用户名/密码,执行sql类似:SELECT*FROMusersWHEREusernae='myName'ANDpassword='mySecret';其中用户名和密码属于用户自己输入的部分,用户可能不经检查就进行恶意字符串拼接以达到某种目的,例如上传密码为';删除表用户;--这样最终执行的内容就是:SELECT*FROMusersWHEREusernae='myName'ANDpassword='';删除表用户;--';其所能实现的功能,包括但不限于删除数据(经济损失)、篡改数据(密码等)、窃取数据(网站管理权限、用户数据)等。防范手段常见于:添加前缀表名/字段名(避免被猜到)和报错隐藏表信息(避免被看到,12306早期出过问题)过滤SQL中可以拼接的关键字符,转义用户输入,验证用户输入类型(避免limit、orderby等注入)等...NoSQLview一个简单的案例:let{user,pass,age}=ctx.query;db.collection.find({user,pass,$where:`this.age>=${age}`})那么这里的age是可以注入的。另外GET/POST也可以传递深层结构(比如?name[0]=alan向上传递),会导致通过qs等模块解析后注入,比如cnodejs遇到mongodb注入。DDOSDDoSisDistributedDenialofService,分布式拒绝服务也就是说,攻击者利用或利用服务器技术,将多台计算机(肉鸡或僵尸)组合起来作为攻击平台,同时向一台或多台目标服务器发送大量垃圾信息,或使用某种干扰信息。导致目标服务器无法及时响应正常用户请求,或直接导致目标服务器崩溃,无法为正常用户提供服务的攻击行为。攻击方式:端口扫描攻击pingflood攻击SYNflood攻击FTP跳转攻击防范手段:保证服务器系统的安全,保证服务器软件不存在任何漏洞,防止攻击者入侵。确保服务器使用最新的系统并打上安全补丁。删除服务器上未使用的服务并关闭未使用的端口。对于在服务器上运行的网站,确保它们是最新的补丁并且没有安全漏洞。隐藏服务器的真实IP地址