URL'ler ve Karma Oluşturma

Bu belge şu 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 (Liste İçerikleri bölümüne bakın). Bir URL'yi Güvenli Tarama listesiyle (yerel olarak veya sunucuda) kontrol etmek için istemcilerin öncelikle söz konusu URL'nin karma önekini hesaplaması gerekir.

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

  1. URL'yi standart hale getirin (Standartlaştırma bölümüne bakın).
  2. URL için son ek/önek ifadeleri oluşturun (Sonek/Önek İfadeleri bölümüne bakın).
  3. Her son ek/önek ifadesi için tam uzunluktaki karmayı hesaplayın (Karma Hesaplamaları bölümüne bakın).
  4. Her tam uzunluktaki karma için karma ön ekini hesaplayın (Karma Ön Ek Hesaplamaları bölümüne bakın).

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 varsayıyoruz. URL, uluslararasılaştırılmış bir alan adı (IDN) kullanıyorsa istemci, URL'yi ASCII Punycode temsiline dönüştürmelidir. URL bir yol bileşeni içermelidir. Yani, sonunda bir eğik çizgi ("http://google.com/") olmalıdır.

Önce sekme (0x09), CR (0x0d) ve LF (0x0a) karakterlerini URL'den kaldırın. Bu karakterler için kaçış dizilerini kaldırmayın (ör. "%0a").

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

Üçüncü olarak, artık çıkış yüzdesi kalmayana kadar URL'nin çıkışını tekrar tekrar yüzde olarak kaldırın.

Ana makine adını standartlaştırmak için:

URL'den ana makine adını çı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 4 noktayla ayrılmış ondalık değere normalleştirin. İstemci; sekizlik, 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. "/./" kısmını "/" ile değiştirerek ve önceki yol bileşeniyle birlikte "/../" ifadesini kaldırarak yoldaki "/../" ve "/./" dizilerini çözümleyin.
  2. Ardışık 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 <= ASCII 32, >= 127, "#" veya "%" karakterlerine sahip tüm karakterlerde yüzde kaçına kaçış karakterleri kullanılabilir. Çıkış seçeneklerinde büyük harf, onaltılık karakterler kullanılmalıdır.

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

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/önek ifadeleri

URL standartlaştırıldıktan sonra, sonraki adım sonek/önek ifadelerini oluşturmaktır. Her son ek/önek ifadesi, bu örneklerde gösterildiği gibi bir ana makine son ekinden (veya tam ana makine) ve bir yol ön ekinden (ya da 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ı ana makine son eki ve yol ön eki kombinasyonu oluşturur. Bu kombinasyonlar URL'nin yalnızca ana makine ve yol bileşenlerini kullanır. Şema, kullanıcı adı, şifre ve bağlantı noktası silinir. 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ı dizeyi dener. Bunlar:

  • URL'deki tam ana makine adı.
  • Son beş bileşenle başlayıp sırasıyla başlıca bileşen kaldırılarak en fazla dört ana makine adı oluşturulur. Üst düzey alan atlanabilir. Ana makine bir IP adresiyse bu ek ana makine adları kontrol edilmemelidir.

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

  • Sorgu parametreleri dahil olmak üzere URL'nin tam yolu.
  • Sorgu parametreleri olmadan URL'nin tam yolu.
  • Kök (/) noktasından başlayıp sonunda eğik çizgi de dahil olmak üzere sırayla yol bileşenlerinin eklenmesiyle oluşturulan dört yol.

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

İstemci, http://a.b.c/1/2.html?param=1 URL'si için şu olası dizeleri dener:

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/

İstemci, http://a.b.c.d.e.f.g/1.html URL'si için şu olası dizeleri dener:

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/

İstemci, http://1.2.3.4/1/ URL'si için şu olası dizeleri dener:

1.2.3.4/1/
1.2.3.4/

Karma hesaplamaları

Sonek/önek ifadeleri grubu oluşturulduktan sonra, sonraki adım her ifade için tam uzunluktaki SHA256 karmasını hesaplamaktır. Karma hesaplamalarınızı doğrulamak için kullanabileceğiniz bir birim testi (sahte-C) aşağıda verilmiştir.

FIPS-180-2 kaynağından ö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 ön eki hesaplamaları

Son olarak, istemcinin her tam uzunluktaki SHA256 karması için karma ön eki hesaplaması gerekir. Güvenli Tarama için karma ön eki, bir SHA256 karmasının en önemli 4 ila 32 baytından oluşur.

FIPS-180-2 kaynağından örnekler:

  • FIPS-180-2 sürümünden örnek B1
    • Giriş: "abc".
    • SHA256 özeti: ba7816bf 8f01cfea 414140de 5dae2223 b00361a3 96177a9c b410ff61 f20015ad.
    • 32 bitlik karma ön eki ba7816bf'dir.
  • FIPS-180-2 sürümünden örnek B2
    • Giriş: "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq".
    • SHA256 özeti, 248d6a61 d20638b8 e5c02693 0c3e6039 a33ce459 64ff2167 f6ecedd4 19db06c1'dir.
    • 48 bitlik karma ön eki, 248d6a61 d206'dır.