python代碼安全問(wèn)題易被忽視但后果嚴(yán)重,尤其在web應(yīng)用、api服務(wù)等場(chǎng)景中。常見(jiàn)漏洞及防護(hù)措施如下:1. 代碼注入:因使用eval()、exec()或拼接命令引發(fā),建議避免此類(lèi)用法,改用subprocess.run()并傳入?yún)?shù)列表;2. 命令注入:用戶輸入影響系統(tǒng)命令執(zhí)行,應(yīng)避免拼接字符串構(gòu)造命令,使用shlex.quote()轉(zhuǎn)義或內(nèi)置函數(shù)替代;3. 文件路徑穿越:用戶輸入未經(jīng)驗(yàn)證導(dǎo)致訪問(wèn)敏感文件,需檢查路徑是否包含../或~,推薦使用pathlib模塊進(jìn)行路徑規(guī)范化判斷;4. 第三方庫(kù)風(fēng)險(xiǎn):依賴可能存在漏洞,建議定期使用pip-audit和pip list –outdated檢查更新,并審慎選擇維護(hù)良好的庫(kù)。安全審計(jì)應(yīng)作為持續(xù)性任務(wù),防范于未然。
python代碼安全問(wèn)題在實(shí)際開(kāi)發(fā)中很容易被忽略,但一旦出事,可能帶來(lái)數(shù)據(jù)泄露、系統(tǒng)被攻擊等嚴(yán)重后果。尤其是Web應(yīng)用、自動(dòng)化腳本和API服務(wù)這類(lèi)場(chǎng)景,更容易成為攻擊目標(biāo)。
下面從幾個(gè)常見(jiàn)的漏洞類(lèi)型出發(fā),講講它們的成因、如何檢測(cè),以及對(duì)應(yīng)的防護(hù)建議。
代碼注入(Code Injection)
這是最危險(xiǎn)的一種漏洞之一,尤其是在使用eval()、exec()或者拼接字符串執(zhí)行命令時(shí)容易觸發(fā)。
立即學(xué)習(xí)“Python免費(fèi)學(xué)習(xí)筆記(深入)”;
常見(jiàn)現(xiàn)象:
- 用戶輸入直接用于執(zhí)行代碼邏輯
- 使用os.system()或subprocess執(zhí)行外部命令時(shí)未過(guò)濾參數(shù)
防護(hù)建議:
- 避免使用eval()和exec()處理用戶輸入
- 如果必須執(zhí)行系統(tǒng)命令,使用subprocess.run()并傳入?yún)?shù)列表而不是字符串
- 對(duì)所有外部輸入進(jìn)行白名單校驗(yàn)或轉(zhuǎn)義處理
例如:
# 不安全寫(xiě)法 cmd = "echo " + user_input os.system(cmd) # 更安全的方式 subprocess.run(["echo", user_input], check=True)
命令注入(Command Injection)
與代碼注入類(lèi)似,但更偏向于通過(guò)調(diào)用系統(tǒng)命令造成的風(fēng)險(xiǎn),比如在日志記錄、文件操作等功能中引入了用戶可控的變量。
典型例子: 用戶上傳一個(gè)文件名,程序內(nèi)部用類(lèi)似os.system(“rm ” + filename)的方式刪除臨時(shí)文件,結(jié)果攻擊者傳入了”; rm -rf /”,造成災(zāi)難性后果。
防護(hù)措施:
- 盡量避免拼接字符串來(lái)構(gòu)造命令
- 使用shlex.quote()對(duì)參數(shù)做轉(zhuǎn)義
- 優(yōu)先使用Python內(nèi)置函數(shù)代替shell命令,如os.remove()比rm更安全
文件路徑穿越(Path Traversal)
這種漏洞常出現(xiàn)在需要根據(jù)用戶輸入讀取或?qū)懭胛募墓δ苤校热鐖D片查看器、配置加載器等。
問(wèn)題來(lái)源: 用戶輸入未經(jīng)驗(yàn)證,導(dǎo)致可以訪問(wèn)任意路徑,例如輸入../../etc/passwd嘗試讀取敏感文件。
應(yīng)對(duì)方法:
- 檢查路徑是否包含../或~
- 使用os.path.abspath()獲取絕對(duì)路徑,并限制在允許目錄下
- 可以考慮使用pathlib模塊進(jìn)行路徑規(guī)范化和判斷
舉個(gè)例子:
from pathlib import Path base_dir = Path("/safe/dir") user_path = Path(user_input).resolve() if base_dir in user_path.parents: # 安全 else: # 路徑越權(quán),拒絕訪問(wèn)
第三方庫(kù)帶來(lái)的安全隱患
很多項(xiàng)目依賴大量第三方庫(kù),而這些庫(kù)可能存在已知漏洞。如果不定期更新或監(jiān)控,可能會(huì)埋下隱患。
建議做法:
- 使用pip-audit檢查依賴中的安全問(wèn)題
- 定期運(yùn)行pip list –outdated查看是否有可升級(jí)包
- 使用虛擬環(huán)境隔離不同項(xiàng)目的依賴版本
- 不要盲目安裝“下載量高”的包,確認(rèn)其維護(hù)狀態(tài)和社區(qū)反饋
以上幾種是Python項(xiàng)目中最常見(jiàn)的安全問(wèn)題,雖然不是每個(gè)都會(huì)立刻暴露出來(lái),但在生產(chǎn)環(huán)境中不加防范,就等于給攻擊者留了后門(mén)。
基本上就這些,安全審計(jì)不是一次性的任務(wù),而是持續(xù)的過(guò)程。