URL'ler ve Karma Oluşturma

Bu doküman aşağıdaki yöntem için geçerlidir: Update API (v4): fullHashes.find.

Genel Bakış

Güvenli Tarama listeleri, değişken uzunlukta SHA256 karmalarından oluşur (bkz. İçerikleri Listeleme). İstemcilerin önce bir URL'yi Güvenli Tarama listesine (yerel olarak veya sunucuda) göre kontrol etmek için bu URL'nin karma ön ekini hesaplayabilir.

Bir URL'nin karma ön ekini hesaplamak için aşağıdaki adımları izleyin:

  1. URL'yi standartlaştırın (Standartlaştırma bölümüne bakın).
  2. URL için sonek/önek ifadeleri oluşturma (bkz. Son Ek/Önek İfadeleri).
  3. Her son ek/ön ek ifadesi için tam uzunluktaki karma oluşturma işlemini yapın (Karma oluşturma işlemleri bölümüne bakın).
  4. Her tam uzunluktaki karma için karma ön ekini hesaplayın (bkz. Karma Önek Hesaplamaları).

Bu adımların, Güvenli Tarama sunucusunun Güvenli Tarama listelerini korumak için kullandığı süreci yansıttığını unutmayın.

Standartlaştırma

Başlangıç olarak, istemcinin URL'yi ayrıştırdığını ve RFC 2396'ya göre geçerli hale getirdiğini varsayarız. URL'de uluslararası hâle getirilmiş alan adı (IDN) kullanılıyorsa istemci, URL'yi ASCII Punycode temsiline dönüştürmelidir. URL bir yol bileşeni içermelidir. Yani URL'nin sonunda eğik çizgi ("http://google.com/") olmalıdır.

Öncelikle, URL'den sekme (0x09), satır başı (0x0d) ve satır sonu (0x0a) karakterlerini kaldırın. Bu karakterlerin kod dışına alma dizilerini kaldırmayın (ör. "%0a").

İkinci olarak, URL bir parçayla bitiyorsa bu parçayı kaldırın. Örneğin, "http://google.com/#frag" "http://google.com/".

Üçüncü olarak, daha fazla yüzde çıkış değeri kalmayana kadar URL'de tekrar tekrar yüzde çıkış karakteri kullanın.

Barındırıcı adını standartlaştırmak için:

Ana makine adını URL'den çıkarın ve ardından:

  1. Baştaki ve sondaki tüm noktaları kaldırın.
  2. Ardışık noktaları tek bir noktayla değiştirin.
  3. Ana makine adı, IP adresi olarak ayrıştırılabiliyorsa normalleştirin. 4 noktayla ayrılmış ondalık değere sahiptir. İstemci, sekizli, onaltılık ve dörtten az bileşen dahil olmak üzere tüm yasal IP adresi kodlamalarını işlemelidir.
  4. Tüm dizeyi küçük harfle yazın.

Yolu standartlaştırmak için:

  1. "/./" ile "/"yi değiştirip "/../"yi önceki yol bileşeniyle birlikte kaldırarak yoldaki "/../" ve "/./" dizilerini çözün.
  2. Art arda eğik çizgi sayısını tek bir eğik çizgi karakteriyle değiştirin.

Bu yol standartlaştırmalarını sorgu parametrelerine uygulamayın.

URL'de, tüm karakterlerde yüzde kaçış kodu arasında yer alır. Kod dışına alma işlemleri büyük harfli onaltılık karakterler.

Aşağıda, standartlaştırma uygulamasını doğrulamaya yardımcı olacak testler verilmiştir.

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";

Sonek/ön ek ifadeleri

URL standartlaştırıldıktan sonraki adım sonek/önek ifadelerini oluşturmaktır. Her son ek/ön ek ifadesi, bu örneklerde gösterildiği gibi bir ana makine son ekinden (veya tam ana makineden) ve bir yol ön ekinden (veya tam yoldan) oluşur.

Sonek/Önek İfadesiEşdeğer Normal İfade
a.b/mypath/
http\:\/\/.*\.a\.b\/mypath\/.*
c.d/full/path.html?myparam=a
http\:\/\/.*.c\.d\/full\/path\.html?myparam=a

İstemci en fazla 30 farklı olası ana makine son eki ve yol öneki kombinasyonu oluşturur. Bu kombinasyonlarda yalnızca URL'nin ana makine ve yol bileşenleri kullanılır. Şema, kullanıcı adı varsayılır. URL sorgu parametreleri içeriyorsa en az bir kombinasyon tam yolu ve sorgu parametrelerini içerir.

Ana makine için istemci en fazla beş farklı dize dener. Bunları şöyle sıralayabiliriz:

  • URL'deki tam ana makine adı.
  • Son beş bileşenden başlayıp önde gelen bileşeni ardışık olarak kaldırarak oluşturulan en fazla dört ana makine adı. Üst düzey alan atlanabilir. Bu Ana makine bir IP adresiyse diğer ana makine adları işaretlenmemelidir.

Yol için istemci en fazla altı farklı dize dener. Bunlar:

  • URL'nin sorgu parametreleri dahil tam yolu.
  • URL'nin sorgu parametreleri olmadan tam yolu.
  • Kökten başlayıp (/) sırayla yol ekleyerek oluşturulan dört yol diğer bileşenleri de içerir.

Aşağıdaki örneklerde kontrol davranışı gösterilmektedir:

http://a.b.c/1/2.html?param=1 URL'si için müşteri bunları deneyecek olası dizeler:

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/

http://a.b.c.d.e.f.g/1.html URL'si için müşteri bunları deneyecektir 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/

http://1.2.3.4/1/ URL'si için müşteri bunları deneyecektir strings:

1.2.3.4/1/
1.2.3.4/

Karma hesaplamaları

Sonek/önek ifadeleri kümesi oluşturulduktan sonraki adım, tam uzunlukta SHA256 karması kullanın. Doğrulamak için kullanabileceğiniz bir birim testi (sahte-C'de) karma hesaplamaları aşağıda verilmiştir.

FIPS-180-2'den örnekler:

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]);

Karma önek hesaplamaları

Son olarak, istemcinin her tam uzunluktaki SHA256 karması için karma ön ekini hesaplaması gerekir. Kasa İçin Karma ön eki, SHA256 karmasının 4-32 baytlık en önemli kısmından oluşur.

Şu kaynaktan örnekler: FIPS-180-2:

  • FIPS-180-2'den örnek B1
    • Giriş "abc".
    • SHA256 özeti: ba7816bf 8f01cfea 414140de 5dae2223 b00361a3 96177a9c b410ff61 f20015ad.
    • 32 bit karma öneki ba7816bf'dir.
  • FIPS-180-2'deki B2 örneği
    • Giriş (şimdiki değeri) "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq".
    • SHA256 özeti: 248d6a61 d20638b8 e5c02693 0c3e6039 a33ce459 64ff2167 f6ecedd4 19db06c1.
    • 48 bit karma öneki 248d6a61 d206'dır.