Arts 2019-03-17

Algorithm 算法题

有效的括号

easy
https://leetcode-cn.com/problems/valid-parentheses/

思路:

  1. 查每对符号的个数。无法保证顺序,比如“}{”不符合。
  2. 正则表达式。之前读《正则表达式》时书里讲过,遇到多层符号匹配,正则处理比较难。
  3. 栈。每次与栈顶元素匹配,如果匹配则往下进行。

栈这个思路可行,最终可以满足顺序和匹配性。实现过程中要注意栈可能为空的情况。

实现完以后,是否可以再优化呢?

研究以后发现,符号分两类:启始类“{”、“[”,结束类“}”、“]”。结束类,如果遇到不匹配,可以提前结束;遇到匹配,也可以弹栈,减少栈空间。启始类直接压栈就好。

Review 外国文章

https://docs.djangoproject.com/en/2.1/ref/csrf/
Django CSRF 文档

技术点:

  1. 通过中间键django.middleware.csrf.CsrfViewMiddleware实现。
  2. 模版渲染,会通过标签{% csrf_token %}自动渲染。
  3. AJAX,前端通过读取 cookie 里的csrftoken获取到,提交时放在自定义 header 头X-CSRFToken里。
  4. 可以通过设置取消 csrf 校验,或者临时性忽略。

其中我的关注点,AJAX 方式需要设置CSRF_COOKIE_HTTPONLY=False使 JS 可以直接读到 token。那么如何防止token被篡改,或者被他人利用呢?

主要参考:https://docs.djangoproject.com/en/2.1/ref/csrf/#how-it-works

  1. token 是放在自定义 header 里,而非URL里,浏览历史不会有痕迹。
  2. 检查 csrf 的同时,HTTPS 还会检查 refer,防止子域名修改的 csrf 被拿来冒充。HTTP 的 refer 可以伪造,所以并不安全。

具体的实现,参考源码django.middleware.csrf.CsrfViewMiddleware。看看一个token是何时产生,如何存储,如何检查的。

Technique 技巧总结

Python 修饰器,不光是可以作用于函数,也可以加在类上。

修饰器加在类上的作用,可以修改类的属性,或者替换成其他类。

Share 思考分享

群聊比单聊,为什么复杂这么多? https://mp.weixin.qq.com/s/so7F88S7-3Wmq9x_rrYAoA

引导读者一步一步更深入地理解需求,将大功能拆分成多个模块设计。

2019-03-23 22:58 48
Comments
Write a Comment