一些常见问题
网络常见安全问题:
1.什么是跨站脚本攻击
------ XSS cross site script - 跨站脚本攻击
在用户提交内容的时候,如果不做消毒处理,在不知不觉中就执行了某些恶意脚本。例如上传头像时候,将一段恶意脚本当作头像上传,浏览器自作聪明处理
Django中
------- 对内容进行消毒,去掉敏感符号
SECURE_BROWSER_XSS_FILTER = True
-------- 阻止浏览器自动推断内容类型
SECURE_CONTENT_TYPE_NOSNIFF = True
自动帮你消毒 ---> 替换符号,或者正则
什么是跨站请求伪造(骗cookie)
------ XSRF什么是点击劫持 Click-Jacking
iframe 加载页面设为透明,用其他页面诱其点击
1.cookie和session的应用场景
因为HTTP是无状态协议,两次请求不会保留用户状态,要想做用户跟踪就需要做相应的处理。主要有三种方式:URL重写(在URL中携带用户的信息)、隐藏域(埋点,在表单中通过隐藏字段携带用户信息)、浏览器本地存储(Cookie、localstorage、sessionstorage)服务器端如果想保留⽤户信息可以为每个⽤户创建⼀个session(会话),
将⽤户数据保存在session中,将session标识符(sessionid)写到浏览器cookie中,再次请求
服务器时,sessionid会通过请求头携带cookie数据的⽅式发送给服务器,服务器通过sessionid
找到对应的会话对象,然后就可以取出⽤户数据了
celery
web sorcket 和HTTP的关系?
HTTP协议是请求响应式的协议,服务器无法主动发数据给浏览器
pull 模式:拉模式/ push模式:推模式(服务器主动发数据给浏览器)
—不停的轮询(每隔一段时间就向服务器发送请求问是否有新消息)
— 建立长连接
~ Ajax 长轮询
~ iframe 长轮询()
~ web sorcket (全双工)
WebSocket是一种在单个TCP连接上进行全双工通讯的协议。WebSocket允许服务端主动向客户端推送数据。在WebSocket协议中,客户端浏览器和服务器只需要完成一次握手就可以创建持久性的连接,并在浏览器和服务器之间进行双向的数据传输。
如果使用了多进程,进程间如何通信?
~ IPC机制:Inter Processes Communication
-- 管道 (操作系统提供进程间的IO通信)
-- 套接字(跨网络都可以实现进程通信)
-- 通过中间平台托管数据
什么是迭代器
· 实现了迭代器协议的对象就是迭代器,那么什么是迭代器协议。实际上就是next和iter的魔术方法
MySQL、Redis、MongoDB各自的应用场景?
MongoDB的使用场景:数据不是特别重要(例如通知,推送这些),数据表结构变化比较频繁,数据量特别大,数据的并发性特别高,数据结构比较特别(地标)
redis:注重高性能,适用于即时性要求高的的业务,比如秒杀,库存;
mysql:常规关系型数据
跨平台工具
react ——> React Native / Uni-App(一套接口8个平台) / Flutter(渲染效果最好,接近原生)/ Ionic / PhoneGap
移动端(原生开发)
~ Android:Java / Kotlin
~ iOS:Object-C / swift
从用户输入URL到返回页面经历了什么?
用户输入域名 --->先查找本地缓存的DNS --->查找根DNS 通过DNS服务器把域名翻译成IP地址(不一定是服务器地址,可能是反向代理服务器地址)----->防火墙一级防火墙80/443/22--- > 访问到web服务器(处理静态资源的请求:HTML,css , js ----> Apache/Nginx/Tengine) -------uWSGI/CGI------> web应用服务器 负责动态内容生成 python: uWSGI/ Gunicorn java:tomat/Resin/undertow ---->二级服务器 -----> 数据库服务器 MySQL/Oracle / 缓存都服务器 redis 消息队列服务器RabitMQ/Kafka ------> 返回到web服务器 ----> 浏览器
防护墙内组织一个内网 VPC+交换机+NAT 端口映射 80/443 ----> 反向代理服务器 22---> 跳板机(SSH)
反向代理的作用:
1.保护真正的服务器不暴露给公网
2. 配置负载均衡(应对高并发)Nginx/LVS/ 主机+备机 keepalived-热切换,LVS+keepalive配置双活
项目中可能会问到的问题
- 项目部署最后使用了多少台服务器?分别用来做什么的?云主机还是物理机?
最后三台云主机,一台web项目,一台数据库,另一台考虑到备份。
- 用JWT生成用户身份令牌的优缺点是什么?
因为json的通用性,所有JWT是可以跨语言支持的,像JAVA,Javascript,PHP等多种语言.
因为有了playload部分,所以JWT可以在自身存储一些其他业务逻辑所必要的非敏感字段,
便于传输,jwt的构成非常简单,字节占用很小,所以它非常便于传输
不需要在服务端保存会话信息,所以易于扩展
我是这样理解的:一般情况下我们使用 JWT 的话,在我们登录成功获得 token 之后,一般会选择存放在 local storage 中。然后我们在前端通过某些方式会给每个发到后端的请求加上这个 token,这样就不会出现 CSRF 漏洞的问题。因为,即使有个你点击了非法链接发送了请求到服务端,这个非法请求是不会携带 token 的,所以这个请求将是非法的。
但是这样会存在 XSS 攻击中被盗的风险,为了避免 XSS 攻击,你可以选择将 token 存储在标记为httpOnly 的cookie 中。但是,这样又导致了你必须自己提供CSRF保护。
- 缓存数据和数据库数据同步问题是怎么解决的?有没有不同步的情况?
保持一致策略:当数据更新时,先删除缓存,如果缓存删除成功,再更新数据库
读取缓存步骤一般没有什么问题,但是一旦涉及到数据更新:数据库和缓存更新,就容易出现缓存和数据库间的数据一致性问题。不管是先写数据库,再删除缓存;还是先删除缓存,再写库,都有可能出现数据不一致的情况- 如果删除了缓存Redis,还没有来得及写库MySQL,另一个线程就来读取,发现缓存为空,则去数据库中读取数据写入缓存,此时缓存中为脏数据。
- 如果先写了库,在删除缓存前,写库的线程宕机了,没有删除掉缓存,则也会出现数据不一致情况。
延迟双删:
1)先删除缓存;
2)再写数据库;
3)休眠1秒(根据具体的业务时间来定);
4)再次删除缓存。
- 你这套系统是怎么实现过程控制的?
敏捷开发+用户故事+bug调优 - Django接入websocket的流程是怎样的,如何实现消息的定时推送?
下载pip3 install channels==2.3
注册到setting.py里的app
在setting.py同级的目录下注册channels使用的路由----->routing.py
将routing.py注册到setting.py
把urls.py的路由注册到routing.py里
-
编写wsserver.py来处理websocket请求
如果为一个单独的视图函数处理一个websocklet连接可以使用accept_websocket装饰器,它会将标准的HTTP请求路由到视图中。使用require_websocke装饰器只允许使用WebSocket连接,会拒绝正常的HTTP请求。1.request.is_websocket() 如果是个websocket请求返回True,如果是个普通的http请求返回False,可以用这个方法区分它们。
3.WebSocket.wait()
返回一个客户端发送的信息,在客户端关闭连接之前他不会返回任何值,这种情况下,方法将返回None4.WebSocket.read() 如果没有从客户端接收到新的消息,read方法会返回一个新的消息,如果没有,就不返回。这是一个替代wait的非阻塞方法 5.WebSocket.count_messages() 返回消息队列数量 6.WebSocket.has_messages() 如果有新消息返回True,否则返回False 7.WebSocket.send(message) 向客户端发送消息