国产精品久久久aaaa,日日干夜夜操天天插,亚洲乱熟女香蕉一区二区三区少妇,99精品国产高清一区二区三区,国产成人精品一区二区色戒,久久久国产精品成人免费,亚洲精品毛片久久久久,99久久婷婷国产综合精品电影,国产一区二区三区任你鲁

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

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

3天內不再提示

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

python爬蟲知識分享 ? 來源:python爬蟲知識分享 ? 作者:python爬蟲知識分享 ? 2022-03-24 16:47 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

6. 不完整的正則表達式匹配

正則表達式(regex)是大多數 Web 程序不可或缺的一部分。我們經常能看到它被自定義的 Web 應用防火墻(WAF,Web Application Firewalls)用來作輸入驗證,例如檢測惡意字符串。在 Python 中,re.match 和 re.search 之間有著細微的區別,我們將在下面的代碼片段中演示。

def is_sql_injection(request):
    pattern = re.compile(r".*(union)|(select).*")
    name_to_test = request.GET['name']
    if re.search(pattern, name_to_test):
        return True
    return False

在第 2 行中,我們定義了一個匹配 union 或者 select 的模式,以檢測可能的 SQL 注入。這是一個糟糕的寫法,因為你可以輕易地繞過這些黑名單,但我們已經在線上的程序中見過它。在第 4 行中,函數 re.match 使用前面定義好的模式,檢查第 3 行中的用戶輸入內容是否包含這些惡意的值。

然而,與 re.search 函數不同的是,re.match 函數不匹配新行。例如,如果攻擊者提交了值 aaaaaa \n union select,這個輸入就匹配不上正則表達式。因此,檢查可以被繞過,失去保護作用。

總而言之,我們不建議使用正則表達式黑名單進行任何安全檢查。

7. Unicode 清洗器繞過

Unicode 支持用多種形式來表示字符,并將這些字符映射到碼點。在 Unicode 標準中,不同的 Unicode 字符有四種歸一化方案。程序可以使用這些歸一化方法,以獨立于人類語言的標準方式來存儲數據,例如用戶名。

然而,攻擊者可以利用這些歸一化,這已經導致了 Python 的 urllib 出現漏洞(CVE-2019-9636)。下面的代碼片段演示了一個基于 NFKC 歸一化的跨站點腳本漏洞(XSS,Cross-Site Scripting)。

import unicodedata
from django.shortcuts import render
from django.utils.html import escape

def render_input(request):
    user_input = escape(request.GET['p'])
    normalized_user_input = unicodedata.normalize("NFKC", user_input)
    context = {'my_input': normalized_user_input}
    return render(request, 'test.html', context)

在第 6 行中,用戶輸入的內容被 Django 的 escape 函數處理了,以防止 XSS 漏洞。在第 7 行中,經過清洗的輸入被 NFKC 算法歸一化,以便在第 8-9 行中通過 test.html 模板正確地渲染。

templates/test.html


{{ my_input | safe}}

在模板 test.html 中,第 4 行的變量 my_input 被標記為安全的,因為開發人員預期有特殊字符,并且認為該變量已經被 escape 函數清洗了。通過標記關鍵字 safe, Django 不會再次對變量進行清洗。

但是,由于第 7 行(view.py)的歸一化,字符“%EF%B9%A4”會被轉換為“<”,“%EF%B9%A5”被轉換為“>”。這導致攻擊者可以注入任意的 HTML 標記,進而觸發 XSS 漏洞。為了防止這個漏洞,就應該在把用戶輸入做完歸一化之后,再進行清洗。

8. Unicode 編碼碰撞

前文說過,Unicode 字符會被映射成碼點。然而,有許多不同的人類語言,Unicode 試圖將它們統一起來。這就意味著不同的字符很有可能擁有相同的“layout”。例如,小寫的土耳其語 ?(沒有點)的字符是英語中大寫的 I。在拉丁字母中,字符 i 也是用大寫的 I 表示。在 Unicode 標準中,這兩個不同的字符都以大寫形式映射到同一個碼點。

這種行為是可以被利用的,實際上已經在 Django 中導致了一個嚴重的漏洞(CVE-2019-19844)。下面的代碼是一個重置密碼的示例。

from django.core.mail import send_mail
from django.http import HttpResponse
from vuln.models import User

def reset_pw(request):
    email = request.GET['email']
    result = User.objects.filter(email__exact=email.upper()).first()
    if not result:
        return HttpResponse("User not found!")
    send_mail('Reset Password','Your new pw: 123456.', 'from@example.com', [email], fail_silently=False)
    return HttpResponse("Password reset email send!")

第 6 行代碼獲取了用戶輸入的 email,第 7-9 行代碼檢查這個 email 值,查找是否存在具有該 email 的用戶。如果用戶存在,則第 10 行代碼依據第 6 行中輸入的 email 地址,給用戶發送郵件。需要指出的是,第 7-9 行中對郵件地址的檢查是不區分大小寫的,使用了 upper 函數。

至于攻擊,我們假設數據庫中存在一個郵箱地址為 foo@mix.com 的用戶。那么,攻擊者可以簡單地傳入 foo@m?x.com 作為第 6 行中的 email,其中 i 被替換為土耳其語 ?。第 7 行代碼將郵箱轉換成大寫,結果是 FOO@MIX.COM。這意味著找到了一個用戶,因此會發送一封重置密碼的郵件。

然而,郵件被發送到第 6 行未轉換的郵件地址,也就是包含了土耳其語的 ?。換句話說,其他用戶的密碼被發送到了攻擊者控制的郵件地址。為了防止這個漏洞,可以將第 10 行替換成使用數據庫中的用戶郵箱。即使發生編碼沖突,攻擊者在這種情況下也得不到任何好處。

9. IP 地址歸一化

在 Python < 3.8 中,IP 地址會被 ipaddress 庫歸一化,因此前綴的零會被刪除。這種行為乍一看可能是無害的,但它已經在 Django 中導致了一個高嚴重性的漏洞(CVE-2021-33571)。攻擊者可以利用歸一化繞過校驗程序,發起服務端請求偽造攻擊(SSRF,Server-Side Request Forgery)。

下面的代碼展示了如何繞過這樣的校驗器。

import requests
import ipaddress

def send_request(request):
    ip = request.GET['ip']
    try:
        if ip in ["127.0.0.1", "0.0.0.0"]:
            return HttpResponse("Not allowed!")
        ip = str(ipaddress.IPv4Address(ip))
    except ipaddress.AddressValueError:
        return HttpResponse("Error at validation!")
    requests.get('https://' + ip)
    return HttpResponse("Request send!")

第 5 行代碼獲取用戶傳入的一個 IP 地址,第 7 行代碼使用一個黑名單來檢查該 IP 是否為本地地址,以防止可能的 SSRF 漏洞。這份黑名單并不完整,僅作為示例。

第 9 行代碼檢查該 IP 是否為 IPv4 地址,同時將 IP 歸一化。在完成驗證后,第 12 行代碼會對該 IP 發起實際的請求。

但是,攻擊者可以傳入 127.0.001 這樣的 IP 地址,在第 7 行的黑名單列表中找不到。然后,第 9 行代碼使用 ipaddress.IPv4Address 將 IP 歸一化為 127.0.0.1。因此,攻擊者就能夠繞過 SSRF 校驗器,并向本地網絡地址發送請求。

10. URL 查詢參數解析

在 Python < 3.7 中,urllib.parse.parse_qsl 函數允許使用“;”和“&”字符作為 URL 的查詢變量的分隔符。有趣的是“;”字符不能被其它語言識別為分隔符。

在下面的例子中,我們將展示為什么這種行為會導致漏洞。假設我們正在運行一個基礎設施,其中前端是一個 PHP 程序,后端則是一個 Python 程序。

攻擊者向 PHP 前端發送以下的 GET 請求:

GET https://victim.com/?a=1;b=2

PHP 前端只識別出一個查詢參數“a”,其內容為“1;b=2”。PHP 不把“;”字符作為查詢參數的分隔符。現在,前端會將攻擊者的請求直接轉發給內部的 Python 程序:

GET https://internal.backend/?a=1;b=2

如果使用了 urllib.parse.parse_qsl,Python 程序會處理成兩個查詢參數,即“a=1”和“b=2”。這種查詢參數解析的差異可能會導致致命的安全漏洞,比如 Django 中的 Web 緩存投毒漏洞(CVE-2021-23336)。

總結

我們介紹了 10 個 Python 安全陷阱,我們認為開發者不太了解它們。每個細微的陷阱都很容易被忽視,并在過去導致了線上程序的安全漏洞。

正如前文所述,安全陷阱可能出現在各種操作中,從處理文件、目錄、壓縮文件、URL、IP 到簡單的字符串。一種常見的情況是庫函數的使用,這些函數可能有意想不到的行為。這提醒我們一定要升級到最新版本,并仔細閱讀文檔。在 SonarSource 中,我們正在研究這些缺陷,以便將來不斷改進我們的代碼分析器。

審核編輯:湯梓紅

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

    關注

    117

    文章

    3846

    瀏覽量

    85232
  • 代碼
    +關注

    關注

    30

    文章

    4967

    瀏覽量

    73960
  • python
    +關注

    關注

    57

    文章

    4876

    瀏覽量

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

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    MCU選型的10大隱形陷阱

    Youtube上發布視頻,結合其行業閱歷,深度剖析了工程師在MCU芯片選型時最易踩大隱性陷阱。 圖/Youtube截圖 《半導體器件應用網》對John Teel的觀點進行了梳理整理,希望能幫助工程師與工程師團隊避開MCU芯
    的頭像 發表于 02-27 09:24 ?91次閱讀
    MCU選型的10大隱形<b class='flag-5'>陷阱</b>

    FPGA DSP模塊使用大關鍵陷阱

    FPGA 芯片中DSP(數字信號處理)硬核是高性能計算的核心資源,但使用不當會引入隱蔽性極強的“坑”。這些坑不僅影響性能和精度,甚至會導致功能錯誤。以下是總結了大關鍵陷阱及其解決方案,分為 功能正確性、性能優化、系統集成 三
    的頭像 發表于 01-13 15:18 ?359次閱讀

    沒有專利的opencv-python 版本

    所有 官方發布的 opencv-python 核心版本(無 contrib 擴展)都無專利風險——專利問題僅存在于 opencv-contrib-python 擴展模塊的少數算法(如早期 SIFT
    發表于 12-13 12:37

    Termux調試圣誕樹Python代碼

    在Termux調試Python代碼(以圣誕樹立例)非常簡單,核心分為環境準備、代碼編寫、運行調試三步驟,下面一步步教你操作: 一、環境準備(首次使用需做) Termux默認可能沒有Pyth
    發表于 12-09 09:02

    揭秘VBAT:電源設計陷阱的全方位規避策略

    VBAT在電源設計扮演著舉足輕重的角色,但其背后的奧秘往往被忽視,導致設計過程陷阱頻現。本文將為您揭秘VBAT的核心知識,并提供全方位的規避策略,助您有效避開電源設計絕大多數常見
    的頭像 發表于 11-14 15:48 ?488次閱讀
    揭秘VBAT:電源設計<b class='flag-5'>陷阱</b>的全方位規避策略

    Python調用API教程

    不同系統之間的信息交互。在這篇文章,我們將詳細介紹Python調用API的方法和技巧。 一、用Requests庫發送HTTP請求 使用Python調用API的第一步是發送HTTP
    的頭像 發表于 11-03 09:15 ?866次閱讀

    Python字符串逆序有幾種方式,代碼是什么

    對于一給定的字符串,逆序輸出,這個任務對于python來說是一種很簡單的操作,畢竟強大的列表和字符串處理的一些列函數足以應付這些問題 了,今天總結了一下python對于字符串的逆序
    的頭像 發表于 08-28 14:44 ?1082次閱讀

    可靠性設計的十個重點

    專注于光電半導體芯片與器件可靠性領域的科研檢測機構,能夠對LED、激光器、功率器件等關鍵部件進行嚴格的檢測,致力于為客戶提供高質量的測試服務,為光電產品在各種高可靠性場景的穩定應用提供堅實的質量
    的頭像 發表于 08-01 22:55 ?1053次閱讀
    可靠性設計的<b class='flag-5'>十個</b>重點

    基礎篇3:掌握Python的條件語句與循環

    Python編程語言中,條件語句和循環是構成復雜邏輯和數據處理的基石。本篇基礎教程將幫助您深入了解Python的條件語句和循環結構,讓您能夠更好地控制程序流程。 條件語句 條件語句允許程序根據
    發表于 07-03 16:13

    成功設計符合EMC/EMI設計要求的十個技巧

    成功設計符合EMC/EMI測試要求的十個技巧1.保持小的環路當存在一磁場時,一由導電材料形成的環路充當了天線,并且把磁場轉換為圍繞環路流動的電流。電流的強度與閉合環路的面積成正比。因此,應盡
    發表于 04-15 13:46

    零基礎入門:如何在樹莓派上編寫和運行Python程序?

    在這篇文章,我將為你簡要介紹Python程序是什么、Python程序可以用來做什么,以及如何在RaspberryPi上編寫和運行一簡單的Pyth
    的頭像 發表于 03-25 09:27 ?2026次閱讀
    零基礎入門:如何在樹莓派上編寫和運行<b class='flag-5'>Python</b>程序?

    Python在嵌入式系統的應用場景

    你想把你的職業生涯提升到一新的水平?Python在嵌入式系統中正在成為一股不可缺少的新力量。盡管傳統上嵌入式開發更多地依賴于C和C++語言,Python的優勢在于其簡潔的語法、豐富的庫和快速的開發周期,這使得它在某些嵌入式場景
    的頭像 發表于 03-19 14:10 ?1492次閱讀

    必看!15C語言常見陷阱及避坑指南

    ? C語言雖強大,但隱藏的“坑”也不少!稍不留神就會導致程序崩潰、數據異常。本文整理15高頻陷阱,助你寫出更穩健的代碼! ? 陷阱1:運算符優先級混淆? 問題:運算符優先級不同可能導致計算順序錯誤
    的頭像 發表于 03-16 12:10 ?1778次閱讀

    整流橋選型陷阱:MDD從電流諧波到散熱設計的實戰解析

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

    創建了用于OpenVINO?推理的自定義C++和Python代碼,從C++代碼獲得的結果與Python代碼不同是為什么?

    創建了用于OpenVINO?推理的自定義 C++ 和 Python* 代碼。 在兩推理過程中使用相同的圖像和模型。 從 C++ 代碼獲得的結果與 Python* 代碼不同。
    發表于 03-06 06:22