رمزگذاری URL (رمزگذاری درصدی) چیست؟
پاسخ کوتاه: رمزگذاری URL سازوکاری است برای ترجمه نویسههایی که در URL وب معنی خاص دارند (مثل فاصله، امپرسند و علامت مساوی) به قالبی پذیرفته جهانی: علامت درصد (%) و دو رقم هگزادسیمال.
معماری اینترنت لازم میدارد نشانی منبع یکنواخت (URL) روی HTTP با مجموعه نویسه استاندارد US-ASCII منتقل شود. اگر URL نویسهای خارج از این الفبای سخت داشته باشد — مثل فاصله، ایموجی یا متن سیریلیک — مرورگر یا سرور مسیر را خراب تفسیر میکند یا از کار میافتد.
برای انتقال امن داده پیچیده در رشته پرسوجوی URL باید رمزگذاری URL (اغلب رمزگذاری درصدی) اعمال شود. این الگوریتم نویسه ناامن را به نماد % و نمایش هگزادسیمال مقدار ASCII/UTF-8 نویسه تبدیل میکند.
مثلاً فاصله معمولی میشود %20 و امپرسند (&) میشود %26. این تضمین میکند داده سالم به سرور بکاند برسد.
چرا فرق encodeURI() و encodeURIComponent() مهم است
پاسخ کوتاه: encodeURI() برای رمزگذاری URL کامل بدون شکستن ساختار هسته (مثل http://) است. encodeURIComponent() برای رمزگذاری پارامتر داده مشخص (مثل عبارت جستجو) است چون اسلش و علامت مساوی را هم تهاجمی رمز میکند.
یک باگ پرتکرار در توسعه وب JavaScript استفاده از تابع رمزگذاری URL نادرست است. فهم این فرق برای جلوگیری از خطای ۴۰۴ و درخواست API شکسته حیاتی است.
- encodeURI(): فرض میکند یک URL کامل و معتبر میدهید. فاصله و نویسه خارجی را رمز میکند، اما نویسههایی که معنی ساختاری در URL دارند را رمز نمیکند، مثل
?، =، &، / یا :.
- encodeURIComponent(): فرض میکند یک تکه داده مشخص را رمز میکنید تا داخل رشته پرسوجوی URL بگذارید. تقریباً همهچیز از جمله اسلش و امپرسند را تهاجمی رمز میکند. وقتی ورودی کاربر را بهعنوان پارامتر URL میچسبانید باید از این تابع استفاده کنید.
رمزگذار URL در Utiliome سختگیرانه از معنای encodeURIComponent() استفاده میکند تا گریز بار توسعهدهنده حداکثر امن باشد.
ریسک حریم خصوصی رمزگشایی URL آنلاین
پاسخ کوتاه: بسیاری از URLها توکن احراز هویت، هش بازنشانی رمز یا ایمیل مشتری را در پارامتر پرسوجو دارند. چسباندن آنها در رمزگشای ابری داده را در لاگ سرور لو میدهد. Utiliome همهچیز را صددرصد محلی پردازش میکند.
توسعهدهندگان مرتب باید رشته URL درهم را رمزگشایی کنند تا تغییرمسیر OAuth یا بار Webhook را اشکالزدایی کنند (مثلاً ?email=user%40example.com&token=abc%3D%3D).
اگر این رشته را در ابزار SEO آنلاین عمومی بچسبانید، URL از راه درخواست HTTP POST به سرور راه دور میرود. مدیر سرور بهراحتی میتواند توکن OAuth، شناسه نشست و اطلاعات قابل شناسایی شخص (PII) را لاگ کند.
Utiliome با معماری اعتماد صفر و محلیمحور کار میکند. ریاضی رمزگشایی کاملاً در RAM محلی مرورگر اجرا میشود. میتوانید کلید API تولید را امن رمزگشایی کنید و بدانید داده به شبکه خارجی نمیرسد.
مدیریت ایموجی و Unicode در URL
پاسخ کوتاه: الگوریتم مدرن رمزگذاری URL از نویسه چندبایتی Unicode بینقص پشتیبانی میکند. وقتی ایموجی مثل 🚀 را رمز میکنید، اول به نمایش بایت UTF-8 نگاشت میشود و بعد هر بایت جداگانه درصدی رمز میشود.
در روزهای اول اینترنت، URL فقط ASCII انگلیسی بود. امروز URL اغلب زبان جهانی، خط عربی و ایموجی پیچیده دارد.
استاندارد مدرن رمزگذاری URL (RFC 3986) حکم میکند نویسه خارجی اول به دنباله بایت UTF-8 تبدیل شود. سپس هر یک از آن بایتها درصدی رمز میشود.
مثلاً ایموجی موشک (🚀) در UTF-8 چهار بایت میخواهد. وقتی از رمزگذار URL در Utiliome عبور میکند، ریاضی به %F0%9F%9A%80 تبدیل میشود. این تضمین میکند هر سرور بکاند، فارغ از معماری زبان اصلی، بتواند ایموجی را امن مسیریابی و رمزگشایی کند.
نویسههای رزروشده در برابر رزرو نشده
پاسخ کوتاه: استاندارد URL نویسه «رزرو نشده» (حرف، عدد، خط تیره، نقطه) را تعریف میکند که هرگز نیاز به رمزگذاری ندارد. نویسه «رزروشده» (مثل ?، = و &) فرمان ساختاری است و اگر بهعنوان داده خام استفاده شود باید تهاجمی رمز شود.
برای تسلط بر رمزگذاری URL، توسعهدهنده باید دستهبندی نویسه در مشخصات RFC 3986 را بفهمد.
- نویسه رزرو نشده:
A-Z، a-z، 0-9، -، _، . و ~. این نویسهها ذاتاً امناند. رمزگذار URL آنها را نادیده میگیرد و دستنخورده میگذارد.
- نویسه رزروشده:
! * ' ( ) ; : @ & = + $ , / ? # [ ]. این نویسهها «نحو» اینترنتاند. مثلاً نماد & متغیرها را جدا میکند. اگر داده واقعی متغیر امپرسند داشته باشد (مثلاً «M&M Candy»)، باید آن را به %26 رمز کنید تا سرور داده را نصف نکند.
چرا فاصله هم %20 است و هم نماد جمع (+)
پاسخ کوتاه: از نظر تاریخی فاصله در داده فرم بهصورت جمع (+) رمز میشد، در حالی که فاصله در URL استاندارد بهصورت %20 رمز میشد. APIهای مدرن JavaScript روی %20 استاندارد شدهاند تا سردرگمی کم شود و سازگاری چندسکویی بماند.
نقطه سردرگمی رایج این است که چرا فاصله گاهی %20 و گاهی نماد + رمز میشود.
این از معماری قدیمی اینترنت میآید. مشخصات application/x-www-form-urlencoded (وقتی فرم HTML ارسال میشود) تاریخی حکم میکرد فاصله برای صرفهجویی پهنای باند به نماد جمع تبدیل شود.
اما در مسیر استاندارد URL و رشته پرسوجوی API مدرن، فاصله باید سختگیرانه به %20 رمز درصدی شود. Utiliome روی مشخصات مدرن encodeURIComponent() استاندارد شده تا فاصله امن به %20 تبدیل شود و خطای رمزگشایی سمت سرور در APIهای REST مدرن پیش نیاید.