91欧美超碰AV自拍|国产成年人性爱视频免费看|亚洲 日韩 欧美一厂二区入|人人看人人爽人人操aV|丝袜美腿视频一区二区在线看|人人操人人爽人人爱|婷婷五月天超碰|97色色欧美亚州A√|另类A√无码精品一级av|欧美特级日韩特级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Python中的十個(gè)安全陷阱(一)

python爬蟲(chóng)知識(shí)分享 ? 來(lái)源:python爬蟲(chóng)知識(shí)分享 ? 作者:python爬蟲(chóng)知識(shí)分享 ? 2022-03-24 16:42 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

Python 開(kāi)發(fā)者們?cè)谑褂脴?biāo)準(zhǔn)庫(kù)和通用框架時(shí),都以為自己的程序具有可靠的安全性。然而,在 Python 中,就像在任何其它編程語(yǔ)言中一樣,有一些特性可能會(huì)被開(kāi)發(fā)者們誤解或誤用。通常而言,只有極少的微妙之處或細(xì)節(jié)會(huì)使開(kāi)發(fā)者們疏忽大意,從而在代碼中引入嚴(yán)重的安全漏洞。

在這篇博文中,我們將分享在實(shí)際 Python 項(xiàng)目中遇到的 10 個(gè)安全陷阱。我們選擇了一些在技術(shù)圈中不太為人所知的陷阱。通過(guò)介紹每個(gè)問(wèn)題及其造成的影響,我們希望提高人們對(duì)這些問(wèn)題的感知,并提高大家的安全意識(shí)。如果你正在使用這些特性,請(qǐng)一定要排查你的 Python 代碼!

1.被優(yōu)化掉的斷言

Python 支持以優(yōu)化的方式執(zhí)行代碼。這使代碼運(yùn)行得更快,內(nèi)存用得更少。當(dāng)程序被大規(guī)模使用,或者可用的資源很少時(shí),這種方法尤其有效。一些預(yù)打包的 Python 程序提供了優(yōu)化的字節(jié)碼。

然而,當(dāng)代碼被優(yōu)化時(shí),所有的 assert 語(yǔ)句都會(huì)被忽略。開(kāi)發(fā)者有時(shí)會(huì)使用它們來(lái)判斷代碼中的某些條件。例如,如果使用斷言來(lái)作身份驗(yàn)證檢查,則可能導(dǎo)致安全繞過(guò)。

defsuperuser_action(request,user):
assertuser.is_super_user
#executeactionassuperuser

在這個(gè)例子中,第 2 行中的 assert 語(yǔ)句將被忽略,導(dǎo)致非超級(jí)用戶也可以運(yùn)行到下一行代碼。不推薦使用 assert 語(yǔ)句進(jìn)行安全相關(guān)的檢查,但我們確實(shí)在實(shí)際的項(xiàng)目中看到過(guò)它們。

2. MakeDirs 權(quán)限

os.makdirs 函數(shù)可以在操作系統(tǒng)中創(chuàng)建一個(gè)或多個(gè)文件夾。它的第二個(gè)參數(shù) mode 用于指定創(chuàng)建的文件夾的默認(rèn)權(quán)限。在下面代碼的第 2 行中,文件夾 A/B/C 是用 rwx------ (0o700) 權(quán)限創(chuàng)建的。這意味著只有當(dāng)前用戶(所有者)擁有這些文件夾的讀、寫(xiě)和執(zhí)行權(quán)限。

definit_directories(request):
os.makedirs("A/B/C",mode=0o700)
returnHttpResponse("Done!")

在 Python < 3.6 版本中,創(chuàng)建出的文件夾 A、B 和 C 的權(quán)限都是 700。但是,在 Python > 3.6 版本中,只有最后一個(gè)文件夾 C 的權(quán)限為 700,其它文件夾 A 和 B 的權(quán)限為默認(rèn)的 755。

因此,在 Python > 3.6 中,os.makdirs 函數(shù)等價(jià)于 Linux 的這條命令:mkdir -m 700 -p A/B/C。有些開(kāi)發(fā)者沒(méi)有意識(shí)到版本之間的差異,這已經(jīng)在 Django 中造成了一個(gè)權(quán)限越級(jí)漏洞(cve - 2022 -24583),無(wú)獨(dú)有偶,這在 WordPress 中也造成了一個(gè)加固繞過(guò)問(wèn)題。

3.絕對(duì)路徑拼接

os.path.join(path, *paths) 函數(shù)用于將多個(gè)文件路徑連接成一個(gè)組合的路徑。第一個(gè)參數(shù)通常包含了基礎(chǔ)路徑,而之后的每個(gè)參數(shù)都被當(dāng)做組件拼接到基礎(chǔ)路徑后。

然而,這個(gè)函數(shù)有一個(gè)少有人知的特性。如果拼接的某個(gè)路徑以 / 開(kāi)頭,那么包括基礎(chǔ)路徑在內(nèi)的所有前綴路徑都將被刪除,該路徑將被視為絕對(duì)路徑。下面的示例揭示了開(kāi)發(fā)者可能遇到的這個(gè)陷阱。

defread_file(request):
filename=request.POST['filename']
file_path=os.path.join("var","lib",filename)
iffile_path.find(".")!=-1:
    returnHttpResponse("Failed!")
withopen(file_path)asf:
    returnHttpResponse(f.read(),content_type='text/plain')

在第 3 行中,我們使用 os.path.join 函數(shù)將用戶輸入的文件名構(gòu)造出目標(biāo)路徑。在第 4 行中,檢查生成的路徑是否包含”.“,防止出現(xiàn)路徑遍歷漏洞。

但是,如果攻擊者傳入的文件名參數(shù)為”/a/b/c.txt“,那么第 3 行得到的變量 file_path 會(huì)是一個(gè)絕對(duì)路徑(/a/b/c.txt)。即 os.path.join 會(huì)忽略掉”var/lib“部分,攻擊者可以不使用“.”字符就讀取到任何文件。盡管 os.path.join 的文檔中描述了這種行為,但這還是導(dǎo)致了許多漏洞(Cuckoo Sandbox Evasion, CVE-2020-35736)。

4. 任意的臨時(shí)文件

tempfile.NamedTemporaryFile 函數(shù)用于創(chuàng)建具有特定名稱的臨時(shí)文件。但是,prefix(前綴)和 suffix(后綴)參數(shù)很容易受到路徑遍歷攻擊(Issue 35278)。如果攻擊者控制了這些參數(shù)之一,他就可以在文件系統(tǒng)中的任意位置創(chuàng)建出一個(gè)臨時(shí)文件。下面的示例揭示了開(kāi)發(fā)者可能遇到的一個(gè)陷阱。

def touch_tmp_file(request):
    id = request.GET['id']
    tmp_file = tempfile.NamedTemporaryFile(prefix=id)
    return HttpResponse(f"tmp file: {tmp_file} created!", content_type='text/plain')

在第 3 行中,用戶輸入的 id 被當(dāng)作臨時(shí)文件的前綴。如果攻擊者傳入的 id 參數(shù)是“/../var/www/test”,則會(huì)創(chuàng)建出這樣的臨時(shí)文件:/var/www/test_zdllj17。粗看起來(lái),這可能是無(wú)害的,但它會(huì)為攻擊者創(chuàng)造出挖掘更復(fù)雜的漏洞的基礎(chǔ)。

5.擴(kuò)展的 Zip Slip

在 Web 應(yīng)用中,通常需要解壓上傳后的壓縮文件。在 Python 中,很多人都知道 TarFile.extractall 與 TarFile.extract 函數(shù)容易受到 Zip Slip 攻擊。攻擊者通過(guò)篡改壓縮包中的文件名,使其包含路徑遍歷(../)字符,從而發(fā)起攻擊。

這就是為什么壓縮文件應(yīng)該始終被視為不受信來(lái)源的原因。zipfile.extractall 與 zipfile.extract 函數(shù)可以對(duì) zip 內(nèi)容進(jìn)行清洗,從而防止這類路徑遍歷漏洞。

但是,這并不意味著在 ZipFile 庫(kù)中不會(huì)出現(xiàn)路徑遍歷漏洞。下面是一段解壓縮文件的代碼。

def extract_html(request):
    filename = request.FILES['filename']
    zf = zipfile.ZipFile(filename.temporary_file_path(), "r")
    for entry in zf.namelist():
        if entry.endswith(".html"):
            file_content = zf.read(entry)
            with open(entry, "wb") as fp:
                fp.write(file_content)
    zf.close()
    return HttpResponse("HTML files extracted!")

第 3 行代碼根據(jù)用戶上傳文件的臨時(shí)路徑,創(chuàng)建出一個(gè) ZipFile 處理器。第 4 - 8 行代碼將所有以“.html”結(jié)尾的壓縮項(xiàng)提取出來(lái)。第 4 行中的 zf.namelist 函數(shù)會(huì)取到 zip 內(nèi)壓縮項(xiàng)的名稱。注意,只有 zipfile.extract 與 zipfile.extractall 函數(shù)會(huì)對(duì)壓縮項(xiàng)進(jìn)行清洗,其它任何函數(shù)都不會(huì)。

在這種情況下,攻擊者可以創(chuàng)建一個(gè)文件名,例如“../../../var/www/html”,內(nèi)容隨意填。該惡意文件的內(nèi)容會(huì)在第 6 行被讀取,并在第 7-8 行寫(xiě)入被攻擊者控制的路徑。因此,攻擊者可以在整個(gè)服務(wù)器上創(chuàng)建任意的 HTML 文件。

如上所述,壓縮包中的文件應(yīng)該被看作是不受信任的。如果你不使用 zipfile.extractall 或者 zipfile.extract,你就必須對(duì) zip 內(nèi)文件的名稱進(jìn)行“消毒”,例如使用 os.path.basename。否則,它可能導(dǎo)致嚴(yán)重的安全漏洞,就像在 NLTK Downloader (CVE-2019-14751)中發(fā)現(xiàn)的那樣。
審核編輯:湯梓紅

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 程序
    +關(guān)注

    關(guān)注

    117

    文章

    3846

    瀏覽量

    85258
  • 代碼
    +關(guān)注

    關(guān)注

    30

    文章

    4968

    瀏覽量

    74001
  • python
    +關(guān)注

    關(guān)注

    57

    文章

    4877

    瀏覽量

    90075
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    《當(dāng)個(gè) MCU 原廠的型號(hào)超過(guò) 100 個(gè),會(huì)發(fā)生什么?》

    當(dāng) MCU 型號(hào)只有幾十個(gè)時(shí), 很多問(wèn)題是感知不到的。 但旦超過(guò) 100 個(gè),變化會(huì)非常明顯。 第件事:復(fù)制開(kāi)始失效 簡(jiǎn)單復(fù)制配置: 會(huì)帶來(lái)隱性差異 小問(wèn)題逐漸累積 修
    發(fā)表于 02-27 10:04

    MCU選型的10大隱形陷阱

    Youtube上發(fā)布視頻,結(jié)合其行業(yè)閱歷,深度剖析了工程師在MCU芯片選型時(shí)最易踩大隱性陷阱。 圖/Youtube截圖 《半導(dǎo)體器件應(yīng)用網(wǎng)》對(duì)John Teel的觀點(diǎn)進(jìn)行了梳理整理,希望能幫助工程師與工程師團(tuán)隊(duì)避開(kāi)MCU芯
    的頭像 發(fā)表于 02-27 09:24 ?123次閱讀
    MCU選型的10大隱形<b class='flag-5'>陷阱</b>

    FPGA DSP模塊使用大關(guān)鍵陷阱

    FPGA 芯片中DSP(數(shù)字信號(hào)處理)硬核是高性能計(jì)算的核心資源,但使用不當(dāng)會(huì)引入隱蔽性極強(qiáng)的“坑”。這些坑不僅影響性能和精度,甚至?xí)?dǎo)致功能錯(cuò)誤。以下是總結(jié)了大關(guān)鍵陷阱及其解決方案,分為 功能正確性、性能優(yōu)化、系統(tǒng)集成 三個(gè)
    的頭像 發(fā)表于 01-13 15:18 ?382次閱讀

    沒(méi)有專利的opencv-python 版本

    所有 官方發(fā)布的 opencv-python 核心版本(無(wú) contrib 擴(kuò)展)都無(wú)專利風(fēng)險(xiǎn)——專利問(wèn)題僅存在于 opencv-contrib-python 擴(kuò)展模塊的少數(shù)算法(如早期 SIFT
    發(fā)表于 12-13 12:37

    Termux調(diào)試圣誕樹(shù)Python代碼

    在Termux調(diào)試Python代碼(以圣誕樹(shù)立例)非常簡(jiǎn)單,核心分為環(huán)境準(zhǔn)備、代碼編寫(xiě)、運(yùn)行調(diào)試三個(gè)步驟,下面步步教你操作: 、環(huán)境準(zhǔn)
    發(fā)表于 12-09 09:02

    串聯(lián)諧振試驗(yàn)裝置十個(gè)常見(jiàn)問(wèn)題

    諧振裝置能否同時(shí)檢測(cè)多組試品? 部分型號(hào)具備該功能,如華天電力的裝置搭載多通道同步檢測(cè)模塊,可同時(shí)對(duì) 2-3 組同類型試品開(kāi)展耐壓測(cè)試;但需注意試品的電容量、電壓等級(jí)需致,且總?cè)萘坎怀^(guò)裝置的額定負(fù)載
    發(fā)表于 12-01 15:23

    揭秘VBAT:電源設(shè)計(jì)陷阱的全方位規(guī)避策略

    VBAT在電源設(shè)計(jì)扮演著舉足輕重的角色,但其背后的奧秘往往被忽視,導(dǎo)致設(shè)計(jì)過(guò)程陷阱頻現(xiàn)。本文將為您揭秘VBAT的核心知識(shí),并提供全方位的規(guī)避策略,助您有效避開(kāi)電源設(shè)計(jì)絕大多數(shù)常見(jiàn)
    的頭像 發(fā)表于 11-14 15:48 ?505次閱讀
    揭秘VBAT:電源設(shè)計(jì)<b class='flag-5'>陷阱</b>的全方位規(guī)避策略

    Python調(diào)用API教程

    個(gè)不同系統(tǒng)之間的信息交互。在這篇文章,我們將詳細(xì)介紹Python調(diào)用API的方法和技巧。 、用Requests庫(kù)發(fā)送HTTP請(qǐng)求 使用Pyth
    的頭像 發(fā)表于 11-03 09:15 ?895次閱讀

    可靠性設(shè)計(jì)的十個(gè)重點(diǎn)

    專注于光電半導(dǎo)體芯片與器件可靠性領(lǐng)域的科研檢測(cè)機(jī)構(gòu),能夠?qū)ED、激光器、功率器件等關(guān)鍵部件進(jìn)行嚴(yán)格的檢測(cè),致力于為客戶提供高質(zhì)量的測(cè)試服務(wù),為光電產(chǎn)品在各種高可靠性場(chǎng)景的穩(wěn)定應(yīng)用提供堅(jiān)實(shí)的質(zhì)量
    的頭像 發(fā)表于 08-01 22:55 ?1062次閱讀
    可靠性設(shè)計(jì)的<b class='flag-5'>十個(gè)</b>重點(diǎn)

    基礎(chǔ)篇3:掌握Python的條件語(yǔ)句與循環(huán)

    示例 以下是個(gè)使用for循環(huán)打印列表每個(gè)元素的示例: 復(fù)制代碼 names = [\"Alice\", \"Bob\", \"Charlie
    發(fā)表于 07-03 16:13

    成功設(shè)計(jì)符合EMC/EMI設(shè)計(jì)要求的十個(gè)技巧

    成功設(shè)計(jì)符合EMC/EMI測(cè)試要求的十個(gè)技巧1.保持小的環(huán)路當(dāng)存在個(gè)磁場(chǎng)時(shí),個(gè)由導(dǎo)電材料形成的環(huán)路充當(dāng)了天線,并且把磁場(chǎng)轉(zhuǎn)換為圍繞環(huán)路流
    發(fā)表于 04-15 13:46

    零基礎(chǔ)入門(mén):如何在樹(shù)莓派上編寫(xiě)和運(yùn)行Python程序?

    在這篇文章,我將為你簡(jiǎn)要介紹Python程序是什么、Python程序可以用來(lái)做什么,以及如何在RaspberryPi上編寫(xiě)和運(yùn)行個(gè)簡(jiǎn)單的
    的頭像 發(fā)表于 03-25 09:27 ?2058次閱讀
    零基礎(chǔ)入門(mén):如何在樹(shù)莓派上編寫(xiě)和運(yùn)行<b class='flag-5'>Python</b>程序?

    Python在嵌入式系統(tǒng)的應(yīng)用場(chǎng)景

    你想把你的職業(yè)生涯提升到個(gè)新的水平?Python在嵌入式系統(tǒng)中正在成為股不可缺少的新力量。盡管傳統(tǒng)上嵌入式開(kāi)發(fā)更多地依賴于C和C++語(yǔ)言,Pyt
    的頭像 發(fā)表于 03-19 14:10 ?1507次閱讀

    必看!15個(gè)C語(yǔ)言常見(jiàn)陷阱及避坑指南

    ? C語(yǔ)言雖強(qiáng)大,但隱藏的“坑”也不少!稍不留神就會(huì)導(dǎo)致程序崩潰、數(shù)據(jù)異常。本文整理15個(gè)高頻陷阱,助你寫(xiě)出更穩(wěn)健的代碼! ? 陷阱1:運(yùn)算符優(yōu)先級(jí)混淆? 問(wèn)題:運(yùn)算符優(yōu)先級(jí)不同可能導(dǎo)致計(jì)算順序錯(cuò)誤
    的頭像 發(fā)表于 03-16 12:10 ?1853次閱讀

    整流橋選型陷阱:MDD從電流諧波到散熱設(shè)計(jì)的實(shí)戰(zhàn)解析

    在工業(yè)電源設(shè)計(jì),整流橋選型失誤可能引發(fā)災(zāi)難性后果。某光伏逆變器項(xiàng)目因忽略反向恢復(fù)電荷(Qrr)導(dǎo)致整機(jī)效率下降8%,直接損失超百萬(wàn)元。本文結(jié)合MDD(模塊化設(shè)計(jì)方法),深度解析整流橋選型
    的頭像 發(fā)表于 03-10 10:41 ?1199次閱讀
    整流橋選型<b class='flag-5'>十</b>大<b class='flag-5'>陷阱</b>:MDD從電流諧波到散熱設(shè)計(jì)的實(shí)戰(zhàn)解析