پاکسازی امنیتی خروجی HTML ویرایشگرهای WYSIWYG

اگر از ویرایشگرهای WYSIWYG استفاده میکنید که خروجی HTML تولید میکنن، باید بدونید که خروجی این ویرایشگرها باید حتما از نظر امنیتی پاکسازی بشه، چون اگر پاکسازی نشه اونوقت یک هکر میتونه کدهای HTML+Javascript خطرناکی رو، ظاهرا از طرف ویرایشگر شما، برای نفوذ به سایت شما ارسال کنه. نتیجتا مثلا وقتی این کدها رو در کدهای HTML فضای عمومی سایت درج میکنید، کدهای مورد نظر هکر در مرورگر شما و کاربران شما اجرا میشه که باهاش میتونه حمله هایی مثل XSS اجرا کنه.

نکتهء دیگر اینکه هرگز از راههای کم و بیش ساده و مختصر شخصی برای این کار استفاده نکنید، چون ساختار HTML بیش از اونکه شما فکر کنید پیچیده و درهم است و امکان نفوذ رو از طرق متعدد و پیچیده ای میده، و با توجه به تحقیقات و تست و تحلیل هایی که شخصا روی این قضیه داشتم میتونم بگم روشهایی که برنامه نویسان خودشون ابداع میکنن هیچکدام امنیت کافی در برابر تمام ترفندهای نفوذ ندارن.
برای پاکسازی HTML توصیه میکنم حتما از برنامه های مفصل و حرفه ای مخصوص این کارها، مثل برنامهء htmlpurifier استفاده کنید.

خب یک راست میریم سر روش استفاده با یک مثال از پاکسازی یک رشتهء محتوی کدهای خطرناک:

<?php

header("Content-type: text/plain; charset=utf-8");

$contents="<script>alert(1);</script><img src='t.jpg' onload='alert(2);'><form></form>";

require_once 'htmlpurifier-4.3.0/library/HTMLPurifier.auto.php';

$config = HTMLPurifier_Config::createDefault();
$config->set('Core.Encoding', 'UTF-8');
$config->set('HTML.Doctype', 'HTML 4.01 Transitional');
$purifier = new HTMLPurifier($config);

echo $purifier->purify($contents);

?>

این مثال با فرض این هست که انکدینگ صفحهء شما UTF-8 است و doctype صفحه هم از نوع HTML 4.01 Transitional. اگر انکدینگ یا doctype دیگری دارید، باید تنظیمات مربوطه رو انجام بدید.

در این لینک هم htmlpurifier رو با برنامه های مشابه دیگر مقایسه کرده.
با توجه به موارد بیان شده، میتونم بگم درحال حاضر htmlpurifier در این زمینه کاملترین و امن ترین برنامه است.

8 دیدگاه در “پاکسازی امنیتی خروجی HTML ویرایشگرهای WYSIWYG

    • شما در این زمینه بقدر کافی تحقیق داشتی و مطمئن هستی از روش خودت؟ روی مسائل امنیتی نمیشه ریسک کرد و صرفا بر اساس تصور و نظر و تجربهء شخصی پیش رفت.

  1. سلام
    کلا برای کنترل ورودی های کاربران مخصوصا در این حالت ورودی ها برنامه نویس همیشه مشکل داره، از طرفی ککنترل ظاهر خروجی مهم هستش و نمیخوایم به اصل ساختار خروجی دست بخوره، از طرفی مجبوریم کاربر رو یک هکر فرض کنیم و همیشه به صورت کاملا جدی داده های ورودی رو بررسی نماییم، البته در این مثال هم حذف نمودن دستورات js و مثلا محدود کردن کاربران به استفاده از برخی تگ های html می تونه یک راه حل باشه، و استفاده کردن از این دست ابزارها گاهی میتونه با سیاست کلی ما در مورد خروجی نهایی فرق داشته باشه.

  2. سلام. حمیدرضا جان شما میدونی html purifer دقیقا با متن چه کار میکنه؟! چون من با ckeditor یک متنی رو از دیتابیس فراخوانی کردم و بعدش بدون هیچ تغییری متن رو دوباره توی دیتابیس ذخیره کردم ولی دیدم این متن اون متن قبلی نیست!! مثلا اگر اشتباه نکنم اون متن از یک سری div و span تعریف شده بود که کلاس های نامشخصی داشتنید و بعدش دیدم توی دیتابیس کلا اون div دیگه نیست، البته متن داخلش بود هنوز! واسه همین به html purifer که استفاده کرده بودم قبل از ثبت توی دیتابیس مشکوک شدم! میخوام بدونم چه کار میکنه با متن؟

    • توضیحات کامل و دقیق نیاز به تحقیق و تست و بررسی مجدد داره که فعلا وقت و اولویتش رو ندارم. اما چیزی که شما میگی بنظر طبیعی میاد! طبیعتا باید div و span ها با کلاسهای ناشناخته رو حذف بکنه یا حداقل مشخصهء کلاس و آیدی اینای اونا رو حذف بکنه، چون ممکنه یک نفر عمدا یکسری کلاسهایی رو که در سیستم شما معنا و فرمت خاصی دارن داده باشه. در تنظیمات html purifer همهء اینا قابل تعریف و تعیین هست که چه تگهایی رو اجازه بده چه کلاسهای از پیش تعریف شده ای رو اجازه بده و غیره. دیگه این جزییات رو خودتون باید دربیارید منکه وقت ندارم هر روز برم دنبال تحقیق و مقاله دادن درمورد هر جزییات این همه موارد گسترده و پیچیده در امنیت و برنامه نویسی. بنده اکثرا معرفی های کلی و نکات و مطالب محوری و سرنخ ها رو ارائه کردم نه تمام جزییات استفاده و کدهای کامل رو. کار و نیازها و وظایف یک برنامه نویس درآوردن همین چیزها هم هست بالاخره. سعی کنید زبان انگلیسی و درک مطلب خودتون رو برای خوندن و درک کامل و دقیق متون فنی و تخصصی رشتهء خودتون قوی کنید. اینا رو سرچ بزنید، رفرنس و منوال ها و مثالهاش رو بخونید، توی سایتهای پرسش و پاسخ مطرح کنید و غیره خیلی سریع و راحت جواب هاتون رو پیدا میکنید.

پاسخ دهید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

*

شما می‌توانید از این دستورات HTML استفاده کنید: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>