מהו קידוד URL (Percent-Encoding)?
תשובה קצרה: קידוד URL מתרגם תווים עם משמעות מיוחדת בכתובת (רווח, & ו-=) לפורמט מוסכם: סימן אחוז (%) ושתי ספרות הקסדצימליות.
ארכיטקטורת האינטרנט דורשת שכתובות URL יועברו ב-HTTP בערכת US-ASCII. אם הכתובת כוללת תווים מחוץ לאלפבית הזה — רווחים, אימוג'י או טקסט בעברית — הדפדפן או השרת עלולים לשבור את הנתיב או לפרש אותו לא נכון.
כדי להעביר נתונים מורכבים במחרוזת שאילתה משתמשים ב-קידוד URL (percent-encoding). האלגוריתם הופך תו לא בטוח לסימן % ואחריו ייצוג הקסדצימלי של ערך ה-ASCII או ה-UTF-8.
למשל, רווח הופך ל-%20, וסימן & (&) הופך ל-%26. כך הנתונים מגיעים לשרת בשלמות.
למה חשוב ההבדל בין encodeURI ל-encodeURIComponent
תשובה קצרה: encodeURI מקודד כתובת מלאה בלי לשבור את המבנה (כמו http://). encodeURIComponent מקודד פרמטר נתון, כולל לוכסנים וסימני שוויון.
באג נפוץ ב-JavaScript הוא שימוש בפונקציית קידוד URL הלא נכונה. ההבדל קובע אם תקבלו 404 או בקשת API שבורה.
- encodeURI(): מניח שמעבירים URL שלם ותקין. הוא מקודד רווחים ותווים זרים, אבל לא מקודד תווים מבניים כמו
?, =, &, / או :.
- encodeURIComponent(): מניח שמקודדים נתון ספציפי כדי להכניס אותו לתוך מחרוזת שאילתה. הוא מקודד כמעט הכול, כולל לוכסנים וסימני &. זו הפונקציה הנכונה כשלוקחים קלט משתמש ומוסיפים אותו כפרמטר.
מקודד ה-URL של Utiliome משתמש במשמעות של encodeURIComponent() כדי להבריח מטענים של מפתחים בצורה הבטוחה ביותר.
סיכון הפרטיות בפענוח URL אונליין
תשובה קצרה: הרבה כתובות כוללות טוקן אימות, גיבוב לאיפוס סיסמה או מייל בשאילתה. הדבקה במפענח בענן חושפת את הנתונים ללוג שרת. Utiliome מעבד הכול מקומית.
מפתחים מפענחים כתובות מבולגנות כדי לנפות הפניות OAuth או מטעני Webhook (למשל ?email=user%40example.com&token=abc%3D%3D).
אם מדביקים את המחרוזת לכלי SEO גנרי, ה-URL נשלח ב-HTTP POST לשרת מרוחק. מנהל השרת יכול לרשום טוקני OAuth, מזהי סשן ומידע מזהה (PII).
Utiliome עובד במודל מקומי. מתמטיקת הפענוח רצה בזיכרון הדפדפן. אפשר לפענח מפתחות API של פרודקשן בידיעה שהנתונים לא יוצאים לרשת חיצונית.
אימוג'י ו-Unicode בתוך URL
תשובה קצרה: קידוד URL מודרני תומך בתווי Unicode רב-ביתיים. אימוג'י כמו 🚀 ממופה קודם לבתים של UTF-8, וכל בית מקודד באחוזים.
בראשית האינטרנט כתובות URL היו ASCII אנגלי בלבד. היום יש בהן שפות, כתב עברי ואימוג'י.
תקן RFC 3986 מחייב להמיר תו זר לרצף בתים של UTF-8, ואז לקודד כל בית באחוזים.
אימוג'י הרקטה (🚀) תופס ארבעה בתים ב-UTF-8. במקודד של Utiliome הוא הופך ל-%F0%9F%9A%80. כל שרת, בלי קשר לשפת הבסיס שלו, יכול לנתב ולפענח את האימוג'י בבטחה.
תווים שמורים מול תווים לא שמורים
תשובה קצרה: התקן מגדיר תווים לא שמורים (אותיות, ספרות, מקף, נקודה) שלא צריך לקודד. תווים שמורים (?, =, &) הם פקודות מבנה, וחובה לקודד אותם אם הם חלק מהנתון עצמו.
כדי לשלוט בקידוד URL צריך את הסיווג של RFC 3986.
- תווים לא שמורים:
A-Z, a-z, 0-9, -, _, . ו-~. הם בטוחים מטבעם. המקודד משאיר אותם כמו שהם.
- תווים שמורים:
! * ' ( ) ; : @ & = + $ , / ? # [ ]. אלה התחביר של האינטרנט. למשל & מפריד משתנים. אם הנתון עצמו כולל & (למשל "M&M Candy"), מקודדים ל-%26 כדי שהשרת לא יחצה את הערך לשניים.
למה רווח הוא גם %20 וגם פלוס (+)
תשובה קצרה: היסטורית, רווח בנתוני טופס קודד כפלוס (+), ורווח ב-URL רגיל כ-%20. ממשקי JavaScript מודרניים מתקננים על %20 כדי למנוע בלבול.
בלבול נפוץ: למה רווח מקודד פעם כ-%20 ופעם כ-+.
זה שריד לארכיטקטורה ישנה. המפרט application/x-www-form-urlencoded (שליחת טפסי HTML) קבע שרווח יהפוך לפלוס כדי לחסוך רוחב פס.
בנתיבי URL ובמחרוזות שאילתה של API מודרני, רווח חייב להיות %20. Utiliome עומד במפרט המודרני של encodeURIComponent(), כך שרווחים הופכים ל-%20 ומונעים שגיאות פענוח ב-REST API.