chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

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

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

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

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

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

掃碼添加小助手

加入工程師交流群

6. 不完整的正則表達(dá)式匹配

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

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 行中,我們定義了一個(gè)匹配 union 或者 select 的模式,以檢測(cè)可能的 SQL 注入。這是一個(gè)糟糕的寫法,因?yàn)槟憧梢暂p易地繞過(guò)這些黑名單,但我們已經(jīng)在線上的程序中見(jiàn)過(guò)它。在第 4 行中,函數(shù) re.match 使用前面定義好的模式,檢查第 3 行中的用戶輸入內(nèi)容是否包含這些惡意的值。

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

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

7. Unicode 清洗器繞過(guò)

Unicode 支持用多種形式來(lái)表示字符,并將這些字符映射到碼點(diǎn)。在 Unicode 標(biāo)準(zhǔn)中,不同的 Unicode 字符有四種歸一化方案。程序可以使用這些歸一化方法,以獨(dú)立于人類語(yǔ)言的標(biāo)準(zhǔn)方式來(lái)存儲(chǔ)數(shù)據(jù),例如用戶名。

然而,攻擊者可以利用這些歸一化,這已經(jīng)導(dǎo)致了 Python 的 urllib 出現(xiàn)漏洞(CVE-2019-9636)。下面的代碼片段演示了一個(gè)基于 NFKC 歸一化的跨站點(diǎn)腳本漏洞(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 行中,用戶輸入的內(nèi)容被 Django 的 escape 函數(shù)處理了,以防止 XSS 漏洞。在第 7 行中,經(jīng)過(guò)清洗的輸入被 NFKC 算法歸一化,以便在第 8-9 行中通過(guò) test.html 模板正確地渲染。

templates/test.html


{{ my_input | safe}}

在模板 test.html 中,第 4 行的變量 my_input 被標(biāo)記為安全的,因?yàn)殚_發(fā)人員預(yù)期有特殊字符,并且認(rèn)為該變量已經(jīng)被 escape 函數(shù)清洗了。通過(guò)標(biāo)記關(guān)鍵字 safe, Django 不會(huì)再次對(duì)變量進(jìn)行清洗。

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

8. Unicode 編碼碰撞

前文說(shuō)過(guò),Unicode 字符會(huì)被映射成碼點(diǎn)。然而,有許多不同的人類語(yǔ)言,Unicode 試圖將它們統(tǒng)一起來(lái)。這就意味著不同的字符很有可能擁有相同的“l(fā)ayout”。例如,小寫的土耳其語(yǔ) ?(沒(méi)有點(diǎn))的字符是英語(yǔ)中大寫的 I。在拉丁字母中,字符 i 也是用大寫的 I 表示。在 Unicode 標(biāo)準(zhǔn)中,這兩個(gè)不同的字符都以大寫形式映射到同一個(gè)碼點(diǎn)。

這種行為是可以被利用的,實(shí)際上已經(jīng)在 Django 中導(dǎo)致了一個(gè)嚴(yán)重的漏洞(CVE-2019-19844)。下面的代碼是一個(gè)重置密碼的示例。

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 行代碼檢查這個(gè) email 值,查找是否存在具有該 email 的用戶。如果用戶存在,則第 10 行代碼依據(jù)第 6 行中輸入的 email 地址,給用戶發(fā)送郵件。需要指出的是,第 7-9 行中對(duì)郵件地址的檢查是不區(qū)分大小寫的,使用了 upper 函數(shù)。

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

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

9. IP 地址歸一化

在 Python < 3.8 中,IP 地址會(huì)被 ipaddress 庫(kù)歸一化,因此前綴的零會(huì)被刪除。這種行為乍一看可能是無(wú)害的,但它已經(jīng)在 Django 中導(dǎo)致了一個(gè)高嚴(yán)重性的漏洞(CVE-2021-33571)。攻擊者可以利用歸一化繞過(guò)校驗(yàn)程序,發(fā)起服務(wù)端請(qǐng)求偽造攻擊(SSRF,Server-Side Request Forgery)。

下面的代碼展示了如何繞過(guò)這樣的校驗(yàn)器。

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 行代碼獲取用戶傳入的一個(gè) IP 地址,第 7 行代碼使用一個(gè)黑名單來(lái)檢查該 IP 是否為本地地址,以防止可能的 SSRF 漏洞。這份黑名單并不完整,僅作為示例。

第 9 行代碼檢查該 IP 是否為 IPv4 地址,同時(shí)將 IP 歸一化。在完成驗(yàn)證后,第 12 行代碼會(huì)對(duì)該 IP 發(fā)起實(shí)際的請(qǐng)求。

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

10. URL 查詢參數(shù)解析

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

在下面的例子中,我們將展示為什么這種行為會(huì)導(dǎo)致漏洞。假設(shè)我們正在運(yùn)行一個(gè)基礎(chǔ)設(shè)施,其中前端是一個(gè) PHP 程序,后端則是一個(gè) Python 程序。

攻擊者向 PHP 前端發(fā)送以下的 GET 請(qǐng)求:

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

PHP 前端只識(shí)別出一個(gè)查詢參數(shù)“a”,其內(nèi)容為“1;b=2”。PHP 不把“;”字符作為查詢參數(shù)的分隔符?,F(xiàn)在,前端會(huì)將攻擊者的請(qǐng)求直接轉(zhuǎn)發(fā)給內(nèi)部的 Python 程序:

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

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

總結(jié)

我們介紹了 10 個(gè) Python 安全陷阱,我們認(rèn)為開發(fā)者不太了解它們。每個(gè)細(xì)微的陷阱都很容易被忽視,并在過(guò)去導(dǎo)致了線上程序的安全漏洞。

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

審核編輯:湯梓紅

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(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

    文章

    3836

    瀏覽量

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

    關(guān)注

    30

    文章

    4941

    瀏覽量

    73150
  • python
    +關(guān)注

    關(guān)注

    57

    文章

    4857

    瀏覽量

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

掃碼添加小助手

加入工程師交流群

    評(píng)論

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

    Python調(diào)用API教程

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

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

    對(duì)于一個(gè)給定的字符串,逆序輸出,這個(gè)任務(wù)對(duì)于python來(lái)說(shuō)是一種很簡(jiǎn)單的操作,畢竟強(qiáng)大的列表和字符串處理的一些列函數(shù)足以應(yīng)付這些問(wèn)題 了,今天總結(jié)了一下python對(duì)于字符串的逆序
    的頭像 發(fā)表于 08-28 14:44 ?784次閱讀

    可靠性設(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 ?783次閱讀
    可靠性設(shè)計(jì)的<b class='flag-5'>十個(gè)</b>重點(diǎn)

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

    Python編程語(yǔ)言中,條件語(yǔ)句和循環(huán)是構(gòu)成復(fù)雜邏輯和數(shù)據(jù)處理的基石。本篇基礎(chǔ)教程將幫助您深入了解Python的條件語(yǔ)句和循環(huán)結(jié)構(gòu),讓您能夠更好地控制程序流程。 條件語(yǔ)句 條件語(yǔ)句允許程序根據(jù)
    發(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)路流動(dòng)的電流。電流的強(qiáng)度與閉合環(huán)路的面積成正比。因此,應(yīng)盡
    發(fā)表于 04-15 13:46

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

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

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

    你想把你的職業(yè)生涯提升到一個(gè)新的水平?Python在嵌入式系統(tǒng)中正在成為一股不可缺少的新力量。盡管傳統(tǒng)上嵌入式開發(fā)更多地依賴于C和C++語(yǔ)言,Python的優(yōu)勢(shì)在于其簡(jiǎn)潔的語(yǔ)法、豐富的庫(kù)和快速的開發(fā)周期,這使得它在某些嵌入式場(chǎng)景
    的頭像 發(fā)表于 03-19 14:10 ?1191次閱讀

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

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

    整流橋選型陷阱: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 ?876次閱讀
    整流橋選型<b class='flag-5'>十</b>大<b class='flag-5'>陷阱</b>:MDD從電流諧波到散熱設(shè)計(jì)的實(shí)戰(zhàn)解析

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

    創(chuàng)建了用于OpenVINO?推理的自定義 C++ 和 Python* 代碼。 在兩個(gè)推理過(guò)程中使用相同的圖像和模型。 從 C++ 代碼獲得的結(jié)果與 Python* 代碼不同。
    發(fā)表于 03-06 06:22

    MOS管選型陷阱:參數(shù)誤讀引發(fā)的血淚教訓(xùn)MDD

    在電力電子設(shè)計(jì),MOS管選型失誤導(dǎo)致的硬件失效屢見(jiàn)不鮮。某光伏逆變器因忽視Coss參數(shù)引發(fā)炸管,直接損失50萬(wàn)元。本文以真實(shí)案例為鑒,MDD辰達(dá)半導(dǎo)體帶您解析MOS管選型大參數(shù)陷阱
    的頭像 發(fā)表于 03-04 12:01 ?1226次閱讀
    MOS管選型<b class='flag-5'>十</b>大<b class='flag-5'>陷阱</b>:參數(shù)誤讀引發(fā)的血淚教訓(xùn)MDD

    20個(gè)經(jīng)典電路分享

    ? 20個(gè)經(jīng)典電路,工程師平均懂10個(gè),你拖后腿了嗎? 引言 對(duì)模擬電路的掌握分為三個(gè)層次。 初級(jí)層次是熟練記住這二十個(gè)電路,清楚這二十個(gè)
    的頭像 發(fā)表于 02-10 18:19 ?4845次閱讀
    20<b class='flag-5'>個(gè)</b>經(jīng)典電路分享

    使用Python實(shí)現(xiàn)xgboost教程

    使用Python實(shí)現(xiàn)XGBoost模型通常涉及以下幾個(gè)步驟:數(shù)據(jù)準(zhǔn)備、模型訓(xùn)練、模型評(píng)估和模型預(yù)測(cè)。以下是一個(gè)詳細(xì)的教程,指導(dǎo)你如何在Python中使用XGBoost。 1. 安裝XGBoost
    的頭像 發(fā)表于 01-19 11:21 ?2215次閱讀

    AN-348: 避開無(wú)源元件的陷阱

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

    bcd與進(jìn)制之間的關(guān)系

    4位進(jìn)制數(shù)來(lái)表示1位進(jìn)制數(shù)的0~9這10個(gè)數(shù)碼,是一種進(jìn)制的數(shù)字編碼形式。 表示方法 :在BCD碼
    的頭像 發(fā)表于 12-20 17:15 ?3878次閱讀