URL ها و هش کردن

این سند برای روش زیر اعمال می‌شود: به‌روزرسانی API (v4) : fullHashes.find .

نمای کلی

فهرست‌های مرور ایمن از هش‌های SHA256 با طول متغیر تشکیل شده‌اند ( محتوای فهرست را ببینید). برای بررسی یک URL در برابر فهرست مرور ایمن (به صورت محلی یا روی سرور)، مشتریان باید ابتدا پیشوند هش آن URL را محاسبه کنند.

برای محاسبه پیشوند هش یک URL، مراحل زیر را دنبال کنید:

  1. URL را متعارف کنید (به متعارف سازی مراجعه کنید).
  2. عبارات پسوند/پیشوند را برای URL ایجاد کنید (به عبارت پسوند/پیشوند مراجعه کنید).
  3. هش تمام طول را برای هر عبارت پسوند/پیوند محاسبه کنید (به محاسبات هش مراجعه کنید).
  4. پیشوند هش را برای هر هش تمام قد محاسبه کنید (به محاسبات پیشوند هش مراجعه کنید).

توجه داشته باشید که این مراحل منعکس کننده فرآیندی است که سرور مرور ایمن برای حفظ لیست های مرور ایمن استفاده می کند.

متعارف سازی

برای شروع، فرض می کنیم که مشتری URL را تجزیه کرده و آن را مطابق RFC 2396 معتبر کرده است. اگر URL از یک نام دامنه بین المللی (IDN) استفاده می کند، مشتری باید URL را به نمایندگی ASCII Punycode تبدیل کند. URL باید شامل یک جزء مسیر باشد. یعنی باید یک اسلش انتهایی داشته باشد ("http://google.com/").

ابتدا کاراکترهای تب (0x09)، CR (0x0d) و LF (0x0a) را از URL حذف کنید. دنباله های فرار را برای این کاراکترها حذف نکنید (به عنوان مثال '%0a').

دوم، اگر URL به یک قطعه ختم می شود، قطعه را حذف کنید. برای مثال، «http://google.com/#frag» را به «http://google.com/» کوتاه کنید.

سوم، به طور مکرر درصد از URL خارج شود تا زمانی که دیگر درصد فرار نداشته باشد.

برای متعارف سازی نام میزبان:

نام میزبان را از URL استخراج کنید و سپس:

  1. تمام نقاط پیشرو و انتهایی را حذف کنید.
  2. نقطه های متوالی را با یک نقطه جایگزین کنید.
  3. اگر نام میزبان را می توان به عنوان یک آدرس IP تجزیه کرد، آن را به 4 مقدار اعشاری جدا شده با نقطه نرمال کنید. مشتری باید هر کدگذاری آدرس IP قانونی، از جمله اکتال، هگز و کمتر از چهار مؤلفه را کنترل کند.
  4. کل رشته را با حروف کوچک بنویسید.

برای متعارف کردن مسیر:

  1. دنباله های "/../" و "/./" را در مسیر با جایگزینی "/./" با "/"، و حذف "/../" به همراه مولفه مسیر قبلی حل کنید.
  2. اجراهای اسلش های متوالی را با یک کاراکتر اسلش جایگزین کنید.

این متعارف سازی مسیرها را برای پارامترهای پرس و جو اعمال نکنید.

در URL، درصد فرار از همه کاراکترهایی که <= ASCII 32، >= 127، "#" یا "%" هستند. Escape ها باید از حروف هگز بزرگ استفاده کنند.

در زیر تست‌هایی برای کمک به اعتبارسنجی پیاده‌سازی متعارف وجود دارد.

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://abc/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://abcdefg/1.html ، مشتری این رشته های ممکن را امتحان می کند:

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/ ، مشتری این رشته های ممکن را امتحان می کند:

1.2.3.4/1/
1.2.3.4/

محاسبات هش

هنگامی که مجموعه عبارات پسوند/پیشوند ایجاد شد، مرحله بعدی محاسبه هش SHA256 تمام طول برای هر عبارت است. یک آزمون واحد (در شبه 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
    • ورودی "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopn" است.
    • خلاصه SHA256 248d6a61 d20638b8 e5c02693 0c3e6039 a33ce459 64ff2167 f6ecedd4 19db06c1 است.
    • پیشوند هش 48 بیتی 248d6a61 d206 است.
،

این سند برای روش زیر اعمال می‌شود: به‌روزرسانی API (v4) : fullHashes.find .

نمای کلی

فهرست‌های مرور ایمن از هش‌های SHA256 با طول متغیر تشکیل شده‌اند ( محتوای فهرست را ببینید). برای بررسی یک URL در برابر فهرست مرور ایمن (به صورت محلی یا روی سرور)، مشتریان باید ابتدا پیشوند هش آن URL را محاسبه کنند.

برای محاسبه پیشوند هش یک URL، مراحل زیر را دنبال کنید:

  1. URL را متعارف کنید (به متعارف سازی مراجعه کنید).
  2. عبارات پسوند/پیشوند را برای URL ایجاد کنید (به عبارت پسوند/پیشوند مراجعه کنید).
  3. هش تمام طول را برای هر عبارت پسوند/پیوند محاسبه کنید (به محاسبات هش مراجعه کنید).
  4. پیشوند هش را برای هر هش تمام قد محاسبه کنید (به محاسبات پیشوند هش مراجعه کنید).

توجه داشته باشید که این مراحل منعکس کننده فرآیندی است که سرور مرور ایمن برای حفظ لیست های مرور ایمن استفاده می کند.

متعارف سازی

برای شروع، فرض می کنیم که مشتری URL را تجزیه کرده و آن را مطابق RFC 2396 معتبر کرده است. اگر URL از یک نام دامنه بین المللی (IDN) استفاده می کند، مشتری باید URL را به نمایندگی ASCII Punycode تبدیل کند. URL باید شامل یک جزء مسیر باشد. یعنی باید یک اسلش انتهایی داشته باشد ("http://google.com/").

ابتدا کاراکترهای تب (0x09)، CR (0x0d) و LF (0x0a) را از URL حذف کنید. دنباله های فرار را برای این کاراکترها حذف نکنید (به عنوان مثال '%0a').

دوم، اگر URL به یک قطعه ختم می شود، قطعه را حذف کنید. برای مثال، «http://google.com/#frag» را به «http://google.com/» کوتاه کنید.

سوم، به طور مکرر درصد از URL خارج شود تا زمانی که دیگر درصد فرار نداشته باشد.

برای متعارف کردن نام میزبان:

نام میزبان را از URL استخراج کنید و سپس:

  1. تمام نقاط پیشرو و انتهایی را حذف کنید.
  2. نقطه های متوالی را با یک نقطه جایگزین کنید.
  3. اگر نام میزبان را می توان به عنوان یک آدرس IP تجزیه کرد، آن را به 4 مقدار اعشاری جدا شده با نقطه نرمال کنید. مشتری باید هر کدگذاری آدرس IP قانونی، از جمله اکتال، هگز و کمتر از چهار مؤلفه را کنترل کند.
  4. کل رشته را با حروف کوچک بنویسید.

برای متعارف کردن مسیر:

  1. دنباله های "/../" و "/./" را در مسیر با جایگزینی "/./" با "/"، و حذف "/../" به همراه مولفه مسیر قبلی حل کنید.
  2. اجراهای اسلش های متوالی را با یک کاراکتر اسلش جایگزین کنید.

این متعارف سازی مسیرها را برای پارامترهای پرس و جو اعمال نکنید.

در URL، درصد فرار از همه کاراکترهایی که <= ASCII 32، >= 127، "#" یا "%" هستند. Escape ها باید از حروف هگز بزرگ استفاده کنند.

در زیر تست‌هایی برای کمک به اعتبارسنجی پیاده‌سازی متعارف وجود دارد.

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://abc/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://abcdefg/1.html ، مشتری این رشته های ممکن را امتحان می کند:

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/ ، مشتری این رشته های ممکن را امتحان می کند:

1.2.3.4/1/
1.2.3.4/

محاسبات هش

هنگامی که مجموعه عبارات پسوند/پیشوند ایجاد شد، مرحله بعدی محاسبه هش SHA256 تمام طول برای هر عبارت است. یک آزمون واحد (در شبه 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
    • ورودی "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopn" است.
    • خلاصه SHA256 248d6a61 d20638b8 e5c02693 0c3e6039 a33ce459 64ff2167 f6ecedd4 19db06c1 است.
    • پیشوند هش 48 بیتی 248d6a61 d206 است.
،

این سند برای روش زیر اعمال می‌شود: به‌روزرسانی API (v4) : fullHashes.find .

نمای کلی

فهرست‌های مرور ایمن از هش‌های SHA256 با طول متغیر تشکیل شده‌اند ( محتوای فهرست را ببینید). برای بررسی یک URL در برابر فهرست مرور ایمن (به صورت محلی یا روی سرور)، مشتریان باید ابتدا پیشوند هش آن URL را محاسبه کنند.

برای محاسبه پیشوند هش یک URL، مراحل زیر را دنبال کنید:

  1. URL را متعارف کنید (به متعارف سازی مراجعه کنید).
  2. عبارات پسوند/پیشوند را برای URL ایجاد کنید (به عبارت پسوند/پیشوند مراجعه کنید).
  3. هش تمام طول را برای هر عبارت پسوند/پیوند محاسبه کنید (به محاسبات هش مراجعه کنید).
  4. پیشوند هش را برای هر هش تمام قد محاسبه کنید (به محاسبات پیشوند هش مراجعه کنید).

توجه داشته باشید که این مراحل منعکس کننده فرآیندی است که سرور مرور ایمن برای حفظ لیست های مرور ایمن استفاده می کند.

متعارف سازی

برای شروع، فرض می کنیم که مشتری URL را تجزیه کرده و آن را مطابق RFC 2396 معتبر کرده است. اگر URL از یک نام دامنه بین المللی (IDN) استفاده می کند، مشتری باید URL را به نمایندگی ASCII Punycode تبدیل کند. URL باید شامل یک جزء مسیر باشد. یعنی باید یک اسلش انتهایی داشته باشد ("http://google.com/").

ابتدا کاراکترهای تب (0x09)، CR (0x0d) و LF (0x0a) را از URL حذف کنید. دنباله های فرار را برای این کاراکترها حذف نکنید (به عنوان مثال '%0a').

دوم، اگر URL به یک قطعه ختم می شود، قطعه را حذف کنید. برای مثال، «http://google.com/#frag» را به «http://google.com/» کوتاه کنید.

سوم، به طور مکرر درصد از URL خارج شود تا زمانی که دیگر درصد فرار نداشته باشد.

برای متعارف کردن نام میزبان:

نام میزبان را از URL استخراج کنید و سپس:

  1. تمام نقاط پیشرو و انتهایی را حذف کنید.
  2. نقطه های متوالی را با یک نقطه جایگزین کنید.
  3. اگر نام میزبان را می توان به عنوان یک آدرس IP تجزیه کرد، آن را به 4 مقدار اعشاری جدا شده با نقطه نرمال کنید. مشتری باید هر کدگذاری آدرس IP قانونی، از جمله اکتال، هگز و کمتر از چهار مؤلفه را کنترل کند.
  4. کل رشته را با حروف کوچک بنویسید.

برای متعارف کردن مسیر:

  1. دنباله های "/../" و "/./" را در مسیر با جایگزینی "/./" با "/"، و حذف "/../" به همراه مولفه مسیر قبلی حل کنید.
  2. اجراهای اسلش های متوالی را با یک کاراکتر اسلش جایگزین کنید.

این متعارف سازی مسیرها را برای پارامترهای پرس و جو اعمال نکنید.

در URL، درصد فرار از همه کاراکترهایی که <= ASCII 32، >= 127، "#" یا "%" هستند. Escape ها باید از حروف هگز بزرگ استفاده کنند.

در زیر تست‌هایی برای کمک به اعتبارسنجی پیاده‌سازی متعارف وجود دارد.

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://abc/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://abcdefg/1.html ، مشتری این رشته های ممکن را امتحان می کند:

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/ ، مشتری این رشته های ممکن را امتحان می کند:

1.2.3.4/1/
1.2.3.4/

محاسبات هش

هنگامی که مجموعه عبارات پسوند/پیشوند ایجاد شد، مرحله بعدی محاسبه هش SHA256 تمام طول برای هر عبارت است. یک آزمون واحد (در شبه 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
    • ورودی "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopn" است.
    • خلاصه SHA256 248d6a61 d20638b8 e5c02693 0c3e6039 a33ce459 64ff2167 f6ecedd4 19db06c1 است.
    • پیشوند هش 48 بیتی 248d6a61 d206 است.