邓良驹 编写更安全的Python代码编写安全的Python代码 邓良驹 2019.10.19 思考题 if user.balance >= product.price: user.balance -= product.price ? 目录 CONTENTS 常见不安全代码 代码检查的工具 总结:如何规避风险 常见不安全代码 小心 eval 应对: 在生产环境中,任何情况下都不要使用eval。 import sys "__main__": shellcode = pickle.dumps(ShellExp()) pickle.loads(shellcode) 应对: 绝不对不可信/未认证数据进行unpickle,使用更安全的JSON 或YAML做序列化。必须使用pickle时在沙盒环境执行。 小心 PyYAML 应对: 使用yaml.safe_load,必要时编写自定义 Loader 做更严格的检查。 对不可信来源的序列化检查后操作。 有的甚至是故意、恶意为之。 应对: 谨慎选择第三方 PyPI 包,尽量少导入 PyPI 包; 利用 https://pyup.io/ 等服务保持检查和更新依赖; 利用 Chef InSpect 落实代码安全规范的检查。 *参考资料:“驹说码事” 《如何import一个不存在的对象》 https://mp.weixin.qq.com/s/0_ivKVDU-nKf3r-c96sqrA 利用 Bandit0 码力 | 18 页 | 988.40 KB | 1 年前3
3 Thautwarm 解放python的表达力 性能和安全性 语法和语义扩展 JIT 静态检查解放Python的 表达力,性能和安全性 Thautwarm 目录 CONTENTS 语法和语义扩展 JIT 静态类型 语法和语义扩展 表达力的扩展, 可用性的保留,白来的午餐? 演示一小部分: 模式匹配, Quick Lambda, Pipe运算 语言决定思维模型 GNU-APL C++ Haskell 说 到 质 数 � 人 们 想 到 什 么 � 语言决定思维模型 54 -> 0.59 3.14 -> 0.93 2.00 -> 0.03 2.60 -> 0.96 如果还有时间,我们用静态类型 来写一个简单的网页生成框架 一个用起来,没有学习曲线的框架。 很安全,因为没有程序员需要付出心 智负担的工作。 THANK YOU thautwarm: - github.com/thautwarm - twshere@outlook.com0 码力 | 43 页 | 10.71 MB | 1 年前3
Hello 算法 1.1.0 Python版出以下计数简化技巧。 1. 忽略 ?(?) 中的常数项。因为它们都与 ? 无关,所以对时间复杂度不产生影响。 2. 省略所有系数。例如,循环 2? 次、5? + 1 次等,都可以简化记为 ? 次,因为 ? 前面的系数对时间复 杂度没有影响。 3. 循环嵌套时使用乘法。总操作数量等于外层循环和内层循环操作数量之积,每一层循环依然可以分别 套用第 1. 点和第 2. 点的技巧。 给定一个函数,我们可以用上述技巧来统计操作数量: 给定一个函数,我们可以用上述技巧来统计操作数量: def algorithm(n: int): a = 1 # +0(技巧 1) a = a + n # +0(技巧 1) # +n(技巧 2) for i in range(5 * n + 1): print(0) # +n*n(技巧 3) for i in range(2 * n): for j in range(n + 1): print(0) print(0) 以下公式展示了使用上述技巧前后的统计结果,两者推算出的时间复杂度都为 ?(?2) 。 ?(?) = 2?(? + 1) + (5? + 1) + 2 完整统计 (‑.‑|||) = 2?2 + 7? + 3 ?(?) = ?2 + ? 偷懒统计 (o.O) 2. 第二步:判断渐近上界 时间复杂度由 ?(?) 中最高阶的项来决定。这是因为在 ? 趋于无穷大时,最高阶的项将发挥主导作用,其他0 码力 | 364 页 | 18.42 MB | 1 年前3
Hello 算法 1.0.0 Python版出以下计数简化技巧。 1. 忽略 ?(?) 中的常数项。因为它们都与 ? 无关,所以对时间复杂度不产生影响。 2. 省略所有系数。例如,循环 2? 次、5? + 1 次等,都可以简化记为 ? 次,因为 ? 前面的系数对时间复 杂度没有影响。 3. 循环嵌套时使用乘法。总操作数量等于外层循环和内层循环操作数量之积,每一层循环依然可以分别 套用第 1. 点和第 2. 点的技巧。 给定一个函数,我们可以用上述技巧来统计操作数量: 给定一个函数,我们可以用上述技巧来统计操作数量: def algorithm(n: int): a = 1 # +0(技巧 1) a = a + n # +0(技巧 1) # +n(技巧 2) for i in range(5 * n + 1): print(0) # +n*n(技巧 3) for i in range(2 * n): for j in range(n + 1): print(0) print(0) 以下公式展示了使用上述技巧前后的统计结果,两者推算出的时间复杂度都为 ?(?2) 。 ?(?) = 2?(? + 1) + (5? + 1) + 2 完整统计 (‑.‑|||) = 2?2 + 7? + 3 ?(?) = ?2 + ? 偷懒统计 (o.O) 2. 第二步:判断渐近上界 时间复杂度由 ?(?) 中最高阶的项来决定。这是因为在 ? 趋于无穷大时,最高阶的项将发挥主导作用,其他0 码力 | 362 页 | 17.54 MB | 1 年前3
Hello 算法 1.0.0b5 Python版出以下计数简化技巧。 1. 忽略 ?(?) 中的常数项。因为它们都与 ? 无关,所以对时间复杂度不产生影响。 2. 省略所有系数。例如,循环 2? 次、5? + 1 次等,都可以简化记为 ? 次,因为 ? 前面的系数对时间复 杂度没有影响。 3. 循环嵌套时使用乘法。总操作数量等于外层循环和内层循环操作数量之积,每一层循环依然可以分别 套用第 1. 点和第 2. 点的技巧。 给定一个函数,我们可以用上述技巧来统计操作数量。 给定一个函数,我们可以用上述技巧来统计操作数量。 def algorithm(n: int): a = 1 # +0(技巧 1) a = a + n # +0(技巧 1) # +n(技巧 2) for i in range(5 * n + 1): print(0) # +n*n(技巧 3) for i in range(2 * n): for j in range(n + 1): print(0) print(0) 以下公式展示了使用上述技巧前后的统计结果,两者推出的时间复杂度都为 ?(?2) 。 ?(?) = 2?(? + 1) + (5? + 1) + 2 完整统计 (‑.‑|||) = 2?2 + 7? + 3 ?(?) = ?2 + ? 偷懒统计 (o.O) 2. 第二步:判断渐近上界 时间复杂度由多项式 ?(?) 中最高阶的项来决定。这是因为在 ? 趋于无穷大时,最高阶的项将发挥主导作用,0 码力 | 361 页 | 30.64 MB | 1 年前3
Hello 算法 1.2.0 简体中文 Python 版出以下计数简化技巧。 1. 忽略 ?(?) 中的常数项。因为它们都与 ? 无关,所以对时间复杂度不产生影响。 2. 省略所有系数。例如,循环 2? 次、5? + 1 次等,都可以简化记为 ? 次,因为 ? 前面的系数对时间复 杂度没有影响。 3. 循环嵌套时使用乘法。总操作数量等于外层循环和内层循环操作数量之积,每一层循环依然可以分别 套用第 1. 点和第 2. 点的技巧。 给定一个函数,我们可以用上述技巧来统计操作数量: 给定一个函数,我们可以用上述技巧来统计操作数量: def algorithm(n: int): a = 1 # +0(技巧 1) a = a + n # +0(技巧 1) # +n(技巧 2) for i in range(5 * n + 1): print(0) # +n*n(技巧 3) for i in range(2 * n): for j in range(n + 1): print(0) print(0) 以下公式展示了使用上述技巧前后的统计结果,两者推算出的时间复杂度都为 ?(?2) 。 ?(?) = 2?(? + 1) + (5? + 1) + 2 完整统计 (‑.‑|||) = 2?2 + 7? + 3 ?(?) = ?2 + ? 偷懒统计 (o.O) 2. 第二步:判断渐近上界 时间复杂度由 ?(?) 中最高阶的项来决定。这是因为在 ? 趋于无穷大时,最高阶的项将发挥主导作用,其他0 码力 | 364 页 | 18.43 MB | 10 月前3
Hello 算法 1.0.0b4 Python版第一步:统计操作数量 针对代码,逐行从上到下计算即可。然而,由于上述 ? ⋅ ?(?) 中的常数项 ? 可以取任意大小,因此操作数量 ?(?) 中的各种系数、常数项都可以被忽略。根据此原则,可以总结出以下计数简化技巧: 1. 忽略与 ? 无关的操作。因为它们都是 ?(?) 中的常数项,对时间复杂度不产生影响。 2. 复杂度 hello‑algo.com 18 2. 省略所有系数。例如,循环 2? 次、5? 1. 和 2. 技巧。 以下示例展示了使用上述技巧前、后的统计结果。 ?(?) = 2?(? + 1) + (5? + 1) + 2 完整统计 (‑.‑|||) = 2?2 + 7? + 3 ?(?) = ?2 + ? 偷懒统计 (o.O) 最终,两者都能推出相同的时间复杂度结果,即 ?(?2) 。 def algorithm(n: int): a = 1 # +0(技巧 1) a = = a + n # +0(技巧 1) # +n(技巧 2) for i in range(5 * n + 1): print(0) # +n*n(技巧 3) for i in range(2 * n): for j in range(n + 1): print(0) 第二步:判断渐近上界 时间复杂度由多项式 ?(?) 中最高阶的项来决定。这是因为在 ? 趋于无穷大时,最高阶的项将发挥主导作用,0 码力 | 329 页 | 27.34 MB | 1 年前3
Hello 算法 1.2.0 繁体中文 Python 版出以下計數簡化技巧。 1. 忽略 ?(?) 中的常數項。因為它們都與 ? 無關,所以對時間複雜度不產生影響。 2. 省略所有係數。例如,迴圈 2? 次、5? + 1 次等,都可以簡化記為 ? 次,因為 ? 前面的係數對時間複 雜度沒有影響。 3. 迴圈巢狀時使用乘法。總操作數量等於外層迴圈和內層迴圈操作數量之積,每一層迴圈依然可以分別 套用第 1. 點和第 2. 點的技巧。 給定一個函式,我們可以用上述技巧來統計操作數量: 給定一個函式,我們可以用上述技巧來統計操作數量: def algorithm(n: int): a = 1 # +0(技巧 1) a = a + n # +0(技巧 1) # +n(技巧 2) for i in range(5 * n + 1): print(0) # +n*n(技巧 3) for i in range(2 * n): for j in range(n + 1): print(0) print(0) 以下公式展示了使用上述技巧前後的統計結果,兩者推算出的時間複雜度都為 ?(?2) 。 ?(?) = 2?(? + 1) + (5? + 1) + 2 完整統計 (‑.‑|||) = 2?2 + 7? + 3 ?(?) = ?2 + ? 偷懶統計 (o.O) 2. 第二步:判斷漸近上界 時間複雜度由 ?(?) 中最高階的項來決定。這是因為在 ? 趨於無窮大時,最高階的項將發揮主導作用,其他0 码力 | 364 页 | 18.74 MB | 10 月前3
Hello 算法 1.0.0b1 Python版下计数偷懒技巧: 1. 跳过数量与 ? 无关的操作。因为他们都是 ?(?) 中的常数项,对时间复杂度不产生影响。 2. 省略所有系数。例如,循环 2? 次、5? + 1 次、⋯⋯,都可以化简记为 ? 次,因为 ? 前面的系数对时间 复杂度也不产生影响。 3. 循环嵌套时使用乘法。总操作数量等于外层循环和内层循环操作数量之积,每一层循环依然可以分别套 用上述 1. 和 2. 技巧。 以下示例展示了使用上述技巧前、后的统计结果。 以下示例展示了使用上述技巧前、后的统计结果。 ?(?) = 2?(? + 1) + (5? + 1) + 2 完整统计 (‑.‑|||) = 2?2 + 7? + 3 ?(?) = ?2 + ? 偷懒统计 (o.O) 最终,两者都能推出相同的时间复杂度结果,即 ?(?2) 。 def algorithm(n): a = 1 # +0(技巧 1) a = a + n # +0(技巧 1) # +n(技巧 +n(技巧 2) for i in range(5 * n + 1): print(0) # +n*n(技巧 3) for i in range(2 * n): for j in range(n + 1): print(0) 2) 判断渐近上界 时间复杂度由多项式 ?(?) 中最高阶的项来决定。这是因为在 ? 趋于无穷大时,最高阶的项将处于主导作用, 其它项的影响都可以被忽略。0 码力 | 178 页 | 14.67 MB | 1 年前3
Django 官方教程翻译项目/var/www)。但使用 Django 时你不用这样做。而且把所有 Python 代码放在 Web 服务器的根目录不是个好主意,因为这样会 有风险。比如人们可能会在网站上看到你的代码。这不利于网站的安全。 你可以把代码放在文档根目录 以外 的地方,比如 /home/mycode。 让我们看看 startproject 这命令创建了什么: 1. mysite/ 2. manage.py =”get”)是非常重要的,因 为这个提交表单的行为会改变服务器端的数据。 无论何时,当你需要创建一个改变服务器端数据 的表单时,请使用 method=”post”。这不是 Django 的特定技巧;这是优秀的网站开发实 践。 forloop.counter 指示 for 标签已经循环多少次。 由于我们创建一个 POST 表单(它具有修改数据的作用),所以我们需要小心跨站点请求伪造。 谢天谢地,你不必太过担心,因为 继续看下去,我们将会解释如何构造这个例子中的 URL)。 正如上面的Python注释指出的,你应该在成功处理 POST 数据后总是返回一个 HttpResponseRedirect。 这不是 Django 的特定技巧;这是那些优秀网站在开发实践中形 成的共识。 在这个例子中,我们在 HttpResponseRedirect 的构造函数中使用 reverse() 函数。这个 函数避免了我们在视图函数中硬编码0 码力 | 103 页 | 1.86 MB | 1 年前3
共 107 条
- 1
- 2
- 3
- 4
- 5
- 6
- 11













