W3Cschool
恭喜您成為首批注冊(cè)用戶(hù)
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
要獲取 PHPUnit,最簡(jiǎn)單的方法是下載 PHPUnit 的 PHP 檔案包 (PHAR),它將 PHPUnit 所需要的所有必要組件(以及某些可選組件)捆綁在單個(gè)文件中:
要使用 PHP檔案包(PHAR)需要有 phar 擴(kuò)展。
要使用 PHAR 的 --self-update
功能需要有 openssl 擴(kuò)展。
如果啟用了 Suhosin 擴(kuò)展,需要在 php.ini
中允許執(zhí)行 PHAR:
suhosin.executor.include.whitelist = phar
要從 https://phar.phpunit.de/
下載,需要支持 TLS/SNI的客戶(hù)端,例如 wget 1.14(或更高版本)。
如果要全局安裝 PHAR:
$ wget https://phar.phpunit.de/phpunit.phar
$ chmod +x phpunit.phar
$ sudo mv phpunit.phar /usr/local/bin/phpunit
$ phpunit --version
PHPUnit x.y.z by Sebastian Bergmann and contributors.
也可以直接使用下載的 PHAR 文件:
$ wget https://phar.phpunit.de/phpunit.phar
$ php phpunit.phar --version
PHPUnit x.y.z by Sebastian Bergmann and contributors.
整體上說(shuō),在 Windows 下安裝 PHAR 和手工在 Windows 下安裝 Composer 是一樣的過(guò)程:
為 PHP 的二進(jìn)制可執(zhí)行文件建立一個(gè)目錄,例如 C:\bin
將 ;C:\bin
附加到 PATH
環(huán)境變量中(相關(guān)幫助)
下載 https://phar.phpunit.de/phpunit.phar 并將文件保存到 C:\bin\phpunit.phar
打開(kāi)命令行(例如,按 Windows+R ? 輸入 cmd
? ENTER)
C:\bin\phpunit.cmd
):C:\Users\username> cd C:\bin
C:\bin> echo @php "%~dp0phpunit.phar" %* > phpunit.cmd
C:\bin> exit
C:\Users\username> phpunit --version
PHPUnit x.y.z by Sebastian Bergmann and contributors.
對(duì)于 Cygwin 或 MingW32 (例如 TortoiseGit) shell 環(huán)境,可以跳過(guò)第五步。 取而代之的是,把文件保存為 phpunit
(沒(méi)有 .phar
擴(kuò)展名),然后用 chmod 775 phpunit
將其設(shè)為可執(zhí)行。
由 PHPUnit 項(xiàng)目分發(fā)的所有官方代碼發(fā)行包都由發(fā)行包管理器進(jìn)行簽名。在 phar.phpunit.de 上有 PGP 簽名和 SHA1 散列值可用于校驗(yàn)。
下面的例子詳細(xì)說(shuō)明了如何對(duì)發(fā)行包進(jìn)行校驗(yàn)。首先下載 phpunit.phar
和與之對(duì)應(yīng)的單獨(dú) PGP 簽名 phpunit.phar.asc
:
wget https://phar.phpunit.de/phpunit.phar
wget https://phar.phpunit.de/phpunit.phar.asc
用單獨(dú)的簽名(phpunit.phar
)對(duì) PHPUnit 的 PHP 檔案包(phpunit.phar.asc
)進(jìn)行校驗(yàn):
gpg phpunit.phar.asc
gpg: Signature made Sat 19 Jul 2014 01:28:02 PM CEST using RSA key ID 6372C20A
gpg: Can't check signature: public key not found
在本地系統(tǒng)中沒(méi)有發(fā)行包管理器的公鑰(6372C20A
)。為了能進(jìn)行校驗(yàn),必須從某個(gè)密鑰服務(wù)器上取得發(fā)行包管理器的公鑰。其中一個(gè)服務(wù)器是 pgp.uni-mainz.de
。所有密鑰服務(wù)器是鏈接在一起的,因此連接到任一密鑰服務(wù)器都可以。
gpg --keyserver pgp.uni-mainz.de --recv-keys 0x4AA394086372C20A
gpg: requesting key 6372C20A from hkp server pgp.uni-mainz.de
gpg: key 6372C20A: public key "Sebastian Bergmann <sb@sebastian-bergmann.de>" imported
gpg: Total number processed: 1
gpg: imported: 1 (RSA: 1)
現(xiàn)在已經(jīng)取得了條目名稱(chēng)為"Sebastian Bergmann sb@sebastian-bergmann.de"的公鑰。不過(guò)無(wú)法檢驗(yàn)這個(gè)密鑰確實(shí)是由名叫 Sebastian Bergmann 的人創(chuàng)建的。但是可以先試著校驗(yàn)發(fā)行包的簽名:
gpg phpunit.phar.asc
gpg: Signature made Sat 19 Jul 2014 01:28:02 PM CEST using RSA key ID 6372C20A
gpg: Good signature from "Sebastian Bergmann <sb@sebastian-bergmann.de>"
gpg: aka "Sebastian Bergmann <sebastian@php.net>"
gpg: aka "Sebastian Bergmann <sebastian@thephp.cc>"
gpg: aka "Sebastian Bergmann <sebastian@phpunit.de>"
gpg: aka "Sebastian Bergmann <sebastian.bergmann@thephp.cc>"
gpg: aka "[jpeg image of size 40635]"
gpg: WARNING: This key is not certified with a trusted signature!
gpg: There is no indication that the signature belongs to the owner.
Primary key fingerprint: D840 6D0D 8294 7747 2937 7831 4AA3 9408 6372 C20A
此時(shí),簽名已經(jīng)沒(méi)問(wèn)題了,但是這個(gè)公鑰還不能信任。簽名沒(méi)問(wèn)題意味著文件未被篡改??墒怯捎诠€加密系統(tǒng)的性質(zhì),還需要再校驗(yàn)密鑰 6372C20A
確實(shí)是由真正的 Sebastian Bergmann 創(chuàng)建的。
任何攻擊者都能創(chuàng)建公鑰并將其上傳到公鑰服務(wù)器。他們可以建立一個(gè)帶惡意的發(fā)行包,并用這個(gè)假密鑰進(jìn)行簽名。這樣,如果嘗試對(duì)這個(gè)損壞了的發(fā)行包進(jìn)行簽名校驗(yàn),由于密鑰是“真”密鑰,校驗(yàn)將成功完成。因此,需要對(duì)這個(gè)密鑰的真實(shí)性進(jìn)行校驗(yàn)。如何對(duì)公鑰的真實(shí)性進(jìn)行校驗(yàn)已經(jīng)超出了本文檔的范疇。
有個(gè)比較謹(jǐn)慎的做法是創(chuàng)建一個(gè)腳本來(lái)管理 PHPUnit 的安裝,在運(yùn)行測(cè)試套件之前校驗(yàn) GnuPG 簽名。例如:
#!/usr/bin/env bash
clean=1 # 是否在測(cè)試完成之后刪除 phpunit.phar ?
aftercmd="php phpunit.phar --bootstrap bootstrap.php src/tests"
gpg --fingerprint D8406D0D82947747293778314AA394086372C20A
if [ $? -ne 0 ]; then
echo -e "\033[33mDownloading PGP Public Key...\033[0m"
gpg --recv-keys D8406D0D82947747293778314AA394086372C20A
# Sebastian Bergmann <sb@sebastian-bergmann.de>
gpg --fingerprint D8406D0D82947747293778314AA394086372C20A
if [ $? -ne 0 ]; then
echo -e "\033[31mCould not download PGP public key for verification\033[0m"
exit
fi
fi
if [ "$clean" -eq 1 ]; then
# 如果存在就清理掉
if [ -f phpunit.phar ]; then
rm -f phpunit.phar
fi
if [ -f phpunit.phar.asc ]; then
rm -f phpunit.phar.asc
fi
fi
# 抓取最新的發(fā)行版和對(duì)應(yīng)的簽名
if [ ! -f phpunit.phar ]; then
wget https://phar.phpunit.de/phpunit.phar
fi
if [ ! -f phpunit.phar.asc ]; then
wget https://phar.phpunit.de/phpunit.phar.asc
fi
# 在運(yùn)行前先校驗(yàn)
gpg --verify phpunit.phar.asc phpunit.phar
if [ $? -eq 0 ]; then
echo
echo -e "\033[33mBegin Unit Testing\033[0m"
# 運(yùn)行測(cè)試套件
`$after_cmd`
# 清理
if [ "$clean" -eq 1 ]; then
echo -e "\033[32mCleaning Up!\033[0m"
rm -f phpunit.phar
rm -f phpunit.phar.asc
fi
else
echo
chmod -x phpunit.phar
mv phpunit.phar /tmp/bad-phpunit.phar
mv phpunit.phar.asc /tmp/bad-phpunit.phar.asc
echo -e "\033[31mSignature did not match! PHPUnit has been moved to /tmp/bad-phpunit.phar\033[0m"
exit 1
fi
Copyright©2021 w3cschool編程獅|閩ICP備15016281號(hào)-3|閩公網(wǎng)安備35020302033924號(hào)
違法和不良信息舉報(bào)電話:173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號(hào)
聯(lián)系方式:
更多建議: