فرار HTML فرایندی است که در آن کاراکترهایی که در HTML معنای خاص دارند با مراجع موجودیت متناظرشان جایگزین میشوند. پنج کاراکتری که باید فرار داده شوند عبارتند از: علامت و (&)، کمتر از (<)، بیشتر از (>)، نقلقول دوگانه (") و نقلقول تکی ('). بدون فرار، مرورگر این کاراکترها را بهجای متن قابل نمایش، بهعنوان دستورالعمل نشانهگذاری تفسیر میکند که هم رندر صفحه را خراب میکند و هم در برابر حملات تزریق آسیبپذیری ایجاد میکند.
مشخصات HTML (که توسط WHATWG نگهداری میشود) دو شکل از مراجع کاراکتر تعریف میکند: موجودیتهای نامی مانند & و موجودیتهای عددی مانند & یا &. موجودیتهای نامی در کد منبع راحتتر خوانده میشوند. موجودیتهای عددی (اعشاری یا هگزادسیمال) میتوانند هر نقطه کد Unicode را نمایش دهند و برای کاراکترهایی که نام مستعار ندارند مفید هستند. هر دو شکل در مرورگر خروجی یکسانی تولید میکنند.
بازگردانی (که به آن رمزگشایی نیز گفته میشود) عملیات معکوس است: تبدیل مراجع موجودیت به کاراکترهای واقعی. این عملیات هنگام استخراج متن از کد منبع HTML، مهاجرت محتوا بین سیستمها، یا اشکالزدایی قالبهایی که موجودیتها را دوبار رمزگذاری میکنند رایج است. این ابزار هر دو جهت را در مرورگر پردازش میکند، بنابراین میتوانید منطق فرار خود را در چند ثانیه تأیید کنید یا متن ساده را از یک منبع HTML پر بازیابی کنید.
چرا از ابزار فرار HTML استفاده کنیم؟
جایگزینی دستی کروشههای زاویهای و علامتهای و در متون حجیم خستهکننده و مستعد خطاست. یک ابزار اختصاصی ورودی شما را در یک مرحله تبدیل میکند، بدون نیاز به نصب.
⚡
تبدیل فوری
متن یا HTML را پیست کنید و فوراً خروجی اسکیپشده یا آناسکیپشده دریافت کنید. انتظار برای رفتوبرگشت سرور لازم نیست چون تمام پردازش بهصورت محلی در JavaScript انجام میشود.
🔒
پردازش با اولویت حریم خصوصی
ورودی شما هرگز مرورگر را ترک نمیکند. هیچ چیزی به سرور ارسال یا در هیچ جایی ذخیره نمیشود، بنابراین میتوانید با خیال راحت نشانهگذاری حاوی اعتبارنامهها، کلیدهای API یا کد داخلی را فرار دهید.
📋
بدون حساب کاربری یا راهاندازی
صفحه را باز کنید و شروع کنید به پیست کردن. دیوار ورود، تأیید ایمیل و نرمافزاری برای نصب وجود ندارد. روی هر دستگاهی با یک مرورگر مدرن کار میکند.
🌐
پوشش کامل موجودیتها
پنج کاراکتر خاص HTML اجباری بهعلاوه موجودیتهای عددی (اعشاری و هگزادسیمال) را پردازش میکند. از تبدیل رفتوبرگشت پشتیبانی میکند: فرار و سپس بازگردانی رشته اصلی را برمیگرداند.
موارد استفاده از فرار HTML
توسعهدهنده فرانتاند: نمایش ورودی کاربر
هنگام رندر متن ارسالشده توسط کاربر در صفحه، ابتدا آن را فرار دهید تا مرورگر آن را بهعنوان تگهای HTML تفسیر نکند. این دفاع اصلی در برابر XSS ذخیرهشده در هر قالبی است که رشتههای خام را خروجی میدهد.
مهندس بکاند: تولید پاسخهای HTML
کد سمت سرور که رشتهها را به HTML الحاق میکند باید مقادیر پویا را قبل از درج فرار دهد. از این ابزار استفاده کنید تا تأیید کنید که تابع فرار شما برای موارد لبهای مانند نقلقولهای تودرتو خروجی صحیح تولید میکند.
DevOps: جاسازی پیکربندی در HTML
JSON درونخطی یا دستورات shell داخل یک صفحه HTML (برای مثال در یک تگ script یا یک ویژگی data) نیاز به فرار دارند. تأیید کنید که کروشههای زاویهای و علامتهای و در قطعات پیکربندی شما به درستی رمزگذاری شدهاند.
مهندس QA: آزمایش بردارهای XSS
بارهای معمول XSS را در ابزار پیست کنید تا تأیید کنید که خروجی برنامه با نسخه فرارشده صحیح مطابقت دارد. خروجی فرارشده را کاراکتر به کاراکتر با آنچه برنامه شما تولید میکند مقایسه کنید.
نویسنده فنی: نمونههای کد در مستندات
انتشار قطعات کد در مستندات مبتنی بر HTML (Jekyll، Hugo، CMSهای سفارشی) مستلزم فرار کروشههای زاویهای برای نحو نوع جنریک و مکاننگهدارهای قالب است. نمونه کد خود را پیست کنید و هر کاراکتر خاص فوراً رمزگذاری میشود.
دانشجو: یادگیری موجودیتهای HTML
هر کاراکتری را تایپ یا الصاق کنید و شکلهای موجودیت نامی و عددی آن را ببینید. با موارد لبهای مانند فاصلههای بدون شکست، خط تیرههای em و نمادهای Unicode آزمایش کنید تا نحوه عملکرد رمزگذاری کاراکتر HTML را درک کنید.
جدول مرجع موجودیتهای HTML
جدول زیر موجودیتهای HTML پرکاربرد را فهرست میکند. پنج کاراکتر خاص (& < > " ') باید همیشه در محتوای HTML و مقادیر ویژگی فرار داده شوند. سایر موجودیتها اختیاری هستند اما برای کاراکترهایی که تایپشان دشوار است یا در کد منبع ابهام دارند مفیدند.
فرار در مقابل بازگردانی: چه زمانی از کدام استفاده کنیم
این دو عملیات معکوس یکدیگرند. انتخاب جهت اشتباه منجر به خروجی دوبار رمزگذاریشده یا ناامن میشود.
فرار (رمزگذاری)
هنگام درج متن نامعتبر یا پویا در HTML استفاده کنید. < واقعی را به < تبدیل میکند تا مرورگر کاراکتر را نمایش دهد بهجای اینکه یک تگ شروع کند. قبل از رندر ورودی کاربر، ورودیهای گزارش، یا هر رشتهای که ممکن است حاوی نشانهگذاری باشد اعمال کنید.
بازگردانی (رمزگشایی)
هنگام استخراج متن ساده از منبع HTML استفاده کنید. < را به < برمیگرداند. هنگام مهاجرت محتوا از یک CMS، تجزیه HTML خزیدهشده، یا رفع رشتههای دوبار رمزگذاریشده مانند &amp; که نام موجودیتها را بهجای کاراکترها نمایش میدهند اعمال کنید.
نمونههای کد
در زیر نمونههای کاری از فرار و بازگردانی HTML در چهار زبان برنامهنویسی آمده است. هر قطعه هر دو جهت را پوشش میدهد و موارد لبهای مانند نقلقولهای تودرتو و موجودیتهای عددی را مدیریت میکند.
فرار HTML کاراکترهایی که در HTML خاص هستند (< > & " ') را با مراجع موجودیت مانند < جایگزین میکند تا بهصورت متن نمایش داده شوند. رمزگذاری URL (percent-encoding) کاراکترهایی که در URL ناامن هستند را با دنبالههای هگزادسیمال %XX جایگزین میکند. آنها زمینههای مختلفی را محافظت میکنند: فرار HTML از تزریق نشانهگذاری جلوگیری میکند، در حالی که رمزگذاری URL رشتههای جستجو و بخشهای مسیر معتبر را تضمین میکند.
کدام کاراکترها باید در HTML فرار داده شوند؟
پنج کاراکتری که همیشه باید فرار داده شوند عبارتند از: & (علامت و)، < (کمتر از)، > (بیشتر از)، " (نقلقول دوگانه در داخل ویژگیها) و ' (نقلقول تکی در داخل ویژگیها). عدم فرار هر یک از اینها میتواند رندر را خراب کند یا آسیبپذیری cross-site scripting ایجاد کند.
آیا ' در HTML5 معتبر است؟
بله. موجودیت نامی ' در مشخصات HTML5 تعریف شده و توسط تمام مرورگرهای مدرن پشتیبانی میشود. این موجودیت بخشی از HTML 4 نبود که فقط &، <، > و " را میشناخت. اگر نیاز به پشتیبانی از تجزیهکنندههای قدیمی HTML 4 دارید، از شکل عددی ' استفاده کنید.
چگونه موجودیتهای HTML دوبار رمزگذاریشده مانند &amp; را رفع کنم؟
رمزگذاری مضاعف زمانی رخ میدهد که یک رشته از قبل فرارشده برای بار دوم از تابع فرار عبور کند. راهحل این است که تا زمانی که خروجی پایدار شود بازگردانی کنید. رشته دوبار رمزگذاریشده را در حالت آناسکیپ در این ابزار پیست کنید، سپس اگر مراجع & باقی ماندند دوباره اجرا کنید. برای جلوگیری از رمزگذاری مضاعف، قبل از اعمال تابع فرار بررسی کنید که ورودی از قبل فرار شده است یا نه.
آیا میتوانم از موجودیتهای HTML در رشتههای JavaScript استفاده کنم؟
موجودیتهای HTML توسط تجزیهکننده HTML تفسیر میشوند، نه موتور JavaScript. داخل یک بلوک script، کد بعد از پردازش صفحه توسط تجزیهکننده HTML اجرا میشود، بنابراین < در یک بلوک script قبل از اینکه JavaScript آن را ببیند به < تبدیل میشود. برای کنترلکنندههای رویداد درونخطی (onclick و غیره)، مقدار ویژگی ابتدا از HTML رمزگشایی میشود، سپس بهعنوان JavaScript اجرا میشود. در فایلهای خارجی .js، موجودیتها معنای خاصی ندارند و بهعنوان متن واقعی تلقی میشوند.
تفاوت بین htmlspecialchars و htmlentities در PHP چیست؟
htmlspecialchars() فقط پنج کاراکتر خاص (& < > " ') که بر ساختار HTML تأثیر میگذارند را فرار میدهد. htmlentities() آن پنج کاراکتر بهعلاوه هر کاراکتری که موجودیت HTML نامی دارد مانند نماد کپیرایت و حروف لهجهدار را فرار میدهد. برای اهداف امنیتی، htmlspecialchars() با ENT_QUOTES کافی است. htmlentities() زمانی مفید است که به خروجی امن ASCII برای سیستمهایی که نمیتوانند UTF-8 را مدیریت کنند نیاز دارید.
آیا فرار HTML برای جلوگیری از XSS کافی است؟
فرار HTML در رایجترین حالت از XSS جلوگیری میکند: درج متن نامعتبر در محتوای عناصر HTML یا مقادیر ویژگی. از دیگر زمینههای تزریق محافظت نمیکند. درج داده کاربر در یک بلوک script نیاز به فرار رشته JavaScript دارد. درج در یک ویژگی style نیاز به فرار CSS دارد. درج در یک ویژگی URL (href، src) نیاز به اعتبارسنجی URL بهعلاوه رمزگذاری دارد. یک دفاع کامل در برابر XSS در هر نقطه درج، فرار خاص زمینه را اعمال میکند.