色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

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

python爬蟲知識分享 ? 來源:python爬蟲知識分享 ? 作者:python爬蟲知識分享 ? 2022-03-24 16:42 ? 次閱讀

Python 開發者們在使用標準庫和通用框架時,都以為自己的程序具有可靠的安全性。然而,在 Python 中,就像在任何其它編程語言中一樣,有一些特性可能會被開發者們誤解或誤用。通常而言,只有極少的微妙之處或細節會使開發者們疏忽大意,從而在代碼中引入嚴重的安全漏洞。

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

1.被優化掉的斷言

Python 支持以優化的方式執行代碼。這使代碼運行得更快,內存用得更少。當程序被大規模使用,或者可用的資源很少時,這種方法尤其有效。一些預打包的 Python 程序提供了優化的字節碼。

然而,當代碼被優化時,所有的 assert 語句都會被忽略。開發者有時會使用它們來判斷代碼中的某些條件。例如,如果使用斷言來作身份驗證檢查,則可能導致安全繞過。

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

在這個例子中,第 2 行中的 assert 語句將被忽略,導致非超級用戶也可以運行到下一行代碼。不推薦使用 assert 語句進行安全相關的檢查,但我們確實在實際的項目中看到過它們。

2. MakeDirs 權限

os.makdirs 函數可以在操作系統中創建一個或多個文件夾。它的第二個參數 mode 用于指定創建的文件夾的默認權限。在下面代碼的第 2 行中,文件夾 A/B/C 是用 rwx------ (0o700) 權限創建的。這意味著只有當前用戶(所有者)擁有這些文件夾的讀、寫和執行權限。

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

在 Python < 3.6 版本中,創建出的文件夾 A、B 和 C 的權限都是 700。但是,在 Python > 3.6 版本中,只有最后一個文件夾 C 的權限為 700,其它文件夾 A 和 B 的權限為默認的 755。

因此,在 Python > 3.6 中,os.makdirs 函數等價于 Linux 的這條命令:mkdir -m 700 -p A/B/C。有些開發者沒有意識到版本之間的差異,這已經在 Django 中造成了一個權限越級漏洞(cve - 2022 -24583),無獨有偶,這在 WordPress 中也造成了一個加固繞過問題。

3.絕對路徑拼接

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

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

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 函數將用戶輸入的文件名構造出目標路徑。在第 4 行中,檢查生成的路徑是否包含”.“,防止出現路徑遍歷漏洞。

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

4. 任意的臨時文件

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

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 被當作臨時文件的前綴。如果攻擊者傳入的 id 參數是“/../var/www/test”,則會創建出這樣的臨時文件:/var/www/test_zdllj17。粗看起來,這可能是無害的,但它會為攻擊者創造出挖掘更復雜的漏洞的基礎。

5.擴展的 Zip Slip

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

這就是為什么壓縮文件應該始終被視為不受信來源的原因。zipfile.extractall 與 zipfile.extract 函數可以對 zip 內容進行清洗,從而防止這類路徑遍歷漏洞。

但是,這并不意味著在 ZipFile 庫中不會出現路徑遍歷漏洞。下面是一段解壓縮文件的代碼。

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 行代碼根據用戶上傳文件的臨時路徑,創建出一個 ZipFile 處理器。第 4 - 8 行代碼將所有以“.html”結尾的壓縮項提取出來。第 4 行中的 zf.namelist 函數會取到 zip 內壓縮項的名稱。注意,只有 zipfile.extract 與 zipfile.extractall 函數會對壓縮項進行清洗,其它任何函數都不會。

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

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

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 程序
    +關注

    關注

    117

    文章

    3795

    瀏覽量

    81303
  • 代碼
    +關注

    關注

    30

    文章

    4823

    瀏覽量

    68904
  • python
    +關注

    關注

    56

    文章

    4807

    瀏覽量

    84957
收藏 人收藏

    評論

    相關推薦

    AN-348: 避開無源元件的陷阱

    電子發燒友網站提供《AN-348: 避開無源元件的陷阱.pdf》資料免費下載
    發表于 01-13 15:14 ?0次下載
    AN-348: 避開無源元件的<b class='flag-5'>陷阱</b>

    一個月速成python+OpenCV圖像處理

    OpenCV是廣受歡迎且極為流行的計算機視覺庫,它因其強大的功能、靈活性和開源特性而在開發者和研究者備受青睞。學習OpenCV主要就是學習里面的計算機視覺算法。要學習這些算法的原理,知道它們
    的頭像 發表于 11-29 18:27 ?187次閱讀
    <b class='flag-5'>一個</b>月速成<b class='flag-5'>python</b>+OpenCV圖像處理

    Pythondict支持多個key的方法

    ? 在Python,字典(dict)是種非常強大的數據結構,它允許我們通過鍵(key)來存儲和檢索值(value)。有時候,我們可能想要根據多個鍵來檢索或操作字典的數據。雖然
    的頭像 發表于 11-29 15:59 ?204次閱讀

    邏輯異或運算符在Python的用法

    Python的 ^ 符號實際上是按位異或運算符,用于對整數的二進制表示進行異或操作。 盡管如此,我們仍然可以通過些方法來實現邏輯異
    的頭像 發表于 11-19 09:46 ?278次閱讀

    C++新手容易犯的十個編程錯誤

    簡單的總結下?C++ 新手容易犯的些編程錯誤,給新人們提供參考。 1 有些關鍵字在 cpp 文件多寫了 對于 C++ 類,
    的頭像 發表于 11-15 12:42 ?456次閱讀

    Python多線程和多進程的區別

    Python作為種高級編程語言,提供了多種并發編程的方式,其中多線程與多進程是最常見的兩種方式之。在本文中,我們將探討Python多線
    的頭像 發表于 10-23 11:48 ?464次閱讀
    <b class='flag-5'>Python</b><b class='flag-5'>中</b>多線程和多進程的區別

    【每天學點AI】例子帶你了解Python裝飾器到底在干嘛!

    進行“加料”呢?Python裝飾器提供了更為優雅的方式來增強現有函數的行為,并且不需要修改現有的函數代碼及調用方式。接下來通過案例來
    的頭像 發表于 09-20 16:54 ?585次閱讀
    【每天學點AI】<b class='flag-5'>一</b><b class='flag-5'>個</b>例子帶你了解<b class='flag-5'>Python</b>裝飾器到底在干嘛!

    Python在AI的應用實例

    Python在人工智能(AI)領域的應用極為廣泛且深入,從基礎的數據處理、模型訓練到高級的應用部署,Python都扮演著至關重要的角色。以下將詳細探討Python在AI的幾個關鍵應用
    的頭像 發表于 07-19 17:16 ?1301次閱讀

    opencv-python和opencv樣嗎

    樣。OpenCV(Open Source Computer Vision Library)是開源的計算機視覺和機器學習軟件庫,它提供了大量的圖像和視頻處理功能。OpenCV-Pytho
    的頭像 發表于 07-16 10:38 ?1354次閱讀

    如何在Python開發人工智能

    Python開發人工智能(AI)是廣泛而深入的主題,它涵蓋了從基礎的數據處理到復雜的機器學習、深度學習以及自然語言處理等多個領域。
    的頭像 發表于 07-15 15:01 ?2343次閱讀

    python訓練出的模型怎么調用

    Python,訓練出的模型可以通過多種方式進行調用。 1. 模型保存與加載 在Python,訓練好的模型需要被保存,以便在其他程序或會話中使用。以下是
    的頭像 發表于 07-11 10:15 ?2218次閱讀

    用pycharm進行python爬蟲的步驟

    以下是使用PyCharm進行Python爬蟲的步驟: 安裝PyCharm和Python 首先,您需要安裝PyCharm和Python。PyCharm是
    的頭像 發表于 07-11 10:11 ?926次閱讀

    具有十個解碼輸出的進位計數器/除法器數據表

    電子發燒友網站提供《具有十個解碼輸出的進位計數器/除法器數據表.pdf》資料免費下載
    發表于 05-17 10:47 ?0次下載
    具有<b class='flag-5'>十個</b>解碼輸出的<b class='flag-5'>十</b>進位計數器/除法器數據表

    如何使用linux下gdb來調試python程序

    如何使用linux下gdb來調試python程序? 在Linux下,可以使用GDB(GNU調試器)來調試Python程序。GDB是強大的調試工具,可以幫助開發者診斷和修復程序
    的頭像 發表于 01-31 10:41 ?2714次閱讀

    pythonopen函數的用法詳解

    pythonopen函數的用法詳解 Python的open()函數用于打開文件。它接受文件名和模式作為參數,并返回
    的頭像 發表于 01-30 15:31 ?2217次閱讀
    主站蜘蛛池模板: 成人国产精品日本在线 | 久久机热视频 这里只有精品首页 | 欧美日韩无套内射另类 | 忘忧草直播 | 武侠古典久久亚洲精品 | 日日操夜夜操狠狠操 | 亚洲精品午夜久久久伊人 | 国产日韩精品一区二区在线观看 | 亚洲精品一二三 | 成人国产在线看不卡 | 亚欧成人毛片一区二区三区四区 | 在线亚洲色拍偷拍在线视频 | 精品精品国产自在现拍 | 中文字幕伊人香蕉在线 | 刮伦人妇A极一片 | 日韩欧美一区二区三区免费看 | 久久精品国产96精品亚洲 | 噜噜噜在线AV免费观看看 | 国产成人精品电影在线观看 | 欧美激情性AAAAA片欧美 | 无人区免费一二三四乱码 | YELLOW视频直播在线观看 | 精品AV无码一二三区视频 | 亚洲成人国产 | 免费小视频在线观看 | 国产精品久久vr专区 | 国产亚洲高清视频 | 另类欧美尿交 | 亚洲色偷偷偷网站色偷一区人人藻 | 国产线精品视频在线观看 | 韩国精品无码少妇在线观看网站 | 久久久精品3d动漫一区二区三区 | 亚洲午夜久久久久中文字幕 | 91系列在线观看免费 | 欧美日韩精品一区二区三区四区 | 热久久视久久精品2015 | 国产成人免费高清在线观看 | 色综合色综合久久综合频道 | 理论片午午伦夜理片影院 | 果冻传媒在线观看资源七夕 | 99国产精品欲AV蜜桃臀麻豆 |