Flask框架
- 说出request里面几个常用的属性
a) 查询参数 args:url地址上最后面传给服务器的参数
b) 请求数据 data:就是客户端发送给服务器的原始数据(raw原始数据)
c) 上传的文件 files:前端上传给后台发送的文件是什么
d) 表单 form: 就是表单数据
e) Cookie:浏览器状态保持的一种
联想回答:request是什么?request是请求的意思,请求方式常用的有get和post,get请求,get请求向后台取,post向后台传,post安全,请求信息不像get请求那样暴露在url地址上,比较安全,http协议默认post请求是安全的,所以需要csrf验证(讲到这可以说什么是csrf验证,如何解决,解决的原理是什么),同时request也是flask请求上下文的一种,什么是上下文?就是一个保存了前端和后台连接状态的容器,他里面存放了什么呢,回归正题,就是上面的几个属性(绕一圈子,再回来,第一面试官觉得你能侃,能聊,知识面不错,印象加分)
- 说出HTTP状态保持的原理
a) 在用户登录之后,浏览器返回响应的时候会在响应中添加上cookie
b) 浏览器接收到cookie之后会自动保存
c) 当用户再次请求其他网页的时候,浏览器会自动带上之前保存的cookie
d) 服务接收到请求之后可以请 request 对象中取到cookie 判断当前用户是否登录
联想回答:
Http是无状态的,就是连接时数据互通,关闭后就是永别,永久性失忆,为啥是无状态的呢?因为浏览器和服务器之间用的是socket通信的啊,一旦关闭浏览器,四次挥手之后就销毁所有交互信息(谈谈tcp三次握手,四次挥手)那么让浏览器跟服务器之间保持状态的方法是什么呢,cookie和session区别:cookie保 存在浏览器,每次访问网站都会将本地保存cookies值(用户个人信息)发送到网站,不安全,每个域名下的cookie独立存在,互不干扰。seesion依赖cookie存在,但它保存在服务器上,比cookie更安全,细节:session存的数字不会转成字符串,而cookie存值会转为字符串
- 说出CSRF 攻击的原理和防范措施
a) 攻击原理:
- 用户C访问正常网站A时进行登录,浏览器保存A的cookie
- 用户C再访问攻击网站B,网站B上有某个隐藏的链接或者图片标签会自动请求网站A的URL地址,例如表单提交,传指定的参数
- 而攻击网站B在访问网站A的时候,浏览器会自动带上网站A的cookie
- 所以网站A在接收到请求之后可判断当前用户是登录状态,所以根据用户的权限做具体的操作逻辑,造成网站攻击成功
b) 防范措施:
- 在指定表单或者请求头的里面添加一个随机值做为参数
- 在响应的cookie里面也设置该随机值
- 那么用户C在正常提交表单的时候会默认带上表单中的随机值,浏览器会自动带上cookie里面的随机值,那么服务器下次接受到请求之后就可以取出两个值进行校验
- 而对于网站B来说网站B在提交表单的时候不知道该随机值是什么,所以就形成不了攻击
我的理解:搞清楚三个点 什么是csrf攻击?简单来说就是: 你访问了信任网站A,然后A会用保存你的个人信息并返回给你的浏览器一个cookie,然后呢,在cookie的过期时间之内,你去访问了恶意网站B,它给你返回一些恶意请求代码,要求你去访问网站A,而你的浏览器在收到这个恶意请求之后,在你不知情的情况下,会带上保存在本地浏览器的cookie信息去访问网站A,然后网站A误以为是用户本身的操作,导致来自恶意网站C的攻击代码会被执:发邮件,发消息,修改你的密码,购物,转账,偷窥你的个人信息,导致私人信息泄漏和账户财产安全收到威胁
如何解决?在psot请求时,form表单或ajax里添加csrf_token(实际项目代码里就是如此简单)
解决原理:添加csrftoken值后,web框架会在响应中自动帮我们生成cookie信息,返回给浏览器,同时在前端代码会生成一个csrf_token值,然后当你post提交信息时,web框架会自动比对cookie里和前端form表单或ajax提交上来的csrf_token值,两者一致,说明是当 前浏览器发起的正常请求并处理业务逻辑返回响应,那么第三方网站拿到你额cookie值为毛不能验证通过呢,因为他没你前端的那个随机生成的token值啊,他总不能跑到你电脑面前查看你的浏览器前端页面自动随机生成的token值吧
注意:你打开浏览器访问某个url(页面),默认是get请求,也就是说,你只要访问了url,对应的视图函数里只要不是if xx == post的逻辑就会执行,所以你打开页面,他会先生成cookie(token)值,返回给浏览器, 然后你提交表单,或者发ajax请求时,会将浏览器的cookie信息(token值)发送给服务器进行token比对,这个过程相对于你发起了两次请求,第一次是get,第二次才是post,搞清楚这个,你才能明白csrf怎么比对的
- 说出Flask-SQLAlchemy中 ORM 一对多的模型关系定义步骤
a) 首先定义两个模型,比如Role和User,Role与User的对应关系是一对多
b) 在多的一方添加一的一方的id作为外键,形成关联关系
c) 如果想要通过一的一方访问多的一方,那么在Role中定义属性users = db.relationship(多的一方模型名)
d) 如果想要通过多的一方访问一的一方,那么在上一步中添加 backre
我的理解:实际项目里,一对多的事物关系特别多,比如一个作者可以有多本书,那本书只能是一个作者,那么这个人和书就是一对多的关系,其实搞什么一对多,多对多模型,本质就是减少数据库表的创建,方便数据查询,设置外键建立关系后,你人可以访问书的所有属性,书也能取到人这个表(对象)里所有的属性,根据不同的业务逻辑去数据库里拿到数据,返回给前端,浏览器渲染显示就行了,
- 说出数据库迁移的步骤
a) 生成迁移文件夹 python xxx.py db init
b) 生成当前版本迁移文件 python xxx.py migrate -m 注释
c) 执行迁移 python xxx.py upgrade
我的理解:数据库迁移听着名字高大上,本质就是同步项目中数据表到数据库,项目没有智能到你这边添加,修改表对象,你数据库那边就立马更新了数据表,需要你手动写sql语句commit提交给数据它才能更新表吧,web框架为了简化操作,封装了一套操作工具叫migrate,终端几个简单的操作命令就能实现数据表同步,简单就三步,生成迁移文件夹,项目中更改表后执行生成迁移文件,执行迁移(django中只需要2步更简单,生成迁移文件,执行迁移文件就行)