
URL के लिए रेगुलर एक्सप्रेशन मिलान। url-regex का अनुरक्षित, सुरक्षित, और ब्राउज़र-अनुकूल संस्करण। Node.js सर्वर के लिए CVE-2020-7661 को हल करता है।
URL के लिए रेगुलर एक्सप्रेशन मिलान। url-regex का अनुरक्षित, सुरक्षित और ब्राउज़र-अनुकूल संस्करण। Node.js सर्वरों के लिए CVE-2020-7661 का समाधान करता है। Node v14+ और ब्राउज़रों में कार्य करता है। इसे Spam Scanner और Forward Email के लिए अनुरक्षित किया जाता है।
जब मैंने CVE-2020-7661 की खोज की और इसे सार्वजनिक रूप से प्रकट किया (Spam Scanner और Forward Email पर अपने कार्य के माध्यम से) – मैंने खराब URL मैचों को फ़िल्टर करने के लिए कुछ अतिरिक्त गोंद के साथ url-regex के एक कार्यान्वयन का उपयोग किया।
हालाँकि, प्रोडक्शन में Forward Email पर इसका उपयोग करने के बाद (जो प्रति सप्ताह सैकड़ों-हजारों ईमेल संसाधित करता है), मुझे url-regex के साथ कई और मूलभूत समस्याएँ मिलीं और उनका दस्तावेज़ीकरण किया।
यह महसूस करते हुए कि url-regex अब सक्रिय रूप से अनुरक्षित नहीं है, इस लेखन के समय 9 खुले पुल अनुरोध हैं, और इसमें ब्राउज़र समर्थन का भी अभाव था – मैंने सभी के लिए यह पैकेज लिखने और सभी खुले पुल अनुरोधों को विलय करने का निर्णय लिया।
उम्मीद है कि यह पैकेज URL रेगुलर एक्सप्रेशन के वास्तविक दुनिया के इच्छित उपयोग से अधिक निकटता से मेल खाएगा, और उपयोगकर्ता को इसे अपनी इच्छानुसार कॉन्फ़िगर करने की अनुमति देगा। यदि इस पैकेज ने आपकी मदद की है तो कृपया Forward Email देखें, और GitHub पर हमारे स्रोत कोड का अन्वेषण करें जो दिखाता है कि हम इस पैकेज का उपयोग कैसे करते हैं।
नोट: इस पैकेज का डिफ़ॉल्ट व्यवहार re2 को लोड करने का प्रयास करेगा (यह एक वैकल्पिक पीयर निर्भरता है जिसका उपयोग रेगुलर एक्सप्रेशन डेनियल ऑफ सर्विस हमलों और अधिक को रोकने के लिए किया जाता है)। यदि आप इस व्यवहार का उपयोग करना चाहते हैं, तो आपके पास npm install re2 के माध्यम से re2 स्थापित होना चाहिए – अन्यथा यह सामान्य RegExp इंस्टेंस का उपयोग करने के लिए वापस आ जाएगा। v4.0.0 के अनुसार हमने एक विकल्प जोड़ा है यदि आप इस पैकेज को re2 लोड करने का प्रयास भी नहीं करने के लिए बाध्य करना चाहते हैं (उदा. यह आपके node_modules में है लेकिन आप इसका उपयोग नहीं करना चाहते) – बस एक विकल्प के रूप में re2: false पास करें।
npm:
npm install url-regex-safe
हमने Node.js उपयोग के लिए RE2 शामिल करके CVE-2020-7661 को हल कर दिया है। अब आपको url-regex-safe के माध्यम से अपने URL रेगुलर एक्सप्रेशन को new RE2(urlRegex()) के साथ मैन्युअल रूप से लपेटने की आवश्यकता नहीं होगी (हम इसे आपके लिए स्वचालित रूप से करते हैं)।
const urlRegexSafe = require('url-regex-safe');
const str = 'some long string with url.com in it';
const matches = str.match(urlRegexSafe());
for (const match of matches) {
console.log('match', match);
}
console.log(urlRegexSafe({ exact: true }).test('github.com'));
चूंकि RE2 ब्राउज़र के लिए नहीं बनाया गया है, इसलिए इसका उपयोग नहीं किया जाएगा, और इसलिए CVE-2020-7661 अभी भी क्लाइंट-साइड पर एक समस्या है। हालाँकि यह गंभीर नहीं है क्योंकि यह अधिक से अधिक ब्राउज़र टैब को क्रैश कर सकता है (जैसे Node.js की ओर यह पूरी प्रक्रिया को क्रैश कर देता और मेमोरी से बाहर का अपवाद फेंक देता)।
यदि आप हर जगह केवल <script> टैग का उपयोग कर रहे हैं तो यह आपके लिए समाधान है!
<script src="https://unpkg.com/url-regex-safe"></script>
<script type="text/javascript">
(function() {
var str = 'some long string with url.com in it';
var matches = str.match(urlRegexSafe());
for (var i=0; i<matches.length; i++) {
console.log('match', matches[i]);
}
console.log(urlRegexSafe({ exact: true }).test('github.com'));
})();
</script>
मान लें कि आप browserify, webpack, rollup, या किसी अन्य बंडलर का उपयोग कर रहे हैं, तो आप ऊपर दिए गए Node उपयोग का आसानी से अनुसरण कर सकते हैं।
TypeScript के साथ इस पैकेज का उपयोग करने के लिए, आप प्रकार परिभाषाओं के लिए @types/url-regex-safe पैकेज स्थापित कर सकते हैं।
npm install --save-dev @types/url-regex-safe
यदि आप github.com का स्वयं (अकेले) मिलान नहीं करना चाहते हैं तो आपको डिफ़ॉल्ट को ओवरराइड करके strict: true सेट करना होगा (हालाँकि यदि strict: false है तो www.github.com काम करेगा)।
अप्रचलित और अनुरक्षित नहीं किए गए पैकेज url-regex के विपरीत, हम कुछ चीज़ें अलग तरीके से करते हैं:
strict को डिफ़ॉल्ट रूप से false पर सेट करते हैं (url-regex में यह true पर सेट था)auth विकल्प जोड़ा, जो डिफ़ॉल्ट रूप से false पर सेट है (url-regex बेसिक प्रमाणीकरण के विरुद्ध मिलान करता है; यह true पर सेट था - हालाँकि यह Chromium में एक बहिष्कृत व्यवहार है)।parens और ipv6 विकल्प जोड़े, जो डिफ़ॉल्ट रूप से false और true पर सेट हैं (url-regex में parens true पर सेट था और ipv6 अस्तित्वहीन था या बल्कि पर सेट था)।यह सीमा केवल तब लागू होती है जब आप re2 का उपयोग कर रहे हों: चूंकि हम रेगुलर एक्सप्रेशन की "negative lookbehinds" कार्यक्षमता का उपयोग नहीं कर सकते (RE2 की सीमाओं के कारण), हम इस पुल अनुरोध से तर्क को विलय नहीं कर सके। इससे हमें यह संभव होता कि example.jpeg केवल तभी मिलान होता यदि यह example.jp होता, हालाँकि यदि आप अभी example.jpeg पास करते हैं तो यह उसमें से example.jp निकालेगा (क्योंकि .jp एक TLD है)। एक वैकल्पिक समाधान मौजूद हो सकता है, और हम इस मामले में सामुदायिक योगदान का स्वागत करते हैं।
| नाम | वेबसाइट |
|---|---|
| Forward Email LLC | https://forwardemail.net |
| Kevin Mårtensson | |
| Diego Perini |
| गुण | प्रकार | डिफ़ॉल्ट मान | विवरण |
|---|
re2 | Boolean | true | re2 लोड करने का प्रयास करें ताकि नए रेगुलर एक्सप्रेशन इंस्टेंस बनाने के लिए RegExp के बजाय इसका उपयोग किया जा सके। यदि आप re2: false पास करते हैं, तो re2 लोड करने का प्रयास भी नहीं किया जाएगा। | |
exact | Boolean | false | केवल एक सटीक String मिलान करें। यह जाँचने के लिए कि कोई String URL है या नहीं, regex.test(str) के साथ उपयोगी है। हमने इसे डिफ़ॉल्ट रूप से false पर सेट किया है ताकि github.com जैसे String मानों का मिलान किया जा सके (प्रोटोकॉल या www सबडोमेन की आवश्यकता के विपरीत)। हमें लगता है कि यह इस पैकेज के वास्तविक दुनिया के इच्छित उपयोग से अधिक निकटता से मेल खाता है। | |
strict | Boolean | false | यदि true पर सेट किया जाए तो URL को एक मान्य प्रोटोकॉल या www से शुरू करने के लिए बाध्य करें। यदि true है, तो यह किसी भी TLD को अनुमति देगा जब तक कि यह न्यूनतम 2 मान्य वर्णों का हो। यदि यह false है, तो यह tlds का उपयोग करके मान्य TLD की सूची के विरुद्ध TLD का मिलान करेगा। | |
auth | Boolean | false | बेसिक प्रमाणीकरण हेडर के विरुद्ध मिलान करें। हमने इसे डिफ़ॉल्ट रूप से false पर सेट किया है क्योंकि यह Chromium में बहिष्कृत कर दिया गया था, और अन्यथा यह उपयोगकर्ता को अवांछित URL मिलान देता है (इसे डिफ़ॉल्ट रूप से false पर सेट करके यह इस पैकेज के वास्तविक दुनिया के इच्छित उपयोग से अधिक निकटता से मेल खाता है)। | |
localhost | Boolean | true | URL के होस्टनाम भाग में localhost की अनुमति देता है। localhost परीक्षण और यह कैसे एक ऐसा मान लौटाएगा जो अवांछित हो सकता है, की अधिक जानकारी के लिए test/test.js देखें। "pic.jp" बनाम "pic.jpg" समस्या को हल करने के लिए एक पुल अनुरोध पर विचार किया जाएगा। | |
parens | Boolean | false | मार्कडाउन-शैली के अनुगामी कोष्ठक के विरुद्ध मिलान करें। हमने इसे false पर सेट किया है क्योंकि मार्कडाउन URL के लिए पार्स करना उपयोगकर्ता पर निर्भर होना चाहिए। | |
apostrophes | Boolean | false | एपॉस्ट्रॉफ़ी के विरुद्ध मिलान करें। हमने इसे false पर सेट किया है क्योंकि हम नहीं चाहते कि String background: url('http://example.com/pic.jpg'); का परिणाम http://example.com/pic.jpg' हो। अधिक जानकारी के लिए यह समस्या देखें। | |
trailingPeriod | Boolean | false | अनुगामी पीरियड (अवधि) के विरुद्ध मिलान करें। हमने इसे डिफ़ॉल्ट रूप से false पर सेट किया है क्योंकि वास्तविक दुनिया का व्यवहार मिलान के रूप में example.com बनाम example.com. चाहेगा (यह url-regex से अलग है जहाँ यह उस पैकेज में अनुगामी पीरियड का मिलान करता है)। | |
ipv4 | Boolean | true | IPv4 URL के विरुद्ध मिलान करें। | |
ipv6 | Boolean | true | IPv6 URL के विरुद्ध मिलान करें। | |
tlds | Array | tlds | विशिष्ट tlds की सूची, या tlds द्वारा प्रदान की गई डिफ़ॉल्ट सूची के विरुद्ध मिलान करें। | |
returnString | Boolean | false | RegExp के बजाय RegExp को String के रूप में लौटाएँ (कस्टम लॉजिक के लिए उपयोगी, जैसे हमने Spam Scanner के साथ किया था)। |
falseapostrophe विकल्प जोड़ा, जो डिफ़ॉल्ट रूप से false पर सेट है (url-regex में यह true पर सेट था)।trailingPeriod विकल्प जोड़ा, जो डिफ़ॉल्ट रूप से false पर सेट है (जिसका अर्थ है कि मिलानों में अनुगामी पीरियड नहीं होंगे, जबकि url-regex में यह true पर सेट था)।