
مطابقة التعبيرات النمطية لعناوين URL. نسخة مُحدثة وآمنة ومتوافقة مع المتصفحات من url-regex. يعالج ثغرة CVE-2020-7661 لخوادم Node.js.
تعبير نمطي لمطابقة عناوين URL. نسخة مُصانة وآمنة ومتوافقة مع المتصفحات من url-regex. تعمل على حل CVE-2020-7661 لخوادم Node.js. تعمل في Node v14+ والمتصفحات. مُصانة لصالح Spam Scanner وForward Email.
بعد اكتشاف CVE-2020-7661 والإفصاح عنه علنًا (من خلال عملي على Spam Scanner وForward Email) – استخدمت تنفيذًا من url-regex مع بعض الإضافات في الأعلى لتصفية مطابقات URL غير الصحيحة.
غير أنني بعد استخدامه على Forward Email في الإنتاج (الذي يعالج مئات الآلاف من رسائل البريد الإلكتروني أسبوعيًا)، وجدت ووثّقت العديد من المشاكل الأساسية الإضافية في url-regex.
وإدراكًا مني أن url-regex لم يعد يُصان بنشاط، وأن لديه 9 طلبات سحب مفتوحة حتى وقت كتابة هذا النص، كما أنه يفتقر إلى دعم المتصفحات – قررت كتابة هذه الحزمة للجميع ودمج جميع طلبات السحب المفتوحة.
من المؤمل أن تكون هذه الحزمة أقرب إلى الاستخدام العملي المقصود للتعبير النمطي لعناوين URL، وأن تسمح أيضًا للمستخدم بتهيئتها كما يشاء. يرجى الاطلاع على Forward Email إذا كانت هذه الحزمة قد ساعدتك، واستكشف الكود المصدري الخاص بنا على GitHub الذي يوضح كيفية استخدامنا لهذه الحزمة.
ملاحظة: السلوك الافتراضي لهذه الحزمة سيحاول تحميل re2 (وهو تبعية اختيارية نظيرة تُستخدم لمنع هجمات حجب الخدمة عبر التعبيرات النمطية وغير ذلك). إذا كنت ترغب في استخدام هذا السلوك، يجب أن يكون لديك re2 مثبتًا عبر npm install re2 – وإلا فستعود الحزمة إلى استخدام نسخ RegExp العادية. اعتبارًا من v4.0.0 أضفنا خيارًا إذا كنت ترغب في إجبار هذه الحزمة على عدم محاولة تحميل re2 حتى (على سبيل المثال، إذا كانت موجودة في node_modules ولكنك لا تريد استخدامها) – فقط مرر re2: false كخيار.
npm:
npm install url-regex-safe
لقد قمنا بحل CVE-2020-7661 من خلال تضمين RE2 لاستخدام Node.js. لن تضطر بعد الآن إلى لف تعبيرات URL النمطية يدويًا باستخدام new RE2(urlRegex()) عبر url-regex-safe (نحن نفعل ذلك تلقائيًا نيابة عنك).
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
يجب عليك تجاوز الافتراضي وتعيين strict: true إذا كنت لا ترغب في مطابقة github.com بمفردها (على الرغم من أن www.github.com سيعمل إذا كان strict: false).
على عكس الحزمة 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 |
| Property | Type | Default Value | Description |
|---|
re2 | Boolean | true | محاولة تحميل re2 لاستخدامه بدلاً من RegExp لإنشاء نسخ جديدة من التعبيرات النمطية. إذا مررت re2: false، فلن يتم حتى محاولة تحميل re2. | |
exact | Boolean | false | مطابقة سلسلة نصية محددة تمامًا فقط. مفيد مع regex.test(str) للتحقق مما إذا كانت السلسلة النصية عنوان URL. قمنا بتعيين هذا الخيار إلى false افتراضيًا لمطابقة قيم نصية مثل github.com (بدلاً من اشتراط وجود بروتوكول أو نطاق فرعي www). نعتقد أن هذا أقرب إلى الاستخدام العملي المقصود لهذه الحزمة. | |
strict | Boolean | false | إجبار عناوين URL على البدء ببروتوكول صالح أو www إذا تم الضبط إلى true. إذا كان true، فسيسمح بأي نطاق أعلى مستوى (TLD) طالما أنه يتكون من حرفين صالحين على الأقل. إذا كان false، فسيطابق النطاق الأعلى مستوى (TLD) مع قائمة النطاقات الأعلى مستوى الصالحة باستخدام tlds. | |
auth | Boolean | false | المطابقة مع ترويسات المصادقة الأساسية (Basic Authentication). قمنا بتعيين هذا الخيار إلى false افتراضيًا لأنه تم إهماله في Chromium، وإلا فإنه يترك المستخدم مع مطابقات URL غير مرغوب فيها (وهذا أقرب إلى الاستخدام العملي المقصود لهذه الحزمة من خلال تعيينه إلى false افتراضيًا أيضًا). | |
localhost | Boolean | true | يسمح بـ localhost في جزء اسم المضيف من عنوان URL. راجع test/test.js لمزيد من الإلمام باختبار localhost وكيف سيعيد قيمة قد تكون غير مرغوب فيها. ستُؤخذ طلبات السحب في الاعتبار لحل مشكلة "pic.jp" مقابل "pic.jpg". | |
parens | Boolean | false | المطابقة مع الأقواس اللاحقة بنمط Markdown. قمنا بتعيين هذا الخيار إلى false لأنه ينبغي أن يكون على المستخدم تحليل عناوين URL الخاصة بـ Markdown. | |
apostrophes | Boolean | false | المطابقة مع الفواصل العليا. قمنا بتعيين هذا الخيار إلى false لأننا لا نريد أن تؤدي السلسلة النصية 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 | المطابقة مع عناوين URL الخاصة بـ IPv4. | |
ipv6 | Boolean | true | المطابقة مع عناوين URL الخاصة بـ IPv6. | |
tlds | Array | tlds | المطابقة مع قائمة محددة من النطاقات الأعلى مستوى (TLDs)، أو القائمة الافتراضية المقدمة من tlds. | |
returnString | Boolean | false | إرجاع التعبير النمطي كسلسلة نصية بدلاً من RegExp (مفيد للمنطق المخصص، مثل ما فعلناه مع Spam Scanner). |
falseapostrophe، المضبوط على false افتراضيًا (url-regex كان يضبطه على true).trailingPeriod، المضبوط على false افتراضيًا (ما يعني أن المطابقات لن تحتوي على نقاط لاحقة، بينما كان url-regex يضبطه على true).