عنوان:

‫راهنمای تبدیل متن ساده (Plain Text) به HTML


نویسنده: وحید نصیری
تاریخ: ۱۴۰۵/۰۴/۱۱ ۱۱:۳۰
آدرس: www.dntips.ir
در توسعه نرم‌افزار و وب، بسیار پیش می‌آید که مایل باشیم متون ساده‌ای را که کاربران وارد کرده‌اند (مانند نظرات، پیام‌ها یا توضیحات متنی)، بدون تغییر در ساختار بصری آن‌ها، در صفحات وب نمایش دهیم. با این حال، مرورگرها متون ساده را مستقیماً بر اساس قواعد HTML رندر می‌کنند. این امر باعث می‌شود که شکستگی‌های خطوط (Newlines)، فاصله‌های متوالی (Spaces) و کاراکترهای خاص به درستی نمایش داده نشوند و یا بدتر از آن، برنامه را در معرض آسیب‌پذیری‌های امنیتی خطرناکی مانند تزریق کد (XSS) قرار دهند. در این مقاله به بررسی مکانیزم‌های استاندارد، نکات امنیتی و روش‌های بهینه برای تبدیل متن ساده به HTML قابل نمایش می‌پردازیم.

چالش کاراکترهای خاص و نگاشت آن‌ها
سیستم رندرینگ HTML برای تشخیص تگ‌ها و ساختار صفحات از کاراکترهای ویژه‌ای نظیر < و > استفاده می‌کند. برای اینکه این کاراکترها به عنوان متن عادی و بدون تفسیر ساختاری نمایش داده شوند، باید آن‌ها را به معادل‌های متنی یا همان HTML Entities تبدیل کنیم. جدول زیر نگاشت‌های حیاتی برای یک تبدیل امن و صحیح را نشان می‌دهد:

کاراکتر در متن سادهمعادل در HTML (Entity)علت و کاربرد
&&amp;جلوگیری از تفسیر اشتباه به عنوان شروع یک Entity دیگر
<&lt;جلوگیری از تفسیر به عنوان شروع تگ‌های HTML
>&gt;جلوگیری از تفسیر به عنوان پایان تگ‌های HTML
"&quot;حفاظت از اتریبیوت‌ها در ساختارهای تگ
'&#39; یا &apos;حفاظت از اتریبیوت‌های محصور در تک‌کوتیشن
\n یا \r\n<br>انتقال متن به خط بعدی (حفظ شکستگی خطوط)
چند فاصله متوالی&nbsp; یا CSSجلوگیری از فشرده‌سازی فاصله‌ها توسط مرورگر
Tab (\t)مجموعه‌ای از &nbsp; یا CSSایجاد فضای دندانه دندانی (Indentation)

یک مثال عینی از فرآیند تبدیل
فرض کنید متن ورودی دریافتی از کاربر به شکل زیر باشد:
Hello <World>

A    B
C & D
پس از طی مراحل تبدیل استاندارد، خروجی خامی که باید برای مرورگر ارسال شود تا متن را درست نشان دهد، به این صورت خواهد بود:
Hello &lt;World&gt;<br><br>
A&nbsp;&nbsp;&nbsp;&nbsp;B<br>
C &amp; D

الگوریتم استاندارد و مراحل پیاده‌سازی
در اکثر فریم‌ورک‌ها و زبان‌های برنامه‌نویسی، یک روال استاندارد دو مرحله‌ای برای این کار وجود دارد. رعایت تقدم و تاخر این مراحل از اهمیت بالایی برخوردار است:
  • مرحله ۱: اِنکود کردن ساختار HTML (HTML Encoding): ابتدا تمام کاراکترهای خاص جدول بالا (به جز کاراکترهای کنترلی خطوط) به کاراکتر امن تبدیل می‌شوند.
  • مرحله ۲: جایگزینی کاراکترهای کنترلی: پس از امن‌سازی متن، کاراکترهای خط جدید (\n یا \r\n) با تگ استاندارد <br> جایگزین می‌شوند.

در ادامه نمونه کد پیاده‌سازی شده در زبان #C را مشاهده می‌کنید:
string rawText = "Hello <World>\nNew Line";
string safeHtml = WebUtility.HtmlEncode(rawText)
    .Replace("\r\n", "<br>")
    .Replace("\n", "<br>");

هشدار امنیتی بسیار مهم (تزریق کد یا XSS)
هرگز و تحت هیچ شرایطی، قبل از انجام فرآیند HtmlEncode، اقدام به جایگزینی خطوط با تگ <br> نکنید. اگر متن ورودی حاوی کدهای مخرب جاوااسکریپت یا تگ‌های HTML باشد، تغییرات زودهنگام ممکن است فیلترهای امنیتی را دور زده و برنامه شما را در معرض حملات Cross-Site Scripting (XSS) قرار دهد. همواره ابتدا متن را کاملاً امن (Encode) کرده و سپس تگ‌های کنترل‌شده خود را به آن اضافه کنید.

راهکار بهینه با استفاده از CSS
اگرچه جایگزین کردن دستی فاصله‌ها با &nbsp; و تب‌ها با چند Entity کارآمد است، اما راه‌حل مدرن‌تر، تمیزتر و بهینه‌تری در دنیای وب وجود دارد. شما می‌توانید از ویژگی white-space در CSS استفاده کنید.
اگر به المان نگه‌دارنده متن در HTML (مثلاً یک تگ <div> یا <p>) استایل white-space: pre-wrap; را اختصاص دهید، مرورگر به صورت خودکار تمام شکستگی‌های خطوط (\n)، تب‌ها و فاصله‌های متوالی را دقیقاً همان‌طور که در متن اصلی بوده‌اند رندر می‌کند؛ بدون اینکه نیاز باشد شما در سمت سرور به صورت دستی رشته را با تگ‌های متعددی دستکاری کنید!

رویکرد نهایی و ایده‌آل (ترکیب امنیت و CSS)
در این روش، سمت سرور یا در بخش منطق برنامه فقط عمل انکود امنیتی انجام می‌شود:
// سمت سرور: فقط انکود کاراکترهای خاص برای امنیت
string htmlResult = WebUtility.HtmlEncode(userInput);
و در سمت فرانت‌اند، نمایش صحیح و نیتیو آن با استایل زیر تضمین می‌شود:
/* سمت کلاینت: حفظ خودکار ساختار متنی و شکست خطوط طولانی */
.text-container {
    white-space: pre-wrap;
    word-break: break-word;
}

نتیجه‌گیری
تبدیل متن ساده به HTML فراتر از یک جایگزینی متنی ساده برای شکستن خطوط است. این فرآیند مرز باریکی میان ارائه تجربه کاربری مطلوب و حفظ امنیت نرم‌افزار به شمار می‌رود. قانون طلایی توسعه‌دهندگان در این سناریو، «اولویت مطلق انکود بر هرگونه تغییر ساختاری» است. با بکارگیری متدهای استاندارد انکودینگ فریم‌ورک خود در کنار قابلیت‌های قدرتمند CSS مانند white-space: pre-wrap;، می‌توانید کدی خوانا، بسیار امن و با کارایی بالا بنویسید که ساختار متنی کاربران را به بهترین شکل ممکن حفظ کند.