SQL注入攻击是黑客对数据库进行攻击的经常使用手段之一。随着B/S模式应用开发的发展,使用这种模式编写应用程序的程序员也愈来愈多。可是因为程序员的水平及经验也良莠不齐,至关大一部分程序员在编写代码的时候,没有对用户输入数据的合法性进行判断,使应用程序存在安全隐患。用户能够提交一段数据库查询代码,根据程序返回的结果,得到某些他想得知的数据,这就是所谓的SQL Injection,即SQL注入。前端
普通注入:程序员
编码注入:web
跨站脚本攻击(Cross Site Scripting),为不和层叠样式表(Cascading Style Sheets, CSS)的缩写混淆,故将跨站脚本攻击缩写为XSS。XSS是一种常常出如今web应用中的计算机安全漏洞,它容许恶意web用户将代码植入到提供给其它用户使用的页面中。好比这些代码包括HTML代码和客户端脚本。攻击者利用XSS漏洞旁路掉访问控制——例如同源策略(same origin policy)。这种类型的漏洞因为被黑客用来编写危害性更大的网络钓鱼(Phishing)攻击而变得广为人知。对于跨站脚本攻击,黑客界共识是:跨站脚本攻击是新型的“缓冲区溢出攻击“,而JavaScript是新型的“ShellCode”。算法
反射型XSS:数据库
存储型XSS:后端
CSRF(Cross-site request forgery跨站请求伪造,也被称为“One Click Attack”或者Session Riding,一般缩写为CSRF或者XSRF,是一种对网站的恶意利用。尽管听起来像跨站脚本(XSS),但它与XSS很是不一样,而且攻击方式几乎相左。XSS利用站点内的信任用户,而CSRF则经过假装来自受信任用户的请求来利用受信任的网站。与XSS攻击相比,CSRF攻击每每不大流行(所以对其进行防范的资源也至关稀少)和难以防范,因此被认为比XSS更具危险性。浏览器
文件包含漏洞:安全
文件读取漏洞:网络
文件删除漏洞:架构
文件修改漏洞:
文件上传漏洞:
代码执行函数:
命令执行函数:
反引号命令执行:
函数使用不当:
$$变量覆盖:
之前,对于一个Web应用而言,在前端经过Cookie存储少许用户信息就足够支撑应用的正常运行了。然而随着先后端分离,尤为是后端服务无状态化架构风格的兴起,伴随着SPA应用的大量出现,存储在前端也就是用户浏览器中的数据量也在逐渐增多。
前端应用是彻底暴露在用户以及攻击者面前的,在前端存储任何敏感、机密的数据,都会面临泄露的风险,就算是在前端经过JS脚本对数据进行加密基本也无济于事。
举个例子来讲明,假设你的前端应用想要支持离线模式,使得用户在离线状况下依然可使用你的应用,这就意味着你须要在本地存储用户相关的一些数据,好比说电子邮箱地址、手机号、家庭住址等PII(Personal Identifiable Information)信息,或许还有历史帐单、消费记录等数据。
尽管有浏览器的同源策略限制,可是若是前端应用有XSS漏洞,那么本地存储的全部数据就均可能被攻击者的JS脚本读取到。若是用户在公用电脑上使用了这个前端应用,那么当用户离开后,这些数据是否也被完全清除了呢?前端对数据加密后再存储看上去是个防护办法,但其实仅仅提升了一点攻击门槛而已,由于加密所用到的密钥一样存储在前端,有耐心的攻击者依然能够攻破加密这道关卡。
因此,在前端存储敏感、机密信息始终都是一件危险的事情,推荐的作法是尽量不在前端存这些数据。
缺少静态资源完整性校验
出于性能考虑,前端应用一般会把一些静态资源存放到CDN(Content Delivery Networks)上面,例如Java脚本和Stylesheet文件。这么作能够显著提升前端应用的访问速度,但与此同时却也隐含了一个新的安全风险。
若是攻击者劫持了CDN,或者对CDN中的资源进行了污染,那么咱们的前端应用拿到的就是有问题的JS脚本或者Stylesheet文件,使得攻击者能够肆意篡改咱们的前端页面,对用户实施攻击。这种攻击方式形成的效果和XSS跨站脚本攻击有些类似,不过不一样点在于攻击者是从CDN开始实施的攻击,而传统的XSS攻击则是从有用户输入的地方开始下手的。
防护这种攻击的办法是使用浏览器提供的SRI(Subresource Integrity)功能。顾名思义,这里的Subresource指的就是HTML页面中经过<>和<link>元素所指定的资源文件。
每一个资源文件均可以有一个SRI值,就像下面这样。它由两部分组成,减号(-)左侧是生成SRI值用到的哈希算法名,右侧是通过编码后的该资源文件的Hash值。
<src=“https://example.js”integrity=“sha384eivAQsRgJIi2KsTdSnfoEGIRTo25NCAqjNJNZalV63WKX3Y51adIzLT4So1pk5tX”></>
浏览器在处理这个元素的时候,就会检查对应的JS脚本文件的完整性,看其是否和元素中integrity属性指定的SRI值一致,若是不匹配,浏览器则会停止对这个JS脚本的处理。