59

5款开发安全、高质量代码的顶级Python工具

 4 years ago
source link: http://mp.weixin.qq.com/s?__biz=MzIzNjUxMzk2NQ%3D%3D&%3Bmid=2247493444&%3Bidx=2&%3Bsn=1e1a39cde39f94356799b24b61fc5ea8
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

r2m6Bru.jpg!web

作者 | Andrew Scott

策划 | 万佳

怎样提高代码的质量、安全性和可维护性,本文作者推荐了五款工具,并从四个方面对其进行量化。并且,他还介绍了怎样将这些工具整进 CI pipeline。

为提高代码的质量、安全性和可维护性,软件工程师每天会用到无数工具。本篇文章,我列出了一些自己最喜欢的 python 工具,并从易用性(是否易于安装、运行和自动化)、质量影响(能否阻止可预见的 bug)、可维护性影响(是否让工作更轻松)和安全性影响(能否发现并阻止安全性问题)对它们进行打分,以供读者参考。

并且,我还将介绍如何将这些工具全包含进 CI pipeline,从而实现自动化和高效。

1 Pipenv

它是为 Python 设计的开发管理和依赖管理的工具,最早由 Requests 的作者 Kenneth Reitz 编写。

如果你用 python 做过一段时间的开发,那么管理环境,你可能用过 virtualenv 或 venv;依赖管理可能用过较可靠的 pip freeze > requirements.txt

https://virtualenv.pypa.io/en/latest/

https://docs.python.org/3/library/venv.html

大多数情况下,这完全没问题。但是,我发现 pipenv 更方便,且很强大,加上它通过 PipfilePipfile.lock 近乎去掉固定依赖的做法,很大程度上替代了 requirements.txt ,从而带来更可靠的部署。

不过,我对 pipenv 的未来有点担忧,因为 Python 基金会已搁置对 pip 的改进。而且,pipenv 在 2019 年缺乏实质性进展。但是,我仍然认为,对大多数 python 用户来说,pipenv 是绝佳的工具。

官网:

https://pipenv.kennethreitz.org/en/latest/

月下载量:2111976

备选方案:poetry、virtualenv、venv

Y3aMnmu.jpg!web

2 Ochrona

这里,我有点私心,因为 Ochrona 是我积极开发并希望 2020 年发布的工具。不过,我还会介绍这个工具的替代方案。

Ochrona 是一款依赖分析和软件组成分析的工具,它可以用来检查你的开源依赖是否存在已知漏洞。这个领域,另一款很流行的开源工具是 pyup.io 的 Safety。

https://pyup.io/safety/

我认为,Ochrona 比 Safety 更好的地方在于:

无论是用于开源项目还是商业项目,它都提供免费方案,而且免费方案始终跟进最新的漏洞信息。

磁盘和 IO 使用非常少。不同于需要拉取整个漏洞数据库的本地工具,它是 SaaS 模式,只需调用一次公开的 API。

它提供优秀的漏洞数据并且每天更新,并比其他工具提供更多的漏洞详细信息,包括免费用户。

官网: https://ochrona.dev/

月下载量:尚未发布

备选方案:safety、snyk (收费)

EbeiaqQ.jpg!web

3 Bandit

如果必须推荐一个可提高 python 项目安全性的工具,那我推荐 Bandit 。

https://bandit.readthedocs.io/en/latest/

据悉,Bandit 出自 OpenStack,但现在由 PyCQA 维护。它是一款开源的 SAST(静态应用安全测试)工具,免费、可配置且快速。从某些方面来讲,它就像是关注安全领域的 linter。

Bandit 很适合用来发现问题,比如不安全的配置、已知的不安全模块使用情况等。

官网: https://github.com/PyCQA/bandit

月下载量:575101

备选方案:pyre、pyt、dodgy

qQjMjez.jpg!web

4 Black

Black 是一款独特的代码格式化工具。它能自动将你的代码更正为 Black 样式(一个 Pep-8 的超集)。

传统的 linter 通常需要你把代码改为合规代码,而 Black 可以节省不少时间。并且,Black 只需有限的配置,这意味着你如果用过 Black,其他任何项目你都会觉得眼熟。

官网: https://github.com/psf/black

月下载量:1891711

备选方案:flake8、pylint

mmAJZvy.jpg!web

5 Mypy

它是 python 一个可选的静态类型检查器。PEP 484 引入 python 的类型提示,Mypy 则利用这些类型提示对项目进行静态类型检查。

Python 依然有动态的 duck 类型,不过,添加静态类型检查能帮你减少测试和调试时间,更早发现错误。

目前,大公司也在跟进 python 的静态类型检查。在 Guido van Rossum 任职期间,Dropbox 用 Mypy 检查了 400 多万行代码。其他的 python 用户,比如 Instagram 也开始做静态类型检查。

官网: http://mypy-lang.org/

月下载量:2487228

备选方案:pyre

https://pyre-check.org/

MVNZFrA.jpg!web

6 全部集成到一起

这个例子种,我会用到 Travis-CI,配置其他 CI 工具的过程与之类似相似,只是语法上会有差异。这里,我用一个简单、不安全且有问题的 flask 应用作为例子。

https://travis-ci.com/

app.py 文件如下:

from flask import Flask


app = Flask(__name__)


@app.route('/<name>')

def hello_world(name: str) -> str:

return hello_name(name)

def hello_name(name: str) -> int:

return f"hello, {name}"


if __name__ == '__main__':

app.run(debug=True)

Pipfile 如下:

[[source]]

name = "pypi"

url = "https://pypi.org/simple"

verify_ssl = true


[dev-packages]

bandit = "*"

v = {editable = true,version = "*"}

black = "*"

mypy = "*"

ochrona = "*"


[packages]

flask = "==0.12.2"


[requires]

python_version = "3.7"

最后在根目录下创建一个 .travis.yml 文件,内容如下:

language: python

python:

- 3.7

install:

- pip install -U pip

- pip install pipenv

- pipenv install --dev

script:

- bandit ./*

- black --check .

- ochrona

- mypy .

如果查看这里的构建,你会发现每个工具都标出错误或指出需修改的地方。

https://travis-ci.com/beatsbears/vulnerable_flask/builds/149315498

那么,我们来做一些修正,如这个 PR 所示,构建就可以通过。

https://github.com/beatsbears/vulnerable_flask/pull/2

IvmQRrn.png!web

将 Flask 升级到一个没有已知漏洞的版本

NFBn6nv.png!web

修复类型注释,禁用调试模式,规范格式

虽然这个例子只涉及一个 CI 平台,但其实和集成到其他大多数平台的方法都很相似。

下面是一个总的评分表:

I7BjQjz.jpg!web

延展阅读:

https://levelup.gitconnected.com/top-python-tools-for-developing-secure-quality-code-4b3f5ec1e2de

点个在看少个 bug :point_down:


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK