【普及向】给学妹讲讲什么是web安全

一、从“Web安全”关键词讲起

web安全,从语法上判断,这是一个合成词。 web——万维网,是一个透过互联网访问的,由许多互相链接的超文本组成的系统,也是互联网的基石。 安全——可以控制特定已被识别的危害,使风险在一定可接受的水准以下,因此也可以减少一些造成健康或经济损失的可能性。

二、聊聊浏览器及其安全攻防策略

2.1 同源协议

同源策略是由Netspace提出来的一种安全策略。 URL格式: 同源的源由一个URL的协议(protocol)、主机(host)、端口(port)定义,如果这三者一致,那么就是同源。反之,任何一个条件不满足,便是跨域。 浏览器针对同源协议的安全策略: 不同源之间的XMLHttpRequest不被允许,即在服务端默认未开启CORS(跨域资源共享Access-Control-Allow-Origin)权限设置的时候,JavaScript无法向非同源协议发起访问
另外:同源协议只针对ajax请求,所以例如表单提交,script标签,img标签中的src以及其他例如video audio之类的标签,websocket中非同源的内容都是允许的。

2.2 浏览器沙箱环境

现代浏览器采用多进程架构。 如Chrome的主要进程分为:浏览器进程、渲染进程、插件进程、扩展进程。 也就是说,浏览器打开任何一个网站,都会同时启动四个新的进程。 其中渲染进程,就是web网页中使用的进程。渲染引擎由Sandbox隔离,网页内容要与浏览器内核进程通信要过IPCchannel,在其中进行安全检查。JavaScript所能执行的功能,就被牢牢地限定在这个进程中,所以web网站的权限相当有限(这也是为什么各大厂商都疯狂推荐客户端而非使用能替代的h5网页,毕竟用户信息能卖钱)。

2.3 恶意网站拦截名单

原理:一般都是浏览器周期性地从服务器端获取一份最新的恶意网址黑名单,如果用户上网时访问的网址存在此黑名单中,浏览器就会弹出一个警告页面。 恶意网址主要有两类: 木马网站,网站由恶意代码通过浏览器漏洞执行shellcode,植入木马 钓鱼网站,模仿知名网站欺骗用户(比如常见的盗号网站) 举一个反例: 996.icu曾经被各大国产主流浏览器厂商拦截

三、从http协议到web攻击

3.1 http协议

HTTP 协议是一个无状态的请求/响应协议,通过建立一个可靠的会话层或者传输层连接来交换消息。

3.2 cookie、session

HTTP 协议无状态的特点是指它不会对发生过的请求和响应的状态做持久化存储。也就是说,HTTP 协议无法根据上一次请求的状态来处理本次请求。在早期,无状态的特点是 HTTP 协议的一大优势,由于不用存储状态,可以极大地提高服务器的运行效率。但是随着时代的发展,在越来越多的场景下,我们需要进行状态的保存以方便处理相应的业务, 简而言之就是服务器无法知道两个请求是否来自同一个浏览器。 于是引入了 Cookie,Session 技术。

Cookie通过在客户端记录信息确定用户身份,Session通过在服务器端记录信息确定用户身份。 cookie本质上是一个约定好的字段,设置好cookie后,浏览器会在每次访问自动带上cookie,这样服务器就知道客户端的身份,针对不同的用户做出不同的响应。

Session

当客户端请求创建一个session的时候,服务器会先检查这个客户端的请求里是否已包含了一个session标识 - sessionId, 如果已包含这个sessionId,则说明以前已经为此客户端创建过session,服务器就按照sessionId把这个session检索出来使用(如果检索不到,一般会新建一个) 如果客户端请求不包含sessionId,则为此客户端创建一个session并且生成一个与此session相关联的sessionId sessionId的值一般是一个既不会重复,又不容易被仿造的字符串,这个sessionId将被在本次响应中返回给客户端保存。保存sessionId的方式大多情况下用的是cookie。

3.3 简述前后端分离

1.由于Ajax技术的出现,使得用户界面不再需要关心后端是如何实现数据修改(因为不再需要通过刷新界面和改变URL来切换不同的显示界面) 2.前端只需要关心从哪个URL(后端路由),通过哪种方式(GET/POST等)能够拿到数据或者提示相关数据的变更并返回相应结果(成功,或者失败),而不再需要关心后台如何编写,具体使用什么语言实现,也就是说后端的任何操作,前端都不需要再关心,只需要通过URL拿到相关的数据,就能在用户界面显示想要的效果。 3.而后端也不再需要关心用户通过URL,需要展示哪张由原本动态渲染出来的界面,只需要编写接口,提供与相关URL对应的http请求的数据,进行相关的操作,将数据转换为JSON并发送对应http请求。 4.于是为了解耦的更彻底,也为了程序员们能更好的专精于某一项具体的业务,前后端分离就成了不得不进行的任务与趋势。 从此前端人员专门负责用户的交互,维护用户的交互体验,并通过http请求进行相关的数据请求与展示操作。 而后端人员则专门对请求进行解析(对params,query等属性的处理,从而明白自己该干什么),对相关数据进行检索或存储,并在处理过后返回给前端。

3.4 h5:localStorage,sessionStorage,indexDB api出现

时代和技术在进步,在h5中,出现了localStorage,sessionStorage,indexDB等api,利用这些api,前端可以在用户端存储相当大的数据,且这些api非常容易记忆和使用。

3.5 h5:token机制:json web token

随着时代的更迭,前后端分离成为主流后,全部数据交互交给ajax后,过往由后端直接设置的cookie机制不再那么适用,为解决这个问题,另外的一种机制jwt应运而生。前端通过访问特定的url(一般是登录)来获取token,并将其设置进localStorage进行存储。在之后的请求中,将其放进http协议中的headers的对应字段中发送给服务端进行校验。

3.6 一些常见web攻击及其攻击形式

xss攻击:

XSS 简单点来说,就是攻击者想尽一切办法将可以执行的代码注入到网页中。 举个例子:原本我们限定用户只使用文字类型进行评论,但是这个用户不讲武德,直接按下f12进行抓包,往字段里写进了一些类似于: img id=”leftbar_overview_author_image” src=”#” onload=”javascript:for(let i=0;i<3;i++)alert(1)” 的html标签 如此,如果我们未作任何转义处理,这段for(let i=0;i<3;i++)alert(1)就会被写进数据库,从而在下次该web网站评论区被访问时,被其他访问该评论区的用户执行,也就是会alert 3次1 而alert事件 会导致js渲染进程的中断,极度影响用户体验。

SQL注入:

SQL注入与XSS攻击在某些地方很是接近,同样是截断数据,往字段中写入一些非法语句,不过SQL针对的就是SQL拼接,比如在后端存在着这样一条拼接的函数(这个写法是不建议的,只做演示):

1
2
3
4
5
6
7
def putRaw(data):
# sql = "insert into %s (html) VALUES('%s')" % (table, pymysql.escape_string(data))
sql = "insert into %s (html) VALUES('%s')" % (table, data)
print(sql)
cursor.execute(sql)
conn.commit()
return True

由于#符号是sql的注释符 如果输入:1’);delete from raw_data# 后端的SQL语句就会变成:

1
insert into raw_data (html) VALUES('1');delete from raw_data#')

从而导致所有数据被删除。 这就是SQL注入的一个简单案例

上述攻击的预防

预防:不管是前端还是后端,都要做好输入输出的校验处理,对数据库一切用户输入进行转义

四、开发中防范web攻击的一些原则

1.认证模块必须采用防暴力破解机制,例如:验证码或者多次连续尝试登录失败后锁定帐号或IP。 2.对于每一个需要授权访问的页面或servlet的请求都必须核实用户的会话标识是否合法、用户是否被授权执行这个操作,以防止URL越权。 3.登录过程中,往服务器端传递用户名和口令时,必须采用HTTPS安全协议(也就是带服务器端证书的SSL)。只提供本机接入、登录,做设备管理使用的场景暂时不要求。 4.对用户的最终认证处理过程必须放到服务器进行。 5.用户产生的数据必须在服务端进行校验;数据在输出到客户端前必须先进行HTML编码,以防止执行恶意代码、跨站脚本攻击。对于不可信的数据,输出到客户端前必须先进行 HTML 编码。 6 使用主流Web安全扫描工具扫描Web服务器和Web应用,不存在“高”级别的漏洞。 7.非嵌入式产品的Web应用,应使用预编译语句PreparedStatement代替直接的语句执行Statement,以防止SQL注入。