Categories
程式開發

開發安全、高質量代碼的5款頂級Python工具


開發安全、高質量代碼的5款頂級Python工具 1

為提高代碼的質量、安全性和可維護性,軟件工程師每天會用到無數工具。

我會列出一些自己最喜歡的python工具,並從易用性(是否易於安裝、運行和自動化)、質量影響(能否阻止可預見的bug)、可維護性影響(是否讓工作更輕鬆)和安全性影響(能否發現並阻止安全性問題)對它們進行打分,以供讀者參考。

並且,我還將介紹如何將這些工俱全包含進CI pipeline,從而實現自動化和高效。

1.Pipenv

是為Python設計的開發管理和依賴管理的工具,最早由Requests的作者Kenneth Reitz編寫。

如果你用python做過一段時間的開發,那麼管理環境,你可能用過 virtualenvvenv;依賴管理可能用過較可靠的pip freeze > requirements.txt

大多數情況下,這完全沒問題。但是,我發現pipenv更方便,且很強大,加上它通過PipfilePipfile.lock近乎去掉固定依賴的做法,很大程度上替代了requirements.txt,從而帶來更可靠的部署。

不過,我對pipenv的未來有點擔憂,因為Python基金會已擱置對pip的改進。而且,pipenv在2019年缺乏實質性進展。但是,我仍然認為,對大多數python用戶來說,pipenv是絕佳的工具。

官網下載地址

月下載量: 2111976

備選方案:poetryvirtualenvvenv

開發安全、高質量代碼的5款頂級Python工具 2

2.Ochrona

這裡,我有點私心,因為Ochrona是我積極開發並希望2020年發布的工具。不過,我還會介紹這個工具的替代方案。

Ochrona是一款依賴分析和軟件組成分析的工具,它可以用來檢查你的開源依賴是否存在已知漏洞。這個領域,另一款很流行的開源工具是pyup.io的Safety

我認為,Ochrona比Safety更好的地方在於:

  1. 無論是用於開源項目還是商業項目,它都提供免費方案,而且免費方案始終跟進最新的漏洞信息。
  2. 磁盤和IO使用非常少。不同於需要拉取整個漏洞數據庫的本地工具,它是SaaS模式,只需調用一次公開的API。
  3. 它提供優秀的漏洞數據並且每天更新,並比其他工具提供更多的漏洞詳細信息,包括免費用戶。

官網下載地址

月下載量: 尚未發布

備選方案:safetysnyk (收費)

開發安全、高質量代碼的5款頂級Python工具 3

3.Bandit

如果必須推荐一個可提高python項目安全性的工具,那我推薦Bandit

據悉,Bandit出自OpenStack,但現在由PyCQA維護。它是一款開源的SAST(靜態應用安全測試)工具,免費、可配置且快速。從某些方面來講,它就像是關注安全領域的linter。

Bandit很適合用來發現問題,比如不安全的配置、已知的不安全模塊使用情況等。

官網下載地址

月下載量: 575101

備選方案:pyrepytdodgy

開發安全、高質量代碼的5款頂級Python工具 4

4.Black

Black是一款獨特的代碼格式化工具。它能自動將你的代碼更正為Black樣式(一個Pep-8的超集)。

傳統的linter通常需要你把代碼改為合規代碼,而Black可以節省不少時間。並且,Black只需有限的配置,這意味著你如果用過Black,其他任何項目你都會覺得眼熟。

官網下載地址

月下載量: 1891711

備選方案:flake8、pylint

開發安全、高質量代碼的5款頂級Python工具 5

5.Mypy

是python一個可選的靜態類型檢查器。PEP 484引入python的類型提示,Mypy則利用這些類型提示對項目進行靜態類型檢查。

Python依然有動態的duck類型,不過,添加靜態類型檢查能幫你減少測試和調試時間,更早發現錯誤。

目前,大公司也在跟進python的靜態類型檢查。在Guido van Rossum任職期間,Dropbox用Mypy檢查了400多萬行代碼。其他的python用戶,比如Instagram也開始做靜態類型檢查。

官網下載地址

月下載量: 2487228

備選方案:pyre

開發安全、高質量代碼的5款頂級Python工具 6

全部集成到一起

這個例子種,我會用到Travis-CI,配置其他CI工具的過程與之類似相似,只是語法上會有差異。這裡,我用一個簡單、不安全且有問題的flask應用作為例子。

app.py文件如下:

from flask import Flask 
 
app = Flask(__name__) 

@app.route('/') 
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 .

如果查看這裡的構建,你會發現每個工具都標出錯誤或指出需修改的地方。那麼,我們來做一些修正,如這個PR所示,構建就可以通過。

開發安全、高質量代碼的5款頂級Python工具 7

將Flask升級到一個沒有已知漏洞的版本

開發安全、高質量代碼的5款頂級Python工具 8

修復類型註釋,禁用調試模式,規範格式

雖然這個例子只涉及一個CI平台,但其實和集成到其他大多數平台的方法都很相似。

下面是一個總的評分錶:

開發安全、高質量代碼的5款頂級Python工具 9

英文原文:

Top Python Tools for Developing Secure, Quality Code