安全安裝

預設情況下,pip 沒有執行任何檢查來防止遠端竄改,而且涉及從套件庫執行武斷程式碼。不過,有可能透過改變這些行為的方式來使用 pip,以提供更安全的安裝機制。

可以透過以下做法來達成此目的

雜湊檢查模式

新增於 8.0 版中。

此模式使用嵌入在 requirements.txt 檔案中的本機雜湊,來防止遠端竄改和網路問題。這些雜湊使用 --hash 每個需求選項 進行指定。

請注意,雜湊檢查是一種全有或全無的命題。針對任何需求指定 --hash 將會在全球啟用此模式。

若要新增套件的雜湊,請將它們新增到如下列

FooProject == 1.2 \
  --hash=sha256:2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824 \
  --hash=sha256:486ea46224d1bb4fb680f34f7c9ad96a8f24ec88be73ea8e5a6c65260e9cb8a7

其他限制

  • 所有需求都必須有雜湊。

    這是因為部分雜湊的 requirements 檔案用處不大,而且很可能是錯誤:惡意行為人可以透過未雜湊的需求之一來將惡意程式碼植入安裝過程中。

    請注意,適用於透過 #md5=... 語法的 URL 風格需求所嵌入的雜湊,足以滿足此規則(無論雜湊強度為何,基於傳統原因),儘管您應該盡可能使用較強的雜湊,例如 sha256。

  • 所有相依項都必須有雜湊。

    如果存在一個需求檔案中未說明且未雜湊的相依項,則會導致錯誤發生。

  • 需求必須固定(固定至 URL、檔案系統路徑或使用 ==)。

    這可以防止在符合需求規格的新版本發行時產生意外的雜湊不匹配。

強制使用雜湊檢查模式

我們可以使用 --require-hashes 命令列選項,來強制啟用雜湊檢查模式。

這對建立腳本來說很有用,可以確保需求檔案的作者有提供雜湊。它同時也是開始雜湊清單的好方法,因為它顯示取得套件的雜湊。它只會取得每個套件的首選檔案,所以你可能仍需要使用 pip hash,來針對備用檔案加入雜湊:例如當同時有二進制和原始程式碼配送時。

雜湊演算法

目前建議的雜湊演算法是 sha256,但比較強的演算法也可以使用,包括支援的 hashlib 的所有演算法。然而,較弱的演算法,例如 md5、sha1 和 sha224 不包括在內,以避免給人錯誤的安全感。

每個套件有多個雜湊

每個套件都可以使用多個雜湊。當一個套件針對各種平臺提供二進制配送,或者當同時允許二進制和原始程式碼配送時,這一點很重要。

與快取互動

23.1 版本已變更: 本地建立的輪快取也會在雜湊檢查模式中使用。

在雜湊檢查模式下從本地建立的輪快取安裝時,pip 會針對用於建立輪的原始程式碼配送,來驗證雜湊。這些原始雜湊會從儲存在每個快取條目的 origin.json 檔案中取得。

使用 PyPI(或其他索引伺服器)的雜湊

PyPI(還有其他特定索引伺服器)會在每個下載 URL 的片段部分提供一個配送的雜湊,格式為 #sha256=123...,pip 會檢查這個雜湊以防止下載遭竄改。

其他保證由 hashlib 支援的雜湊演算法在此也受支援:sha1、sha224、sha384、sha256 和 sha512。由於此雜湊是遠端產生的,因此並不是防止竄改的有用防護機制,而且不符合 --require-hashes 要求每個套件都有本地雜湊的需求。

可重複安裝

雜湊檢查模式也能與 pip downloadpip wheel 搭配使用。請參閱 可重複安裝,比較雜湊檢查模式和其他可重複性策略。

警告

當心 setup_requires 關鍵字元在 setup.py 中。使用它的(少見)套件會導致 setuptools 直接下載這些相依套件,而跳過 pip 的雜湊檢查。如果您需要使用此類套件,請參閱 控制 setup_requires

不要直接使用 setuptools

請小心使用 setuptools 的已棄用介面直接安裝實際專案來讓所有安全工作付諸流水:例如,呼叫 python setup.py installpython setup.py developeasy_install

它們會隨意下載未在需求檔案中包含的任何項目而且不會檢查,而隨著專案的演變,很容易遺漏其內容。為確保安全,請使用 pip 和 --no-deps 安裝您的專案。

更換 python setup.py install,請使用

$ python -m pip install --no-deps .
$ python -m pip install --no-deps .
C:> py -m pip install --no-deps .

更換 python setup.py develop,請使用

$ python -m pip install --no-deps -e .
$ python -m pip install --no-deps -e .
C:> py -m pip install --no-deps -e .