关于http请求无状态、短连接(1.1及以后是长连接了)的问题。
引言:
公司面试的时候问了我这么一个关于用户登录的安全性问题,当时我简单的表述了一下我对于http请求的特点:短连接和无状态。(奇怪的是我好像答得不是很好,但是公司还是要我了,O(∩_∩)O哈哈~)。这里我就记录一下我对于B/S结构的http请求的理解,如果有错误之处还请各位看官多多之处,谢谢!
一、短连接
Client端向Service端请求一份报表数据,此时C端和S端就会建立起一个连接,当S端将报表数据反馈给C端之后这个连接就会断开消失。如果C端过了一段时间又需要数据了,那么需要再次建立一个连接
妈耶。。。1.1及以后是长连接了,打扰了
问题:
这个短连接方面我也不太明白,如果相应/请求是一次连接那么如果用户在等待响应的时候中断了请求,服务器按理说是很好监听到的呀。但是有一种情况,如果一个请求在S端需要处理10S,当C端请求1S之后刷新了页面(或者其他方法,中断了请求连接),S端会任然相应出个10S的处理。解决方法这里有一个:
https://mp.weixin.qq.com/s/Y9q4Orz14VHwGf2U-AAzeQ
但是.net下如何处理呢?
二、无状态
什么是无状态呢。我的个人理解是,每一个请求都是一样的,没有区别的。举一个栗子:张三和李四两个用户都想服务器请求一份报表数据,这个时候服务器是无法却分哪个请求是张三的哪个请求是李四的,这样就可能造成数据的错误,把张三的报表给了李四,李四的报表给了张三。
1、Cookie
这个时候为了区分谁是张三谁是李四,就需要标记一下,那么张三在请求的时候加上一个标记,说“我是张三”,李四请求的时候加上一个标记说“我是李四”,这样子服务器就可以区分谁是张三谁是李四了。这个标记就是Cookie,每次http请求的时候都会把客户端的Cookie带上。
2、Session
如果单纯的把信息都放在客户端上面很不安全,张三可以把自己的信息修改为“我是李四”从而获取到李四的报表(不考虑Cookie加密)。那么还有一种方式,当张三登录系统的时候,我们将张三的个人信息存放在服务器端,并给张三一个key,服务器凭借这个key可以在自己的仓库(iis/内存/文件/数据库)中找到张三的信息。
情景如下:
张三登录系统,获取到服务器给的key。张三向服务器请求报表,并附上key。服务器根据key找到了张三的信息,确认该请求是登录过的用户。
所以Session其实和Cookie是一样的,但是Session是将实际内容存放在服务器端,而Cookie是将内容存放在了客户端(不考虑加密)。
留意一下就可以在使用Session的.net网站中的Cookie看到这样一个值:
这个就是Session的key。
问题:
当时公司面试我问的是BS的登录验证问题,我将上述我个人对http请求的理解阐述了一遍之后又问了我这么一个问题:
如果通过抓包等手段截取到了用户登录的Session的key,之后不就可以凭借这个Key登录了吗?有别的安全手段吗?
我当时蒙了,因为按照我的认知,如果获取到了Session的Key,那么这个请求就完全是用户请求而不是非法请求了(无状态啊)。
后来想想可能问我的是如果获取到了key之后频繁请求占用资源吧?(缓存、IP黑名单、冷热数据分库)
希望以后有空问一下当初面试我的到底怎么弄。
补充第二个问题,关键词:CSRF
https://blog.csdn.net/stpeace/article/details/53512283