عناوين URL والتجزئة

ينطبق هذا المستند على الطريقة التالية: تحديث واجهة برمجة التطبيقات (الإصدار 4): fullHashes.find.

نظرة عامة

تتألف قوائم "التصفح الآمن" من تجزئات SHA256 ذات الطول المتغير (راجِع قائمة المحتويات). للتحقّق من عنوان URL وفقًا لقائمة "التصفّح الآمن" (إما على الجهاز أو على الخادم)، يجب أولاً على العملاء محاسبة بادئة التجزئة لعنوان URL هذا.

لاحتساب بادئة التجزئة لعنوان URL، اتّبِع الخطوات التالية:

  1. تحديد عنوان URL الأساسي (راجع تحديد عنوان URL الأساسي).
  2. أنشئ تعبيرات اللاحقة/البادئة لعنوان URL (راجِع تعبيرات اللاحقة/البادئة).
  3. حساب التجزئة بالطول الكامل لكل تعبير لاحقة/بادئة (راجع عمليات حساب التجزئة).
  4. حساب بادئة التجزئة لكل تجزئة بالطول الكامل (راجع عمليات حساب بادئة التجزئة).

لاحظ أن هذه الخطوات تعكس العملية التي يستخدمها خادم التصفح الآمن للحفاظ على تصفُّح القوائم

تحديد عنوان URL الأساسي

في البداية، نفترض أنّ العميل قد عالج عنوان URL وجعله صالحًا وفقًا لمعيار RFC 2396. وإذا كان عنوان URL يستخدم اسم مجال دولي (IDN)، فيجب على العميل تحويل عنوان URL إلى تمثيل ASCII Punycode. يجب أن يتضمّن عنوان URL مكوّن مسار، أي أنّه يجب أن يحتوي على شرطة مائلة نهائية ("http://google.com/").

أولاً، أزِل أحرف Tab (0x09) وCR (0x0d) وLF (0x0a) من عنوان URL. لا تزيل تسلسلات إلغاء هذه الأحرف (مثلاً ‎%0a).

ثانيًا، إذا كان عنوان URL ينتهي بجزء، أزِل ذلك الجزء. على سبيل المثال، اختصر "http://google.com/#frag" إلى "http://google.com/".

ثالثًا، يتم تكرار خوارزمية إلغاء النسبة المئوية لإلغاء عنوان URL إلى أن لا يحتوي على مزيد من حروف إلغاء النسبة المئوية.

لتحديد عنوان URL الأساسي لاسم المضيف:

استخرِج اسم المضيف من عنوان URL، ثم اتّبِع الخطوات التالية:

  1. أزِل جميع النقاط البادئة واللاحقة.
  2. استبدِل النقاط المتتالية بنقطة واحدة.
  3. إذا كان من الممكن تحليل اسم المضيف باعتباره عنوان IP، عليك تسويته إلى 4 قيم عشرية مفصولة بنقاط. يجب أن يعالج العميل أي ترميز قانوني لعنوان IP، بما في ذلك الترميز الثماني والسادس عشر وأقل من أربعة مكوّنات.
  4. اجعل السلسلة بأكملها صغيرة.

لتحديد عنوان URL الأساسي للمسار:

  1. حلُّ التسلسلات "/../" و "/./" في المسار من خلال مع استبدال "/./" مع "/"، وإزالة "/../" مع المسار السابق المكون.
  2. يمكنك استبدال عمليات الشرطة المائلة المتتالية بحرف شرطة مائلة واحد.

لا تطبِّق عمليات تحديد عنوان URL الأساسي هذه للمسار على مَعلمات طلب البحث.

في عنوان URL، استخدِم رمز النسبة المئوية لتجاوز كل الأحرف التي تقلّ عن أو تساوي 32 ASCII أو تزيد عن أو تساوي 127 أو "#" أو "%". ويجب أن تستخدم عمليات التجاوز أحرفًا سداسية عشرية كبيرة.

في ما يلي اختبارات للمساعدة في التحقّق من تنفيذ عملية إنشاء عنوان URL أساسي.

Canonicalize("http://host/%25%32%35") = "http://host/%25";
Canonicalize("http://host/%25%32%35%25%32%35") = "http://host/%25%25";
Canonicalize("http://host/%2525252525252525") = "http://host/%25";
Canonicalize("http://host/asdf%25%32%35asd") = "http://host/asdf%25asd";
Canonicalize("http://host/%%%25%32%35asd%%") = "http://host/%25%25%25asd%25%25";
Canonicalize("http://www.google.com/") = "http://www.google.com/";
Canonicalize("http://%31%36%38%2e%31%38%38%2e%39%39%2e%32%36/%2E%73%65%63%75%72%65/%77%77%77%2E%65%62%61%79%2E%63%6F%6D/") = "http://168.188.99.26/.secure/www.ebay.com/";
Canonicalize("http://195.127.0.11/uploads/%20%20%20%20/.verify/.eBaysecure=updateuserdataxplimnbqmn-xplmvalidateinfoswqpcmlx=hgplmcx/") = "http://195.127.0.11/uploads/%20%20%20%20/.verify/.eBaysecure=updateuserdataxplimnbqmn-xplmvalidateinfoswqpcmlx=hgplmcx/";
Canonicalize("http://host%23.com/%257Ea%2521b%2540c%2523d%2524e%25f%255E00%252611%252A22%252833%252944_55%252B") = "http://host%23.com/~a!b@c%23d$e%25f^00&11*22(33)44_55+";
Canonicalize("http://3279880203/blah") = "http://195.127.0.11/blah";
Canonicalize("http://www.google.com/blah/..") = "http://www.google.com/";
Canonicalize("www.google.com/") = "http://www.google.com/";
Canonicalize("www.google.com") = "http://www.google.com/";
Canonicalize("http://www.evil.com/blah#frag") = "http://www.evil.com/blah";
Canonicalize("http://www.GOOgle.com/") = "http://www.google.com/";
Canonicalize("http://www.google.com.../") = "http://www.google.com/";
Canonicalize("http://www.google.com/foo\tbar\rbaz\n2") ="http://www.google.com/foobarbaz2";
Canonicalize("http://www.google.com/q?") = "http://www.google.com/q?";
Canonicalize("http://www.google.com/q?r?") = "http://www.google.com/q?r?";
Canonicalize("http://www.google.com/q?r?s") = "http://www.google.com/q?r?s";
Canonicalize("http://evil.com/foo#bar#baz") = "http://evil.com/foo";
Canonicalize("http://evil.com/foo;") = "http://evil.com/foo;";
Canonicalize("http://evil.com/foo?bar;") = "http://evil.com/foo?bar;";
Canonicalize("http://\x01\x80.com/") = "http://%01%80.com/";
Canonicalize("http://notrailingslash.com") = "http://notrailingslash.com/";
Canonicalize("http://www.gotaport.com:1234/") = "http://www.gotaport.com/";
Canonicalize("  http://www.google.com/  ") = "http://www.google.com/";
Canonicalize("http:// leadingspace.com/") = "http://%20leadingspace.com/";
Canonicalize("http://%20leadingspace.com/") = "http://%20leadingspace.com/";
Canonicalize("%20leadingspace.com/") = "http://%20leadingspace.com/";
Canonicalize("https://www.securesite.com/") = "https://www.securesite.com/";
Canonicalize("http://host.com/ab%23cd") = "http://host.com/ab%23cd";
Canonicalize("http://host.com//twoslashes?more//slashes") = "http://host.com/twoslashes?more//slashes";

تعبيرات اللاحقة/البادئة

بعد تحديد عنوان URL الأساسي، تكون الخطوة التالية هي إنشاء تعبيرات اللاحقة/البادئة. على كل تعبير اللاحقة/البادئة يتكون من لاحقة مضيف (أو مضيف كامل) وبادئة مسار (أو مسار كامل) كما هو موضح في هذه الأمثلة.

تعبير اللاحقة/البادئةالتعبير العادي المكافئ
a.b/mypath/
http\:\/\/.*\.a\.b\/mypath\/.*
c.d/full/path.html?myparam=a
http\:\/\/.*.c\.d\/full\/path\.html?myparam=a

سيُنشئ العميل ما يصل إلى 30 مجموعة مختلفة من لاحقة المضيف وبادئة المسار. تستخدم هذه المجموعات مكونات المضيف والمسار لعنوان URL فقط. سيساعدك المخطط واسم المستخدم وكلمة المرور، والمنفذ. إذا كان عنوان URL يتضمّن معلَمات طلب بحث، يجب إدراج معلمة المسار الكامل ومعلمات طلب البحث.

بالنسبة إلى المضيف، سيحاول العميل استخدام خمس سلاسل مختلفة بحد أقصى. وهذه الأنواع الفرعية هي:

  • اسم المضيف الدقيق في عنوان URL.
  • يتم تكوين ما يصل إلى أربعة أسماء مضيفين بالبدء بآخر خمسة مكونات إزالة المكون الرئيسي بشكل متتابع. يمكن تخطّي نطاق المستوى الأعلى. ينبغي عدم التحقّق من أسماء المضيفين الإضافية هذه إذا كان المضيف هو عنوان IP.

بالنسبة إلى المسار، سيحاول العميل ست سلاسل مختلفة بحد أقصى. وهي تشمل ما يلي:

  • المسار الدقيق لعنوان URL، بما في ذلك مَعلمات طلب البحث.
  • المسار الدقيق لعنوان URL، بدون مَعلمات طلب البحث.
  • المسارات الأربعة التي يتم إنشاؤها من خلال البدء من الجذر (/) وإلحاق مكونات المسار بشكلٍ متسلسل، بما في ذلك الشرطة المائلة للخلف

توضِّح الأمثلة التالية سلوك التحقّق:

بالنسبة إلى عنوان URL http://a.b.c/1/2.html?param=1، سيحاول العميل استخدام سلاسل الأرقام التالية:

a.b.c/1/2.html?param=1
a.b.c/1/2.html
a.b.c/
a.b.c/1/
b.c/1/2.html?param=1
b.c/1/2.html
b.c/
b.c/1/

بالنسبة إلى عنوان URL http://a.b.c.d.e.f.g/1.html، سيحاول العميل تنفيذ ما يلي من الممكن strings:

a.b.c.d.e.f.g/1.html
a.b.c.d.e.f.g/
(Note: skip b.c.d.e.f.g, since we'll take only the last five hostname components, and the full hostname)
c.d.e.f.g/1.html
c.d.e.f.g/
d.e.f.g/1.html
d.e.f.g/
e.f.g/1.html
e.f.g/
f.g/1.html
f.g/

بالنسبة إلى عنوان URL http://1.2.3.4/1/، سيحاول العميل تنفيذ ما يلي من الممكن strings:

1.2.3.4/1/
1.2.3.4/

عمليات احتساب التجزئة

وبمجرد إنشاء مجموعة تعبيرات اللاحقة/البادئة، تتمثل الخطوة التالية في حساب تجزئة SHA256 بالطول الكامل لكل تعبير. يمكنك استخدام اختبار الوحدة (في pseudo-C) للتحقق من صحة في ما يلي حسابات التجزئة.

أمثلة من FIPS-180-2:

Unit Test (in pseudo-C)

// Example B1 from FIPS-180-2
string input1 = "abc";
string output1 = TruncatedSha256Prefix(input1, 32);
int expected1[] = { 0xba, 0x78, 0x16, 0xbf };
assert(output1.size() == 4);  // 4 bytes == 32 bits
for (int i = 0; i < output1.size(); i++) assert(output1[i] == expected1[i]);

// Example B2 from FIPS-180-2
string input2 = "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq";
string output2 = TruncatedSha256Prefix(input2, 48);
int expected2[] = { 0x24, 0x8d, 0x6a, 0x61, 0xd2, 0x06 };
assert(output2.size() == 6);
for (int i = 0; i < output2.size(); i++) assert(output2[i] == expected2[i]);

// Example B3 from FIPS-180-2
string input3(1000000, 'a');  // 'a' repeated a million times
string output3 = TruncatedSha256Prefix(input3, 96);
int expected3[] = { 0xcd, 0xc7, 0x6e, 0x5c, 0x99, 0x14, 0xfb, 0x92,
                    0x81, 0xa1, 0xc7, 0xe2 };
assert(output3.size() == 12);
for (int i = 0; i < output3.size(); i++) assert(output3[i] == expected3[i]);

عمليات احتساب بادئة التجزئة

وأخيرًا، يحتاج العميل إلى حساب بادئة التجزئة لكل تجزئة SHA256 بالطول الكامل. في ميزة "التصفّح الآمن"، تتألّف بادئة التجزئة من 4 إلى 32 بايتًا الأكثر أهمية من تجزئة SHA256.

أمثلة من FIPS-180-2:

  • مثال B1 من FIPS-180-2
    • الإدخال هو "abc".
    • ملخّص SHA256 هو ba7816bf 8f01cfea 414140de 5dae2223 b00361a3 96177a9c b410ff61 f20015ad.
    • بادئة التجزئة التي تبلغ 32 بت هي ba7816bf.
  • مثال B2 من FIPS-180-2
    • الإدخال هو "abcdbcdecdefgefghfghighijhijkijkljklmklmnlmnomnopnopq".
    • ملخّص SHA256 هو 248d6a61 d20638b8 e5c02693 0c3e6039 a33ce459 64ff2167 f6ecedd4 19db06c1.
    • بادئة التجزئة التي تبلغ 48 بت هي ‎248d6a61 d206.