5款開發(fā)安全、高質(zhì)量代碼的優(yōu)秀Python工具
怎樣提高代碼的質(zhì)量、安全性和可維護性,本文作者推薦了五款工具,并從四個方面對其進行量化。并且,他還介紹了怎樣將這些工具整進 CI pipeline。
為提高代碼的質(zhì)量、安全性和可維護性,軟件工程師每天會用到無數(shù)工具。本篇文章,我列出了一些自己最喜歡的 python 工具,并從易用性(是否易于安裝、運行和自動化)、質(zhì)量影響(能否阻止可預(yù)見的 bug)、可維護性影響(是否讓工作更輕松)和安全性影響(能否發(fā)現(xiàn)并阻止安全性問題)對它們進行打分,以供讀者參考。
并且,我還將介紹如何將這些工具全包含進 CI pipeline,從而實現(xiàn)自動化和高效。
1. Pipenv
它是為 Python 設(shè)計的開發(fā)管理和依賴管理的工具,最早由 Requests 的作者 Kenneth Reitz 編寫。
如果你用 python 做過一段時間的開發(fā),那么管理環(huán)境,你可能用過 virtualenv 或 venv;依賴管理可能用過較可靠的pip freeze > requirements.txt。
https://virtualenv.pypa.io/en/latest/
https://docs.python.org/3/library/venv.html
大多數(shù)情況下,這完全沒問題。但是,我發(fā)現(xiàn) pipenv 更方便,且很強大,加上它通過Pipfile和Pipfile.lock近乎去掉固定依賴的做法,很大程度上替代了requirements.txt,從而帶來更可靠的部署。
不過,我對 pipenv 的未來有點擔(dān)憂,因為 Python 基金會已擱置對 pip 的改進。而且,pipenv 在 2019 年缺乏實質(zhì)性進展。但是,我仍然認為,對大多數(shù) python 用戶來說,pipenv 是絕佳的工具。
官網(wǎng):https://pipenv.kennethreitz.org/en/latest/
月下載量:2111976
備選方案:poetry、virtualenv、venv
2. Ochrona
這里,我有點私心,因為 Ochrona 是我積極開發(fā)并希望 2020 年發(fā)布的工具。不過,我還會介紹這個工具的替代方案。
Ochrona 是一款依賴分析和軟件組成分析的工具,它可以用來檢查你的開源依賴是否存在已知漏洞。這個領(lǐng)域,另一款很流行的開源工具是 pyup.io 的 Safety。
https://pyup.io/safety/
我認為,Ochrona 比 Safety 更好的地方在于:
無論是用于開源項目還是商業(yè)項目,它都提供免費方案,而且免費方案始終跟進最新的漏洞信息。
磁盤和 IO 使用非常少。不同于需要拉取整個漏洞數(shù)據(jù)庫的本地工具,它是 SaaS 模式,只需調(diào)用一次公開的 API。
它提供優(yōu)秀的漏洞數(shù)據(jù)并且每天更新,并比其他工具提供更多的漏洞詳細信息,包括免費用戶。
官網(wǎng):https://ochrona.dev/
月下載量:尚未發(fā)布
備選方案:safety、snyk (收費)
3. Bandit
如果必須推薦一個可提高 python 項目安全性的工具,那我推薦 Bandit 。
https://bandit.readthedocs.io/en/latest/
據(jù)悉,Bandit 出自 OpenStack,但現(xiàn)在由 PyCQA 維護。它是一款開源的 SAST(靜態(tài)應(yīng)用安全測試)工具,免費、可配置且快速。從某些方面來講,它就像是關(guān)注安全領(lǐng)域的 linter。
Bandit 很適合用來發(fā)現(xiàn)問題,比如不安全的配置、已知的不安全模塊使用情況等。
官網(wǎng):https://github.com/PyCQA/bandit
月下載量:575101
備選方案:pyre、pyt、dodgy
4. Black
Black 是一款獨特的代碼格式化工具。它能自動將你的代碼更正為 Black 樣式(一個 Pep-8 的超集)。
傳統(tǒng)的 linter 通常需要你把代碼改為合規(guī)代碼,而 Black 可以節(jié)省不少時間。并且,Black 只需有限的配置,這意味著你如果用過 Black,其他任何項目你都會覺得眼熟。
官網(wǎng):https://github.com/psf/black
月下載量:1891711
備選方案:flake8、pylint
5. Mypy
它是 python 一個可選的靜態(tài)類型檢查器。PEP 484 引入 python 的類型提示,Mypy 則利用這些類型提示對項目進行靜態(tài)類型檢查。
Python 依然有動態(tài)的 duck 類型,不過,添加靜態(tài)類型檢查能幫你減少測試和調(diào)試時間,更早發(fā)現(xiàn)錯誤。
目前,大公司也在跟進 python 的靜態(tài)類型檢查。在 Guido van Rossum 任職期間,Dropbox 用 Mypy 檢查了 400 多萬行代碼。其他的 python 用戶,比如 instagram 也開始做靜態(tài)類型檢查。
官網(wǎng):http://mypy-lang.org/
月下載量:2487228
備選方案:pyre
https://pyre-check.org/
6. 全部集成到一起
這個例子種,我會用到 Travis-CI,配置其他 CI 工具的過程與之類似相似,只是語法上會有差異。這里,我用一個簡單、不安全且有問題的 flask 應(yīng)用作為例子。
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"
最后在根目錄下創(chuàng)建一個.travis.yml文件,內(nèi)容如下:
- language: python
- python:
- - 3.7
- install:
- - pip install -U pip
- - pip install pipenv
- - pipenv install --dev
- script:
- - bandit ./*
- - black --check .
- - ochrona
- - mypy .
如果查看這里的構(gòu)建,你會發(fā)現(xiàn)每個工具都標出錯誤或指出需修改的地方。
https://travis-ci.com/beatsbears/vulnerable_flask/builds/149315498
那么,我們來做一些修正,如這個 PR 所示,構(gòu)建就可以通過。
https://github.com/beatsbears/vulnerable_flask/pull/2
將 Flask 升級到一個沒有已知漏洞的版本
修復(fù)類型注釋,禁用調(diào)試模式,規(guī)范格式
雖然這個例子只涉及一個 CI 平臺,但其實和集成到其他大多數(shù)平臺的方法都很相似。
下面是一個總的評分表: