فرصت مطالعه ندارید؟ چکیده این مطلب را همینجا گوش دهید:
مدیریت کدهای HTML دریافتی از کاربران یا منابع ناامن همیشه یکی از دغدغههای اصلی توسعهدهندگان وب و مدیران سیستم بوده است. کدهای مخرب یا تگهای ناقص میتوانند ساختار صفحات را بههم ریخته یا امنیت برنامهی شما را به خطر بیندازند. در این مقاله به بررسی ابزار قدرتمند HTML Purifier و مستندات تنظیمات آن میپردازیم تا یاد بگیریم چگونه کدهای HTML را به شکل اصولی و امن پاکسازی کنیم.

آشنایی با ساختار و انواع دادهها در تنظیمات
تنظیمات در HTML Purifier بر اساس نوع دادههای ورودی دستهبندی میشوند تا ساختار پیکربندی همواره معتبر بماند. شناخت این انواع داده به شما کمک میکند هنگام سفارشیسازی خطایی دریافت نکنید. برای مثال، انواع مقادیر شامل رشتهها (String)، مقادیر منطقی (Boolean)، آرایههای انبارشی (Lookup Array) و اعداد صحیح هستند.
| نوع داده (Type) | توضیح و قالب مقدار |
|---|---|
| Boolean | مقادیر منطقی true / false یا عدد 1 و 0. |
| Lookup Array | آرایهای از کلیدها با مقدار بولی، مانند لیست مجاز ویژگیها یا کلاسها. |
| String / Text | رشتههای متنی ساده یا چندخطی برای تنظیم مقادیر پیشفرض. |
| Integer / Float | اعداد صحیح و اعشاری برای کنترل ابعاد و محدودیتها. |
تنظیمات ویژگیها و شناسههای عنصر (Attr)
بخش Attr به شما اجازه میدهد رفتارهای مربوط به ویژگیهای تگهای HTML مانند کلاسها، شناسهها و مقادیر پیشفرض را کنترل کنید. به عنوان مثال، پارامتر Attr.EnableID به صورت پیشفرض غیرفعال است (مقدار false) تا از تداخل شناسهها در سند جلوگیری شود. اگر نیاز به فعالسازی شناسههای منطبق با استانداردهای مدرن دارید، گزینههایی مانند Attr.ID.HTML5 در نسخههای جدیدتر در دسترس هستند.
همچنین با استفاده از دستور Attr.DefaultImageAlt میتوانید یک متن جایگزین پیشفرض برای تگهای تصویر تعیین کنید تا در صورت خالی بودن صفت alt، به طور خودکار اعمال شود.
فرمتدهی خودکار متنها با AutoFormat
یکی از قابلیتهای کارآمد این ابزار، بخش خودکارسازی قالببندی (AutoFormat) است که به خوانایی بهتر کدهای خروجی کمک میکند. دستور AutoFormat.AutoParagraph با تبدیل خطوط جدید به پاراگرافهای استاندارد، ساختار متن را مرتب میکند (البته تگهای پاراگراف باید از پیش مجاز شده باشند).
دستور AutoFormat.Linkify به طور خودکار آدرسهای وب (HTTP، HTTPS و FTP) را به لینکهای قابل کلیک تبدیل میکند. همچنین دستور AutoFormat.RemoveEmpty برای حذف عناصر خالی که اطلاعات معنایی مفیدی به سند اضافه نمیکنند به کار میرود. کدهای پیشفرض برای مدیریت حذف عناصر خالی به شکل زیر تعریف میشوند:
array (
'colgroup' =>
array (
),
'th' =>
array (
),
'td' =>
array (
),
'iframe' =>
array (
0 => 'src',
),
)
این ساختار مشخص میکند که عناصر خاصی مانند جدولها حتی اگر محتوای متنی مستقیم نداشته باشند، حفظ شوند تا طرحبندی سند بههم نریزد.
مدیریت و استخراج استایلهای CSS
تنظیمات بخش CSS به شما کنترل دقیقی روی استایلهای درونمتنی میدهد. به صورت پیشفرض، کدهای مخرب یا استایلهای ناشناخته فیلتر میشوند. برای نمونه، ویژگی CSS.AllowTricky به شما اجازه میدهد از استایلهای حساس مثل display:none; استفاده کنید که در حالت عادی مسدود میشوند.
کد نمونهی زیر نحوهی راهاندازی و استفاده از فیلتر استخراج استایلها و پاکسازی کدهای آلوده را در محیط PHP نشان میدهد:
<?php
header('Content-type: text/html; charset=utf-8');
echo '<?xml version="1.0" encoding="UTF-8"?>';
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
<head>
<title>Filter.ExtractStyleBlocks</title>
<?php
require_once '/path/to/library/HTMLPurifier.auto.php';
require_once '/path/to/csstidy.class.php';
$dirty = '<style>body {color:#F00;}</style> Some text';
$config = HTMLPurifier_Config::createDefault();
$config->set('Filter', 'ExtractStyleBlocks', true);
$purifier = new HTMLPurifier($config);
$html = $purifier->purify($dirty);
$styles = $purifier->context->get('StyleBlocks');
$dir = 'styles/';
if (!is_dir($dir)) mkdir($dir);
$hash = sha1($_GET['html']);
foreach ($styles as $i => $style) {
file_put_contents($name = $dir . $hash . "_$i", $style);
echo '<link rel="stylesheet" type="text/css" href="'.$name.'" />';
}
?>
</head>
<body>
<div>
<?php echo $html; ?>
</div>
</body>
</html>
در کد بالا، کتابخانه ابتدا تنظیمات پیشفرض را بارگذاری میکند، سپس فیلتر استخراج استایل فعال شده و تگهای استایل از بدنهی متن جدا شده و در فایلهای جداگانه ذخیره میشوند، در حالی که متن اصلی بدون کدهای ناخواسته پاکسازی میشود.
پرسشهای متداول
چگونه میتوانم شناسههای سفارشی (ID) را در کدهای پاکسازی شده مجاز کنم؟
به صورت پیشفرض شناسهها غیرفعال هستند. با تنظیم مقدار Attr.EnableID روی true میتوانید به کتابخانه اجازه دهید شناسههای موجود در تگها را حفظ کند.
آیا این ابزار تگهای اسکریپت مخرب را به طور کامل حذف میکند؟
بله، هدف اصلی HTML Purifier حذف کدهای مخرب مانند اسکریپتها، تگهای غیرمجاز و ویژگیهای خطرناک بر اساس لیست سفید است.
چگونه از حذف شدن تگهای خالی جلوگیری کنیم؟
اگر قابلیت AutoFormat.RemoveEmpty فعال باشد، تگهای خالی حذف میشوند. میتوانید با تنظیمات پیشکد (Predicate) مشخص کنید چه تگهایی حتی در صورت نداشتن محتوا حفظ شوند.
جمعبندی
استفاده از تنظیمات دقیق در HTML Purifier به شما امکان میدهد ورودیهای متنی کاربران را به یک ساختار استاندارد، امن و قابل اعتماد تبدیل کنید. با بهرهگیری از قابلیتهای خودکارسازی فرمت، مدیریت ویژگیها و فیلتر کردن استایلهای CSS، خطر تزریق کدهای مخرب به حداقل میرسد و کدهای تمیزی در خروجی خواهید داشت.



