这个之前了解过,但是也没有整理,现在回过头重新细致的看一下。顺便也梳理下网络安全相关的一些内容。
我们从用户发起请求开始。
某天某个用户,无意间打开了某个网页,并发起了请求。
- 用户请求是一个网址,假设是https://www.hello.com,
- 首先浏览器会做DNS(Domain Name System)解析,域名解析之后可以得到一个IP,假设是123.123.23.8。
- 问题点:DNS污染/劫持。DNS查询默认是明文的,攻击者可以将某个网站比如www.hello.com->123.123.23.8改成www.hello.com->6.6.6.6,这样我们会以为进入了一个正确的网址,实际上是钓鱼网站。
- 对应解决方案:HTTPS。每个HTTPS网站都有一个SSL证书,证书包含域名、公钥、CA签名(认证机构),浏览器访问某个网址时候会验证证书,如果发现不对,就会提醒。HTTPS做了两件事,一个是加密,别人看不到密码、JWT和Cookie,另一个是身份验证。
- TCP三次握手。浏览器知道了对应的IP后,就找服务器访问了。
- 第一次握手-SYN(Synchronize,同步序列号),浏览器向服务器丢一个序列号过去,看看服务器能不能收到。
- 第二次握手-SYN+ACK(Acknowledge,确认+同步),服务器收到某个SYN后,礼貌起见,肯定需要回应一下,顺手也把自己序列号发过去了。
- 第三次握手-ACK,最终确认,浏览器收到服务器的确认和序列号后,肯定还要再告诉服务器,OK,我也能收到你的消息。至此,三次握手完成,连接建立。
- 问题点:SYN Flood(DDOS),大量发送SYN而不发送ACK,导致服务器认为连接没有完成(半连接),需要保留对应的资源等ACK,从而导致连接表(backlog)被占满,正常用户无法连接了
- 对应解决方案:SYN Cookies,服务器不会进入半连接状态,而是数学方法计算要给Cookie,只有客户端返回ACK才建立连接。
- 如果是HTTPS网址,则进入HTTPS握手,也就是TLS(Transport Layer Security,传输层安全协议)。
- 浏览器发送ClientHello,包括TLS版本、支持的加密算法以及一个随机数。请求建立加密连接。
- 服务器则返回ServerHello+证书,包括最终加密算法、服务器随机数、服务器HTTPS证书(解决上述DNS污染/劫持问题)。
- 浏览器生成对称密钥并加密发送,最后大家都有了session key(会话密钥),之后所有的通信都会用这个会话密钥做对称加密。
- 双方握手结束,加密通道建立。
- 下面就开始干正事了,HTTP请求和响应。请求首先经过Nginx(实际上多数TLS也是Nginx来做),反向代理+HTTPS解密。此外,Nginx可以做一些基础的安全过滤,比如:
- 限制请求大小(防止大文件);
- 限流(每个IP每秒最多请求次数限制);
- 拒绝非法Header(超长、奇怪字符、重复、注入等);
- 限制每个IP并发数、慢速攻击防护(Slowloris发送超慢的数据,每次只发送一点,让服务器等待、资源耗尽);
- 基础WAF(Web Application Firewall)功能,挡掉特别长的URL、非法字符、方法不符合规范、非法主机头、非法Conten-Length等。
- HTTPS/TLS安全策略,TLS握手,解密HTTPS,转发名文HTTP给Gunicorn。
- Gunicorn是一个WSGI server,会把HTTP请求转换为Django可以理解的WSGI格式,即把请求映射成environ字典,调用Django的入口函数。至此,所有任务进入后端django范围。
- Django首先要做的是构造HttpRequest对象,也就是解析URL、Query参数、Body、Cookie、Headers、request.method等。
- Django然后开始跑中间件。
- SecurityMiddleware:Web 安全基础增强。
X-Content-Type-Options: nosniff(防止 MIME 嗅探攻击),MIME嗅探攻击是指浏览器会MIME嗅探文件内容,假如是txt文件,但是内部由JS代码,然后浏览器就会误执行里面的内容。nosniff就是直接让浏览器接受当前文件。Content-Security-Policy(可阻止注入脚本),XSS跨站脚本攻击,就是把JS混进你的页面里,实施攻击。设置Content-Security-Policy: script-src 'self'可直接禁止内联脚本、禁止外链 JS。SECURE_SSL_REDIRECT(可强制 HTTPS),避免HTTP访问。
- CorsMiddleware:跨域请求安全检查。
- CommonMiddleware:通用功能,URL结尾/补充,防止多余路径奇怪的请求。
- AuthenticationMiddleware:把session解析成request.user。因为用DRF Token/JWT不依赖session,不过request.user一般需要,保留。
- XFrameOptionsMiddleware:防止被放进iframe,避免clickjacking点击劫持
- SecurityMiddleware:Web 安全基础增强。
- URL router匹配路径,找到对应的视图函数。
- Django视图调度(dispatch系统),Authentication认证(JWT/Token/Session) -> Permission权限(校验用户有没有对应的权限) -> Throttle节流(限制高频访问,防止暴力刷接口)。
- View内部:
- 序列化Serializer:参数校验+数据格式化。主要是入参方向(请求-内部数据)和出参方向(模型-JSON)。
- ORM查询数据库,DRF自动处理分页、过滤、排序、select_related / prefetch_related。
- 生成Response,把python字典转换成JSON,加上Content-Type,加上HTTP状态码,同一包装response。
- 中间件反向加工response;
- Django-Gunicorn-Nginx-浏览器。
先这样,后续有需要再补充。