URLs and Hashing

इस सेक्शन में, क्लाइंट के यूआरएल की जांच करने के तरीके के बारे में पूरी जानकारी दी गई है.

यूआरएल के कैननिकल होने की जांच करना

किसी भी यूआरएल की जांच करने से पहले, क्लाइंट को उस यूआरएल पर कुछ कैननिकलाइज़ेशन करने की उम्मीद की जाती है.

शुरुआत में, हम यह मानते हैं कि क्लाइंट ने यूआरएल को पार्स कर लिया है और आरएफ़सी 2396 के मुताबिक उसे मान्य बना दिया है. अगर यूआरएल में अंतरराष्ट्रीय डोमेन नेम (आईडीएन) का इस्तेमाल किया गया है, तो क्लाइंट को यूआरएल को ASCII प्यूनीकोड में बदलना चाहिए. यूआरएल में पाथ कॉम्पोनेंट शामिल होना चाहिए. इसका मतलब है कि डोमेन के बाद कम से कम एक स्लैश (http://google.com के बजाय http://google.com/) होना चाहिए.

सबसे पहले, यूआरएल से टैब (0x09), सीआर (0x0d), और एलएफ़ (0x0a) वर्ण हटाएं. इन वर्णों (जैसे, %0a) के लिए एस्केप सीक्वेंस न हटाएं.

दूसरा, अगर यूआरएल किसी फ़्रैगमेंट पर खत्म होता है, तो फ़्रैगमेंट हटाएं. उदाहरण के लिए, http://google.com/#frag को http://google.com/ में बदलें.

तीसरा, यूआरएल को बार-बार प्रतिशत से अनएस्केप करें, जब तक कि उसमें प्रतिशत से अनएस्केप करने की कोई ज़रूरत न हो. (इससे यूआरएल अमान्य हो सकता है.)

होस्टनेम को कैननिकल बनाने के लिए:

यूआरएल से होस्टनेम निकालें. इसके बाद:

  1. शुरुआत और आखिर में मौजूद सभी बिंदु हटाएं.
  2. एक के बाद एक लगाए गए बिंदुओं को एक बिंदु से बदलें.
  3. अगर होस्टनेम को आईपीवी4 पते के तौर पर पार्स किया जा सकता है, तो उसे बिंदु से अलग की गई चार दशमलव वैल्यू में बदलें. क्लाइंट को किसी भी कानूनी आईपी पते को कोड में बदलने की सुविधा देनी चाहिए. इसमें ऑक्टल, हेक्स, और चार से कम कॉम्पोनेंट शामिल हैं.
  4. अगर होस्टनेम को ब्रैकेट वाले आईपीवी6 पते के तौर पर पार्स किया जा सकता है, तो कॉम्पोनेंट में शुरुआती ज़रूरत से ज़्यादा शून्य हटाकर और डबल-कोलन सिंटैक्स का इस्तेमाल करके शून्य कॉम्पोनेंट को छोटा करके, इसे सामान्य बनाएं. उदाहरण के लिए, [2001:0db8:0000::1] को [2001:db8::1] में बदला जाना चाहिए. अगर होस्टनेम, यहां दिए गए दो खास IPv6 पतों में से कोई एक है, तो उसे IPv4 में बदलें:
    • IPv4 से मैप किया गया IPv6 पता, जैसे कि [::ffff:1.2.3.4], जिसे 1.2.3.4 में बदलना है;
    • [64:ff9b::1.2.3.4] जैसा NAT64 पता, जो प्रसिद्ध प्रीफ़िक्स 64:ff9b::/96 का इस्तेमाल करता है. इसे 1.2.3.4 में बदला जाना चाहिए.
  5. पूरी स्ट्रिंग को छोटे अक्षरों में बदलें.

पाथ को कैननिकल बनाने के लिए:

  1. पाथ में /../ और /./ के क्रम को ठीक करने के लिए, /./ को / से बदलें. साथ ही, पाथ के पिछले कॉम्पोनेंट के साथ /../ को हटाएं.
  2. एक के बाद एक आने वाले स्लैश को एक स्लैश वर्ण से बदलें.

क्वेरी पैरामीटर पर, पाथ को कैननिकल बनाने की ये सुविधाएं लागू न करें.

यूआरएल में, ऐसे सभी वर्णों को प्रतिशत-एस्केप करें जो ASCII 32 से कम, 127 से ज़्यादा, # या % हों. एस्केप में अपरकेस हेक्स वर्ण इस्तेमाल किए जाने चाहिए.

होस्ट-सफ़िक्स पाथ-प्रीफ़िक्स एक्सप्रेशन

यूआरएल को कैननिकल बनाने के बाद, अगला चरण सफ़िक्स/प्रीफ़िक्स एक्सप्रेशन बनाना है. हर सफ़िक्स/प्रीफ़िक्स एक्सप्रेशन में, होस्ट सफ़िक्स (या पूरा होस्ट) और पाथ प्रीफ़िक्स (या पूरा पाथ) होता है.

क्लाइंट, होस्ट के 30 अलग-अलग संभावित सफ़िक्स और पाथ के प्रीफ़िक्स कॉम्बिनेशन बना देगा. ये कॉम्बिनेशन, यूआरएल के सिर्फ़ होस्ट और पाथ कॉम्पोनेंट का इस्तेमाल करते हैं. स्कीम, उपयोगकर्ता नाम, पासवर्ड, और पोर्ट को खारिज कर दिया जाता है. अगर यूआरएल में क्वेरी पैरामीटर शामिल हैं, तो कम से कम एक कॉम्बिनेशन में पूरा पाथ और क्वेरी पैरामीटर शामिल होंगे.

होस्ट के लिए, क्लाइंट ज़्यादा से ज़्यादा पांच अलग-अलग स्ट्रिंग आज़माएगा. कैंपेन के तीनों सब-टाइप के नाम ये रहे:

  • अगर होस्टनेम, IPv4 या IPv6 लिटरल नहीं है, तो eTLD+1 डोमेन से शुरू करके, लीडिंग कॉम्पोनेंट को जोड़कर, ज़्यादा से ज़्यादा चार होस्टनेम बनाए जा सकते हैं. ईटीएलडी+1 का पता लगाने के लिए, सार्वजनिक सफ़िक्स सूची का इस्तेमाल किया जाना चाहिए. उदाहरण के लिए, a.b.example.com से example.com का eTLD+1 डोमेन और एक और होस्ट कॉम्पोनेंट b.example.com वाला होस्ट बनेगा.
  • यूआरएल में मौजूद सटीक होस्टनेम. पिछले उदाहरण के मुताबिक, a.b.example.com की जांच की जाएगी.

पाथ के लिए, क्लाइंट ज़्यादा से ज़्यादा छह अलग-अलग स्ट्रिंग आज़माएगा. कैंपेन के तीनों सब-टाइप के नाम ये रहे:

  • यूआरएल का सटीक पाथ, जिसमें क्वेरी पैरामीटर भी शामिल हैं.
  • क्वेरी पैरामीटर के बिना, यूआरएल का सटीक पाथ.
  • रूट (/) से शुरू करके, पाथ के कॉम्पोनेंट को क्रम से जोड़कर बनाए गए चार पाथ. इनमें आखिर में स्लैश भी शामिल है.

यहां दिए गए उदाहरणों से, जांच के तरीके के बारे में पता चलता है:

यूआरएल http://a.b.com/1/2.html?param=1 के लिए, क्लाइंट इन संभावित स्ट्रिंग को आज़माएगा:

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

यूआरएल http://a.b.c.d.e.f.com/1.html के लिए, क्लाइंट इन संभावित स्ट्रिंग को आज़माएगा:

a.b.c.d.e.f.com/1.html
a.b.c.d.e.f.com/
c.d.e.f.com/1.html
c.d.e.f.com/
d.e.f.com/1.html
d.e.f.com/
e.f.com/1.html
e.f.com/
f.com/1.html
f.com/

(ध्यान दें: b.c.d.e.f.com को छोड़ दें, क्योंकि हम सिर्फ़ होस्टनेम के आखिरी पांच कॉम्पोनेंट और पूरा होस्टनेम ही लेंगे.)

यूआरएल http://1.2.3.4/1/ के लिए, क्लाइंट इन संभावित स्ट्रिंग को आज़माएगा:

1.2.3.4/1/
1.2.3.4/

यूआरएल http://example.co.uk/1 के लिए, क्लाइंट इन संभावित स्ट्रिंग को आज़माएगा:

example.co.uk/1
example.co.uk/

हैशिंग

Google सुरक्षित ब्राउज़िंग, हैश फ़ंक्शन के तौर पर सिर्फ़ SHA256 का इस्तेमाल करती है. इस हैश फ़ंक्शन को ऊपर दिए गए एक्सप्रेशन पर लागू किया जाना चाहिए.

32 बाइट का पूरा हैश, परिस्थितियों के हिसाब से 4 बाइट, 8 बाइट या 16 बाइट में काटा जाएगा:

  • hashes.search method का इस्तेमाल करते समय, फ़िलहाल हमें अनुरोध में मौजूद हैश को सिर्फ़ चार बाइट तक काटना होगा. इस अनुरोध में अतिरिक्त बाइट भेजने से, उपयोगकर्ता की निजता को खतरा होगा.

  • hashList.get method या hashLists.batchGet method का इस्तेमाल करके, लोकल डेटाबेस की सूचियां डाउनलोड करते समय, सर्वर से भेजे गए हैश की लंबाई को सूचियों के नाम रखने के उस तरीके में एन्कोड किया जाता है जिसमें हैश की लंबाई बताने वाला सफ़िक्स होता है. ज़्यादा जानकारी के लिए, उपलब्ध सूचियां सेक्शन देखें.