Whiz Tools

מקודד מחרוזות URL

כלי בריחת מחרוזות URL

מבוא

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

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

הבנת קידוד URL

מהו קידוד URL?

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

לדוגמה, תו הרווח ' ' מוחלף ב%20.

מדוע קידוד URL הכרחי?

כתובות URL יכולות להישלח על פני האינטרנט באמצעות קבוצת התווים ASCII בלבד. מכיוון שכתובות URL מכילות לעיתים תווים מחוץ לקבוצה זו, יש להמיר אותן לפורמט ASCII תקף. קידוד URL מבטיח שתווים מיוחדים לא יגרמו להשפעות בלתי רצויות או שגיאות בבקשות אינטרנט.

תווים שצריך לקודד

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

  • מפרידים כלליים: :, /, ?, #, [, ], @
  • מפרידים תת: !, $, &, ', (, ), *, +, ,, ;, =

בנוסף, כל תו שאינו ASCII, כולל תווים ב-Unicode, חייב להיות מקודד.

כיצד קידוד URL עובד?

תהליך הקידוד

  1. זיהוי תווים מיוחדים: ניתוח מחרוזת ה-URL וזיהוי תווים שאינם תווים ASCII לא שמורים (אותיות, ספרות, -, ., _, ~).

  2. המרה לקוד ASCII: עבור כל תו מיוחד, השג את נקודת הקוד ASCII או Unicode שלו.

  3. המרה לרצף בייטים UTF-8 (אם יש צורך): עבור תווים שאינם ASCII, קודד את התו לבייט אחד או יותר באמצעות קידוד UTF-8.

  4. המרה להקסדצימל: המרת כל בייט להקוד ההקסדצימלי שלו.

  5. הוספת סימן האחוז: הוספת סימן % לפני כל בייט הקסדצימלי.

דוגמת קידוד

  • תו: ' ' (רווח)

    • קוד ASCII: 32
    • הקוד ההקסדצימלי: 20
    • קידוד URL: %20
  • תו: 'é'

    • קידוד UTF-8: 0xC3 0xA9
    • קידוד URL: %C3%A9

מקרים קצה שיש לקחת בחשבון

  • תווים ב-Unicode: תווים שאינם ASCII חייבים להיות מקודדים ב-UTF-8 ולאחר מכן מקודדים באחוזים.

  • סימני אחוז שכבר מקודדים: סימני אחוז שהם חלק מקידודי אחוזים לא צריכים להיות מקודדים מחדש.

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

פענוח URL

מהו פענוח URL?

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

תהליך הפענוח

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

  2. המרת ההקסדצימל לבייטים: תרגם כל ערך הקסדצימלי לבייט המתאים לו.

  3. פענוח בייטים UTF-8 (אם יש צורך): עבור רצפים מרובי בייטים, שלב את הבייטים ופענח אותם באמצעות קידוד UTF-8 כדי להשיג את התו המקורי.

  4. החלפת רצפים מקודדים: החלף את הרצפים המקודדים באחוזים בתווים הפענוחים.

דוגמת פענוח

  • מקודד: hello%20world

    • %20 מתורגם לרווח ' '
    • מפוענח: hello world
  • מקודד: J%C3%BCrgen

    • %C3%A4 מתורגם ל'ü' ב-UTF-8
    • מפוענח: Jürgen

חשיבות הפענוח URL

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

שימושים

פיתוח אינטרנט

  • פרמטרי שאילתות: קידוד קלט משתמש בפרמטרי שאילתות כדי למנוע שגיאות או פגיעות אבטחה.

  • פרמטרי נתיב: הכללת נתונים דינמיים בנתיבי URL בבטחה.

העברת נתונים

  • API ושירותי אינטרנט: הבטחת שהנתונים שנשלחים ל-APIs מעוצבים כראוי.

  • בינלאומיות: תמיכה בכתובות URL עם תווים משפות שונות.

אבטחה

  • מניעת התקפות הזרקה: קידוד קלטים כדי להקל על הסיכון של התקפות XSS והתקפות הזרקה אחרות.

חלופות

בעוד שקידוד URL הוא חיוני, ישנם תרחישים שבהם שיטות קידוד אחרות עשויות להיות מתאימות יותר:

  • קידוד Base64: משמש לקידוד נתונים בינאריים בתוך כתובות URL או כאשר נדרשת צפיפות מידע גבוהה יותר.

  • קידוד UTF-8 ללא קידוד באחוזים: חלק מהמערכות משתמשות בקידוד UTF-8 ישירות, אך זה יכול להוביל לבעיות אם לא מטופל כראוי.

שקול את הפרטים של היישום שלך כדי לבחור את שיטת הקידוד המתאימה ביותר.

היסטוריה

קידוד URL הוצג עם המפרטים המוקדמים של כתובת ה-URL וסטנדרטי ה-URI (מזהה משאבים אחידים) בשנות ה-90. הצורך בדרך עקבית לקודד תווים מיוחדים עלה מהמערכות המגוונות ומערכות התווים שנעשה בהן שימוש ברחבי העולם.

אבני דרך מרכזיות כוללות:

  • RFC 1738 (1994): הגדרת כתובות URL והצגת קידוד באחוזים.

  • RFC 3986 (2005): עדכון תחביר ה-URI, שיפור הכללים לקידוד.

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

דוגמאות קוד

הנה דוגמאות כיצד לבצע קידוד URL בשפות תכנות שונות:

' דוגמת Excel VBA
Function URLEncode(ByVal Text As String) As String
    Dim i As Integer
    Dim CharCode As Integer
    Dim Char As String
    Dim EncodedText As String

    For i = 1 To Len(Text)
        Char = Mid(Text, i, 1)
        CharCode = AscW(Char)
        Select Case CharCode
            Case 48 To 57, 65 To 90, 97 To 122, 45, 46, 95, 126 ' 0-9, A-Z, a-z, -, ., _, ~
                EncodedText = EncodedText & Char
            Case Else
                If CharCode < 0 Then
                    ' טיפול בתווים ב-Unicode
                    EncodedText = EncodedText & "%" & Hex(65536 + CharCode)
                Else
                    EncodedText = EncodedText & "%" & Right("0" & Hex(CharCode), 2)
                End If
        End Select
    Next i
    URLEncode = EncodedText
End Function

' שימוש:
' =URLEncode("https://example.com/?name=Jürgen")
% דוגמת MATLAB
function encodedURL = urlEncode(url)
    import java.net.URLEncoder
    encodedURL = char(URLEncoder.encode(url, 'UTF-8'));
end

% שימוש:
% encodedURL = urlEncode('https://example.com/?name=Jürgen');
## דוגמת Ruby
require 'uri'

url = 'https://example.com/path?query=hello world&name=Jürgen'
encoded_url = URI::DEFAULT_PARSER.escape(url)
puts encoded_url
## פלט: https://example.com/path?query=hello%20world&name=J%C3%BCrgen
// דוגמת Rust
use url::form_urlencoded;

fn main() {
    let url = "https://example.com/path?query=hello world&name=Jürgen";
    let encoded_url = percent_encode(url);
    println!("{}", encoded_url);
    // פלט: https://example.com/path%3Fquery%3Dhello%20world%26name%3DJ%C3%BCrgen
}

fn percent_encode(input: &str) -> String {
    use percent_encoding::{utf8_percent_encode, NON_ALPHANUMERIC};
    utf8_percent_encode(input, NON_ALPHANUMERIC).to_string()
}
## דוגמת Python
import urllib.parse

url = 'https://example.com/path?query=hello world&name=Jürgen'
encoded_url = urllib.parse.quote(url, safe=':/?&=')
print(encoded_url)
## פלט: https://example.com/path?query=hello%20world&name=J%C3%BCrgen
// דוגמת JavaScript
const url = 'https://example.com/path?query=hello world&name=Jürgen';
const encodedURL = encodeURI(url);
console.log(encodedURL);
// פלט: https://example.com/path?query=hello%20world&name=J%C3%BCrgen
// דוגמת Java
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;

public class URLEncodeExample {
    public static void main(String[] args) throws Exception {
        String url = "https://example.com/path?query=hello world&name=Jürgen";
        String encodedURL = URLEncoder.encode(url, StandardCharsets.UTF_8.toString());
        // החלף "+" ב"%20" עבור רווחים
        encodedURL = encodedURL.replace("+", "%20");
        System.out.println(encodedURL);
        // פלט: https%3A%2F%2Fexample.com%2Fpath%3Fquery%3Dhello%20world%26name%3DJ%C3%BCrgen
    }
}
// דוגמת C#
using System;
using System.Net;

class Program
{
    static void Main()
    {
        string url = "https://example.com/path?query=hello world&name=Jürgen";
        string encodedURL = Uri.EscapeUriString(url);
        Console.WriteLine(encodedURL);
        // פלט: https://example.com/path?query=hello%20world&name=J%C3%BCrgen
    }
}
<?php
// דוגמת PHP
$url = 'https://example.com/path?query=hello world&name=Jürgen';
$encodedURL = urlencode($url);
echo $encodedURL;
// פלט: https%3A%2F%2Fexample.com%2Fpath%3Fquery%3Dhello+world%26name%3DJ%C3%BCrgen
?>
// דוגמת Go
package main

import (
    "fmt"
    "net/url"
)

func main() {
    urlStr := "https://example.com/path?query=hello world&name=Jürgen"
    encodedURL := url.QueryEscape(urlStr)
    fmt.Println(encodedURL)
    // פלט: https%3A%2F%2Fexample.com%2Fpath%3Fquery%3Dhello+world%26name%3DJ%25C3%25BCrgen
}
// דוגמת Swift
import Foundation

let url = "https://example.com/path?query=hello world&name=Jürgen"
if let encodedURL = url.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed) {
    print(encodedURL)
    // פלט: https://example.com/path?query=hello%20world&name=J%C3%BCrgen
}
## דוגמת R
url <- "https://example.com/path?query=hello world&name=Jürgen"
encodedURL <- URLencode(url, reserved = TRUE)
print(encodedURL)
## פלט: https://example.com/path?query=hello%20world&name=J%C3%BCrgen

הערה: הפלט עשוי להשתנות במעט בהתאם לאופן שבו כל שפה מטפלת בתווים שמורים ורווחים (למשל, קידוד רווחים כ%20 או +).

דיאגרמת SVG של תהליך קידוד URL

תהליך קידוד URL כתובת URL מקורית זיהוי תווים מיוחדים קידוד URL דוגמה: קלט: https://example.com/über uns פלט: https://example.com/%C3%BCber%20uns

שיקולי אבטחה

קידוד ופענוח URL נכונים הם קריטיים לאבטחה:

  • מניעת התקפות הזרקה: קידוד קלט משתמש עוזר למנוע הרצת קוד זדוני, מה שמפחית את הסיכונים כמו XSS והתקפות הזרקה SQL.

  • שלמות נתונים: מבטיח שהנתונים מועברים ללא שינוי או עיוות.

  • עמידה בסטנדרטים: שמירה על סטנדרטי קידוד נמנעת מבעיות של אינטראופרביליות בין מערכות.

מקורות

  1. RFC 3986 - מזהה משאב אחיד (URI): https://tools.ietf.org/html/rfc3986
  2. מהו קידוד URL וכיצד הוא עובד? https://www.urlencoder.io/learn/
  3. קידוד באחוזים: https://he.wikipedia.org/wiki/%D7%A7%D7%99%D7%93%D7%95%D7%A0%D7%99%D7%9D_%D7%91%D7%90%D7%97%D7%95%D7%96
  4. סטנדרט URL: https://url.spec.whatwg.org/
  5. URI.escape הוא מיושן: https://stackoverflow.com/questions/2824126/why-is-uri-escape-deprecated

סיכום

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

משוב