HeadlinesBriefing favicon HeadlinesBriefing.com

Python str.lower() IDNA सुरक्षा बग ठीक कर लिया गया है

Hacker News •
×

कुछ इंटरनेट मानक केवल ASCII अक्षरों को समर्थन देते हैं, लेकिन दुनिया का उपयोग ASCII के अलावा बहुत कुछ करता है। इसलिए, डोमेन नामों में उपयोग के लिए Unicode को ASCII में मैप करने की आवश्यकता होती है। Name Prep इस समाधान का एक हिस्सा था, RFC 3491 में String Prep का एक प्रोफ़ाइल के रूप में परिभाषित किया गया था, और Internationalizing Domain Names in Applications (IDNA) में एक महत्वपूर्ण घटक है, जिसे "IDNA 2003" भी कहा जाता है। String Prep एल्गोरिथ्म RFC 3454 में परिभाषित किया गया है। IDNA 2003 को RFC 5890, 5891, 5892 और 5893 में परिभाषित IDNA 2008 द्वारा पुनःप्राथमिक किया गया है। Python IDNA 2003 को idna कोडेक (str.encode('idna')) के माध्यम से समर्थन देता है, और IDNA 2008 Python पैकेज इंडेक्स पर idna पैकेज द्वारा समर्थित है। Python की String Prep क कार्यान्वयन सामान्य पुस्तकालय में stringprep मॉड्यूल में किया गया है।

सामान्यतः, आपको idna पैकेज (IDNA 2008) का उपयोग करना चाहिए और .encode("idna") (IDNA 2003) का नहीं, लेकिन कभी-कभी आपको पुराने व्यवहार की आवश्यकता होती है। String Prep में सेक्शन 3.2 में "case folding" चरण (case folding लगभग "कैसे एक कोडपॉइंट को लोर/हाई केस में बदलना" है) को परिभाषित किया गया है, जो बिना केस के स्ट्रिंग की तुलना के लिए, बाईं 3.2 और B.3 में मैपिंग टेबल के माध्यम से सभी अक्षरों को मैप करके। B.2 मूल रूप से str.lower() है, Unicode नियमों के अनुसार सभी अक्षरों को लोरकेस में बदलता है और B.3 में अपवाद होते हैं।

इस फ़ंक्शन में str.lower() कॉल एक विषाग है! क्योंकि str उस विशेष Python इंटरप्रिटर के साथ लाए गए Unicode डेटा का उपयोग करता है, आप unicodedata.unidata_version तक पहुँचकर अपने विशेष Python इंटरप्रिटर द्वारा उपयोग किया जाने वाला Unicode संस्करण पता लगा सकते हैं। हर Python संस्करण में Unicode 3.2.0 की एक डेटाबेस भी उपलब्ध है (unicodedata.ucd_3_2_0) विशेष रूप से String Prep और IDNA एल्गोरिथ्म के लिए। String Prep इस विशेष Unicode संस्करण पर निर्भर करता है ताकि समान रूप से काम कर सके, RFC 3454 में B.2 और B.3 टेबल मूल रूप से Unicode 3.2.0 के case-folding नियमों को टेबल में कोडेड किया गया है। इसलिए, हमें Unicode 3.2.0 के case-folding नियमों का उपयोग करना चाहिए, न कि नए Unicode case-folding नियमों का।

भंडारण का तरीका यह है कि नई एक्सेप्शन्स बनाई जाएं ताकि str.lower() केवल कुछ फ़ंक्शन के लिए Unicode 3.2.0 के उपयोग करने के समान चले। Bitshift को रिपोर्ट करने के लिए धन्यवाद, Stan Ulbrych को रिमेडियेशन के साथ मिलेकर विकसित करने के लिए, और Marc-Andre Lemburg और Petr Viktorin को रिमेडियेशन की समीक्षा के लिए। अधिक जानकारी के लिए CVE-2026-17084 देखें।

की एंटिटीज़: कंपनियाँ: Python सॉफ्टवेयर फ़ाउंडेशन, Alpha-Omega | लोग: Seth Larson, Bitshift, Stan Ulbrych, Marc-Andre Lemburg, Petr Viktorin