URLs and Hashing

בקטע הזה מפורטות המפרטות של האופן שבו לקוחות בודקים כתובות URL.

יצירת גרסה קנונית של כתובות URL

לפני שבודקים כתובות URL, הלקוח אמור לבצע קנוניזציה מסוימת של כתובת ה-URL הזו.

כדי להתחיל, נניח שהלקוח ניתח את כתובת ה-URL ועשה אותה תקינה בהתאם ל-RFC 2396. אם בכתובת ה-URL נעשה שימוש בשם דומיין בינלאומי (IDN), הלקוח צריך להמיר את כתובת ה-URL לייצוג ASCII Punycode. כתובת ה-URL חייבת לכלול רכיב נתיב. כלומר, חייב להיות בה לפחות קו נטוי אחד אחרי הדומיין (http://google.com/ במקום http://google.com).

קודם מסירים מתווית ה-URL את התווים Tab‏ (0x09), CR‏ (0x0d) ו-LF‏ (0x0a). אין להסיר את רצפי הבריחה של התווים האלה (למשל %0a).

שנית, אם כתובת ה-URL מסתיימת בחלק, צריך להסיר את החלק. לדוגמה, לקצר את השם http://google.com/#frag ל-http://google.com/.

שלישית, מסירים את תווי ה-escape של האחוזים בכתובת ה-URL שוב ושוב עד שלא יהיו יותר תווי escape של אחוזים. (הדבר עלול לגרום לכך שכתובת ה-URL לא תהיה תקינה).

כדי להפוך את שם המארח לקנוני:

מחלצים את שם המארח מכתובת ה-URL ואז:

  1. מסירים את כל הנקודות בתחילת הטקסט ובסופו.
  2. מחליפים נקודות רצופות בנקודה אחת.
  3. אם אפשר לנתח את שם המארח ככתובת IPv4, צריך לנרמל אותו ל-4 ערכים עשרוניים מופרדים בנקודות. הלקוח צריך לטפל בכל קידוד חוקי של כתובת IP, כולל אוקטלי, הקסדצימלי ופחות מארבעה רכיבים.
  4. אם אפשר לנתח את שם המארח ככתובת IPv6 בסוגריים, צריך לתקן אותו על ידי הסרת אפסים מובילים מיותרים ברכיבים וקיבוץ רכיבי אפס באמצעות התחביר של שני הנקודתיים. לדוגמה, צריך להמיר את הערך [2001:0db8:0000::1] לערך [2001:db8::1]. אם שם המארח הוא אחד משני סוגי כתובות ה-IPv6 המיוחדים הבאים, צריך להמיר אותו ל-IPv4:
    • כתובת IPv6 שממופתת ל-IPv4, כמו [::ffff:1.2.3.4], שצריך להפוך ל-1.2.3.4.
    • כתובת NAT64 עם הקידומת המוכרת 64:ff9b::/96, כמו [64:ff9b::1.2.3.4], שצריך להפוך ל-1.2.3.4.
  5. הופכים את כל המחרוזת לאותיות קטנות.

כדי לקבוע את הנתיב כגרסה הרשמית (הקנונית):

  1. פותרים את הרצפים /../ ו-/./ בנתיב על ידי החלפת /./ ב-/ והסרת /../ יחד עם רכיב הנתיב הקודם.
  2. החלפת מחרוזות של קווים נטויים רצופים בתו קו נטוי יחיד.

אין להחיל את יצירת הקנוניות של הנתיבים האלה על פרמטרים של שאילתות.

בכתובת ה-URL, צריך להשתמש בבריחה (escape) של אחוזים לכל התווים שהם <= ASCII 32,‏ >= 127,‏ # או %. צריך להשתמש בתווים בינונייים (escape) של 16 ביט באותיות גדולות.

ביטויים של קידומת נתיב עם סיומת של מארח

אחרי שמבצעים קנוניזציה של כתובת ה-URL, השלב הבא הוא ליצור את הביטויים של הסיומת או התחילית. כל ביטוי של סיומת/תחילית מורכב מסיום של מארח (או מארח מלא) ומתחילית של נתיב (או נתיב מלא).

הלקוח ייצור עד 30 שילובים שונים של סיומת מארח וקידומת נתיב. השילובים האלה כוללים רק את רכיבי המארח והנתיב של כתובת ה-URL. המערכת תתעלם מהסכמה, שם המשתמש, הסיסמה והיציאה. אם כתובת ה-URL כוללת פרמטרים של שאילתה, לפחות שילוב אחד יכלול את הנתיב המלא ואת פרמטרים של השאילתה.

במארחים, הלקוח ינסה עד חמש מחרוזות שונות. סוגי המשנה הם:

  • אם שם המארח הוא לא IPv4 או IPv6 מילולי, עד ארבעה שמות מארחים שנוצרים על ידי התחלה בדומיין eTLD+1 והוספת רכיבים מובילים עוקבים. הקביעה של eTLD+1 צריכה להתבסס על רשימת הסיומות הציבוריות. לדוגמה, a.b.example.com יניב את הדומיין eTLD+1 של example.com, וגם את המארח עם רכיב מארח נוסף אחד, b.example.com.
  • שם המארח המדויק בכתובת ה-URL. בהתאם לדוגמה הקודמת, הערך a.b.example.com ייבדק.

בנתיב, הלקוח ינסה עד שש מחרוזות שונות. סוגי המשנה הם:

  • הנתיב המדויק של כתובת ה-URL, כולל פרמטרים של שאילתה.
  • הנתיב המדויק של כתובת ה-URL, ללא פרמטרים של שאילתה.
  • ארבעת הנתיבים שנוצרים על ידי התחלה ברמה הבסיסית (/) והוספה של רכיבי נתיב ברצף, כולל קו נטוי בסוף.

הדוגמאות הבאות ממחישות את התנהגות הבדיקה:

עבור כתובת ה-URL 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/

עבור כתובת ה-URL 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, כי נשתמש רק בחמישה הרכיבים האחרונים של שם המארח ובשם המארח המלא).

עבור כתובת ה-URL http://1.2.3.4/1/, הלקוח ינסה את המחרוזות האפשריות הבאות:

1.2.3.4/1/
1.2.3.4/

עבור כתובת ה-URL http://example.co.uk/1, הלקוח ינסה את המחרוזות האפשריות הבאות:

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

גיבוב (hashing)

פונקציית הגיבוב (hash) של הגלישה הבטוחה של Google היא SHA256 בלבד. צריך להחיל את פונקציית הגיבוב הזו על הביטויים שלמעלה.

גיבוב המלא באורך 32 בייטים יקוצר ל-4 בייטים, ל-8 בייטים או ל-16 בייטים, בהתאם לנסיבות:

  • כשמשתמשים בשיטת hashes.search, אנחנו דורשים כרגע שהגיבוב בבקשה יהיה קטוץ ל-4 בייטים בדיוק. שליחת בייטים נוספים בבקשה הזו עלולה לפגוע בפרטיות המשתמשים.

  • כשמורידים את הרשימות למסד הנתונים המקומי באמצעות השיטה hashList.get או השיטה hashLists.batchGet, אורך הגיבוב שנשלח מהשרת מקודד במוסכמה למתן שמות לרשימות שמכילות סיומת שמציינת את אורך הגיבוב. פרטים נוספים זמינים בקטע רשימות זמינות.