تابع strip_tags() در PHP
تابع strip_tags() یکی از توابع ساده و پرکاربرد PHP برای حذف تگهای HTML و XML از یک رشته است. این تابع برای مواقعی که میخواهید خروجی متنی ساده از ورودی حاوی تگها بگیرید یا نمایش HTML را محدود کنید مفید است. اما باید توجه کنید که strip_tags() ابزار جایگزین برای پاکسازی کاملِ ورودیهای ناامن (مانند جلوگیری از XSS) نیست.
امکانپذیریها و سینتکس
سینتکس پایه تابع به شکل زیر است:
string strip_tags ( string $str [, string $allowable_tags ] )پارامترها:
- $str : رشتهای که باید تگها از آن حذف شوند.
- $allowable_tags : (اختیاری) رشتهای شامل تگهایی که میخواهید حفظ شوند. فرمت: ‘<b><i>’ و …
مثالهای پایه
<?php
$input = '<p>Hello <strong>World</strong>! <a href="http://example.com">Link</a></p>';
echo strip_tags($input);
// خروجی: Hello World! Link
echo strip_tags($input, '<strong>');
// خروجی: Hello <strong>World</strong>! Link
?>توضیح: در مثال اول همهٔ تگها حذف و فقط متن باقی میماند. در مثال دوم تگ <strong> به عنوان مجاز ذکر شده، بنابراین خود تگ (و هر صفتی که داخل آن باشد) حفظ میشود.
نکات مهم و محدودیتها
- strip_tags() تنها تگها (علامتهای بین ‘<‘ و ‘>’) را حذف میکند؛ محتویات بین تگها را نگه میدارد. بنابراین اگر رشته شامل کد جاوااسکریپت درون <script> باشد، محتوای جاوااسکریپت پس از اجرای strip_tags() باقی میماند. این میتواند خطرناک باشد.
- پارامتر allowed_tags تگ را کامل حفظ میکند، همچنین هر صفت (attribute) آن تگ را نیز حفظ میکند. پس اگر میخواهید تنها نام تگ را نگه دارید اما صفتها را حذف کنید، strip_tags مناسب نیست.
- strip_tags برای پاکسازی امنیتی (sanitization) مناسب نیست؛ برای نمایش امن باید از escaping مانند htmlspecialchars() یا از کتابخانههای معتبر مانند HTML Purifier استفاده کنید.
- در مواردی که HTML خراب یا ناتمام است، رفتار تابع ممکن است مطابق انتظار نباشد؛ برای پردازش دقیقتر از DOMDocument استفاده کنید.
مثال: خطر با تگهای اسکریپت
<?php
$danger = '<script>alert("XSS")</script>';
echo strip_tags($danger);
// خروجی: alert("XSS")
?>توضیح: همانطور که میبینید تگ <script> حذف میشود اما کد داخل آن باقی میماند؛ اگر این خروجی به صورت HTML چاپ شود ممکن است اجرای کد رخ دهد. برای جلوگیری باید ابتدا محتوای بین <script> و <style> را حذف کنید یا از روشهای امنسازی استفاده نمایید.
حذف کامل بلوکهای script و style قبل از strip_tags
<?php
$input = '<div>Text<script>alert(1)</script></div>';
// حذف کامل بلوکهای script و style
$clean = preg_replace('#<(script|style)(.*?)>.*?</\1>#is', '', $input);
// سپس حذف سایر تگها
$clean = strip_tags($clean);
echo $clean; // خروجی: Text
?>توضیح: ابتدا با یک الگوی منظم (case-insensitive و dotall) تمام بلوکهای <script> و <style> و محتوای درونشان حذف میشوند، سپس strip_tags برای پاکسازی بقیه تگها استفاده میشود. این روش نسبی است و برای HTML بسیار پیچیده توصیه میشود از DOM استفاده شود.
جایگزینها و روشهای بهتر
برای پردازش دقیق HTML و حذف صفات یا حذف کامل برخی تگها بهتر است از DOMDocument یا کتابخانههای فیلترینگ استفاده کنید. مثال پایین DOMDocument را نشان میدهد که چگونه همهٔ صفات تگها را حذف کنیم و فقط متن/تگهای خالی حفظ شوند:
<?php
$html = '<div class="c"><a href="x">Link</a></div>';
$dom = new DOMDocument();
libxml_use_internal_errors(true);
$dom->loadHTML('query('//@*') as $attr) {
$attr->parentNode->removeAttributeNode($attr);
}
echo $dom->saveHTML();
?>توضیح: این کد HTML را با DOMDocument بارگذاری میکند، سپس با XPath همهٔ Attributes را یافته و حذف میکند. در نتیجه تگها باقی میمانند اما بدون صفتها. برای حذف عناصر خاص (مثل <script>) میتوان همانگونه گرهها را حذف کرد.
مقایسه سریع توابع
| تابع | کاربرد | محدودیت |
|---|---|---|
| strip_tags() | حذف تگها و نگهداری متن | حذف محتوا بین تگها را انجام نمیدهد؛ مناسب برای امنیت نیست |
| htmlspecialchars() | کدگذاری کاراکترها برای نمایش امن در HTML | تگها را حذف نمیکند؛ فقط نمایش را ایمن میکند |
| DOMDocument / HTML Purifier | پردازش و پاکسازی ساختاری HTML | پیچیدهتر اما امن و انعطافپذیر |
راهنمای عملی و توصیههای امنیتی
- برای نمایش متن ساده: strip_tags کافی و سریع است.
- برای جلوگیری از XSS: از htmlspecialchars() یا استفاده از HTML Purifier برای ورودیهای HTML استفاده کنید.
- اگر میخواهید فقط چند تگ خاص با صفتهای کنترلشده نگه داشته شوند، از DOMDocument برای پاکسازی صفتها یا HTML Purifier برای لیست سفید استفاده کنید.
- همیشه فرض کنید ورودی میتواند مخرب باشد؛ بهویژه وقتی خروجی دوباره در صفحه قرار میگیرد.
جمعبندی
strip_tags() تابع ساده و پرسرعتی برای حذف تگها است، اما نباید بهعنوان تنها مکانیزم امنیتی استفاده شود. برای موارد ساده و غیرحساس مفید است؛ اما برای جلوگیری از XSS یا وقتی نیاز به کنترل دقیق تگها و صفات دارید، از DOM یا کتابخانههای معتبر استفاده کنید.
آیا این مطلب برای شما مفید بود ؟



