جهت اطمینان از اینکه فایلها و صفحات سایت شما برای طیف گستردهای از کاربران با دستگاهها و سیستمعاملهای مختلف در دسترس هستند، باید از کاراکترهای معتبر در URL ها استفاده کنید. کاراکترهای ناامن، موجب عدم سازگاری آدرسها با مرورگرهای مختلف، وب سرورها و حتی فایروال اپلیکیشنهای تحت وب میشوند. در این مقاله، آدرسهای نامناسب (Bad Paths)، دلیل استفاده از کاراکترهای معتبر در URL و نحوه کدگذاری صحیح کاراکترها، شرح داده میشود.
تصویر(1)
کاراکترهای معتبر در URL
Uniform Resource Locator یا URL معتبر، رشته ای از کاراکترها است که مکان منابع را در اینترنت یا شبکههای خصوصی (اینترانت) مشخص میکند. در ادامه جزئیات بیشتری در مورد اجزای یک URL ذکر شده است:
- Uniform - بر اساس استاندارد RFC 3986 و بسیاری از مقالات مرتبط با آن تعیین می شود.
- Resource - مانند هر منبع دیگری در سرور، میتواند توسط یک کلاینت متصل به شبکه استفاده شود و ممکن است یک صفحه HTML، یک تصویر یا هر فایل دیگری باشد.
- Location - مکان منبع موردنظر میباشد و معمولاً میتوان آن را به عنوان URI نیز در نظر گرفت که I مخفف Identifier و به معنی "شناسه" است.
یک URL معتبر میتواند شامل اجزای زیر باشد:
- پروتکل هایی مانند http ،https ،ftp و غیره. همچنین ممکن است به صورت یک پورت مانند 443 برای HTTPS، استفاده شود.
- نام دامنه یا آدرس IP، مانند "example.com" یا "111.111.111.111".
- یک مسیر اختیاری، مانند "index.php/" یا "/myftpfolder/".
- یک رشته کوئری اختیاری، مانند "param=value?"
- یک بخش اختیاری، مانند :
#section1
نمونه ای از یک URL معتبر:
https://example.com/index.php?param1=value1
غیر از پروتکل و نام دامنه یا آدرس IP، سایر اجزا ضروری نیستند اما این فرمت باید رعایت شود.
تفاوت بین URL ها، URI ها و Path ها چیست؟
تصویر(2)
تفاوت معنای URL ها، URI ها و Path ها، ممکن است کمی گیج کننده باشد. بنابراین ابتدا به بررسی تفاوت بین آنها پرداخته میشود تا درک مفهوم کاراکترهای معتبر در URL راحت شود.
URL
URL یک نوع خاص از Uniform Resource Identifier یا به اختصار URI است که برای شناسایی مکان یک منبع در اینترنت، به کار گرفته میشود. URL، پروتکل استفاده شده جهت دسترسی به یک منبع و همچنین آدرس آن را در اینترنت، مشخص میکند.
برای مثال، «https://example.net/path/to/exampleresource» یک URL است.
URI
Uniform Resource Identifier یا به اختصار URI، رشتهای از کاراکترها است که نام یا منبعی را در اینترنت مشخص میکند. URI ها را میتوان به دو نوع تقسیم کرد:
- URL ها.
- URN ها (Uniform Resource Names).
URL نوع خاصی از URI میباشد که مکان یک منبع را در اینترنت مشخص میکند. در حالی که URN نوعی از URI است که منبع را تحت نام نمایش میدهد.
چند نمونه از URI به صورت زیر است:
- "mailto:person@example.com" - یک آدرس ایمیل را مشخص میکند.
- "https://example.net" - مکان یک منبع را در اینترنت مشخص خواهد کرد.
- "file://path/to/some/file" - مکان یک فایل را در سیستم شخصی شما نمایش می دهد.
Path
تصویر(3)
Path مجموعهای از دایرکتوریها یا پوشهها است که مکان یک فایل یا منبع را در یک کامپیوتر یا شبکه مشخص میکند. یک Path میتواند مطلق یا نسبی باشد. Path مطلق، یک مسیر کامل است که از دایرکتوری ریشه (root) شروع شده و مکان دقیق فایل یا منبع را مشخص میکند. در حالی که Path نسبی، یک مسیر جزئی است که مکان فایل یا منبع را نسبت به دایرکتوری فعلی، مشخص خواهد کرد.
کاراکترهای ناامن در URL ها
چندین کاراکتر وجود دارند که استفاده از آنها در یک Path (یا URI) ایمن نیست و پیشنهاد نمی شود. زیرا میتوانند در نحوه تفسیر URL توسط مرورگرها، وب سرورها و WAF (دیواره آتش اپلیکیشن وب) مشکلاتی ایجاد کنند. جهت جلوگیری از مشکلات احتمالی یا خطرات امنیتی، این کاراکترها باید کدگذاری شده یا استفاده از آنها اجتناب گردد. به عنوان مثال، برخی از کاراکترها برای جداسازی بخشهای مختلف URL استفاده میشوند. اگر Path حاوی کاراکترهایی باشد که از آنها به عنوان جداکننده استفاده می گردد، ممکن است بهجای بخشی از مسیر واقعی، اشتباها جداکننده تفسیر گردند.
در موارد دیگر، ترکیب خاصی از کاراکترهای ناامن، موجب ایجاد نقصهای امنیتی خواهد شد که میتواند توسط هکر جهت انجام حملات مخرب استفاده شود. بنابراین مهم است که تا حد امکان، از به کار گیری کاراکترهای ناامن در Path ها، اجتناب کنید.
کدام کاراکترها ناامن هستند؟
استفاده از برخی کاراکترها در Path، مانند فاصله و براکتها، بدون در نظر گرفتن اینکه کدگذاری شده اند یا خیر، امن نیست. هنگام ایجاد URL، باید از کاراکترهای زیر اجتناب شود.
" < > # % { } | \ ^ ~ [ ] `
- فاصله: کاراکتر فاصله یا space برای استفاده در Path مناسب نیست. وقتی از فاصلهها در URL استفاده گردد، اغلب به صورت %20 یا + کدگذاری خواهند شد اما میتوانند در نحوه تفسیر Path توسط مرورگرها، وب سرورها و WAFها، مشکل ایجاد کنند.
- براکتهای زاویه دار: براکتهای زاویهدار < و > جهت استفاده در Path مناسب نیستند. زیرا این کاراکترها در تگهای HTML به کار می روند.
- علامت نقل قول: نباید از علامت " و ' در یک Path استفاده کرد زیرا ویژگی های HTML در بین این کاراکترها قرار می گیرند.
- پایپ: استفاده از کاراکتر پایپ | در یک Path ایمن نیست. زیرا در برخی از سیستمها، به عنوان جداکننده مورد استفاده قرار می گیرد.
- بک اسلش: کاراکتر بک اسلش \ نیز نباید در Path استفاده گردد. زیرا در برخی از سیستمها به عنوان کاراکتر escape در نظر گرفته میشود و در برخی از سیستم عاملها نشان دهنده یک پوشه است.
- کروشه: کروشه های "{" و "}" برای استفاده در یک Path مناسب نیستند. زیرا جهت محصور کردن بلوکهای کد در برخی از زبانهای برنامهنویسی استفاده میشوند.
- براکتها: براکتهای "[" و "]" برای استفاده در Path امن نیستند. زیرا برخی ویژگیها در HTML، از آنها بهره میبرند.
به عنوان یک قاعده کلی، از به کارگیری این کاراکترهای ناامن در URL ها خودداری کنید و از کاراکترهای معتبر در URL استفاده نمایید تا به درستی توسط مرورگرها و وب سرورها تفسیر شوند.
کاراکترهای رزرو شده در URL ها
تصویر(4)
کاراکترهای رزرو شده، کاراکترهایی هستند که معانی خاصی دارند و برای کاربردهای ویژه رزرو شده اند. یک کاراکتر رزرو شده ممکن است برای مشخص کردن ساختار یک URL یا جدا کردن بخشهای مختلف آن مورد استفاده قرار گیرد.
موارد زیر به عنوان کاراکترهای رزرو شده در نظر گرفته میشوند:
; / ? : @ & = + $ ,
این کاراکترهای رزرو شده باید هر زمان که در یک URL یا Path برای هدفی غیرمرتبط استفاده میشوند، کدگذاری گردند. برای کدگذاری صحیح یک کاراکتر رزرو شده، آنها را با علامت درصد (%) و سپس کد ASCII مربوطه به همراه نماد هگزا دسیمال، جایگزین کنید. به عنوان مثال عبارت "/Hello_World!/" باید به "/Hello_World%21/" تبدیل گردد تا Path به درستی تفسیر شود. در جدول زیر یک لیست جامع از کاراکترهای رزرو شده و مقادیر کدگذاری شده مربوط به آنها آمده است:
کاراکتر |
مقدار رمزگذاری شده |
! |
%21 |
# |
%23 |
$ |
%24 |
& |
%26 |
( |
%28 |
) |
%29 |
* |
%2A |
+ |
%2B |
, |
%2C |
/ |
%2F |
: |
%3A |
; |
%3B |
= |
%3D |
? |
%3F |
@ |
%40 |
جدول(1)
کاراکترهای رزرو شده همواره میتوانند بدون کدگذاری، برای هدف موردنظرشان استفاده شوند. به عنوان مثال، کاراکتر / برای یک پوشه در یک Path یا ? به عنوان شروع یک رشته کوئری، کاربرد دارد.
کاراکترهای ایمن در URL ها
در لیست زیر کاراکترهایی ذکر شده اند که میتوان با خیال راحت از آنها به عنوان بخشی از یک Path استفاده نمود زیرا جزء هیچکدام از کاراکترهای ناامن و رزرو شده نیستند و مشکلی ایجاد نخواهند کرد. همچنین نیازی به رمزگذاری این کاراکترها نیست.
- کاراکترهای الفبایی: A-Z، a-z و 0-9
- خط ربط: -
- دوره زمانی: .
- زیر خط: _
- تیلدا: ~
جمع بندی
اگر حتما باید از کاراکترهای رزرو شده ناامن یا رمزگذاری نشده برای هدفی غیرمرتبط استفاده نمایید، لازم است تا دسترسی به آنها را صرفا برای آدرس IP کاربر در فایروال یا WAF مجاز کنید و سایر IP ها را بلاک نمایید. اما این کار توصیه نمیشود زیرا میتواند منجر به ایجاد مشکلات امنیتی شود که در وهله اول هدف استفاده از فایروال اپلیکیشن تحت وب را نفی میکند. با این حال، میتوانید با اجتناب از کاراکترهای ناامن و رمزگذاری کاراکترهای رزرو شده که در URL ها یا Path هایی غیرمرتبط استفاده میشوند و استفاده از کاراکترهای معتبر در URL، بسیاری از مشکلات امنیتی و سازگاری را حل کنید.