PDA

View Full Version : سوال: کمک فوری؟ مشکل در استفاده از تابع preg_replace



ghasemweb
دوشنبه 24 مرداد 1390, 19:00 عصر
سلام
آقا من اومدم از این تابع استفاده کردم که متنی که توش تگ و کاراکترای خاص بود رو حذف کنه ولی مشکلی که هست اینه که میخوام تگ <br> رو نگهداره و حذف نکنه چیکار کنم لطفا کمک کنید.


$search = array ("'<script[^>]*?>.*?</script>'si", // Strip out javascript
"'<[/!]*?[^<>]*?>'si", // Strip out HTML tags
"'([rn])[s]+'", // Strip out white space
"'&(quot|#34);'i", // Replace HTML entities
"'&(amp|#38);'i",
"'&(lt|#60);'i",
"'&(gt|#62);'i",
"'&(nbsp|#160);'i",
"'&(iexcl|#161);'i",
"'&(cent|#162);'i",
"'&(pound|#163);'i",
"'&(copy|#169);'i",
"'&#(d+);'e"); // evaluate as php

$replace = array (" ",
" ",
"\1",
"\"",
"&",
"<",
">",
" ",
chr(161),
chr(162),
chr(163),
chr(169),
"");

$text = preg_replace($search, $replace, $ncontent);

ghasemweb
دوشنبه 24 مرداد 1390, 19:31 عصر
اساتید منتظر راه حل کارسازتون هستم

eshpilen
دوشنبه 24 مرداد 1390, 21:29 عصر
بنظرم این خوب کار میکنه:

<?php

header('Content-type: text/plain');

$content='<html>xx-<BR>-<br >-<br />-<br/><script>tt</script></html>';

$search = array ("'<script[^>]*?>.*?</script>'si", // Strip out javascript
"'<br[^<>]*?>'i",
"'<[/!]*?[^<>]*?>'si", // Strip out HTML tags
"'([rn])[s]+'", // Strip out white space
"'&(quot|#34);'i", // Replace HTML entities
"'&(amp|#38);'i",
"'&(lt|#60);'i",
"'&(gt|#62);'i",
"'&(nbsp|#160);'i",
"'&(iexcl|#161);'i",
"'&(cent|#162);'i",
"'&(pound|#163);'i",
"'&(copy|#169);'i",
"'&#(d+);'e"); // evaluate as php

$replace = array (" ",
"&lt;br /&gt;",
" ",
"\1",
"\"",
"&",
"<",
">",
" ",
chr(161),
chr(162),
chr(163),
chr(169),
"");

echo 'Before:', $content, "\n\n";
echo 'After:', preg_replace($search, $replace, $content);

?>
البته این شاید بیشتر یه ترفند باشه. چون سعی کردم از دستکاری رگولار اکسپرشن موجود و ایجاد یک رگولار اکسپرشن پیچیده اجتناب کنم. بخاطر همین یجوری از جایگزینی های بعدی در این مورد استفاده کردم. اگر بقیهء کدش رو تغییر ندی مشکلی پیش نمیاد.
احتمالا تغییر دادن <[/!]*?[^<>]*?> اصولی تر باشه، ولی بنظرم این کار پیچیده تر هست و احتمال ایجاد باگ توش بالا هست؛ بخاطر همین ترجیح دادم یه رگولار اکسپرشن جداگانه بنویسم (خوبیش اینه هر تگ دیگری رو هم بخوای میتونی به همین شکل براحتی مستثنی کنی). حالا یخورده فکر کنیم و شاید هم در این اثنا کسی یه نمونه از این روش رو ارائه کرد.

ghasemweb
دوشنبه 24 مرداد 1390, 22:44 عصر
ممنون کارم راه افتاد. راستش من در مورد رگولار اکسپرشن چیز زیادی نمیدونم اگه مقاله و مطلب اموزش دارید لطف میکنید در اختیارمون بذارید.
راستی اگه بخوای به جای یه متن معمولی یه متن دیگه رو جایگزین کنی چطوری میشه مثلا به جای false فضای خالی بذاره؟؟

eshpilen
دوشنبه 24 مرداد 1390, 23:44 عصر
ممنون کارم راه افتاد. راستش من در مورد رگولار اکسپرشن چیز زیادی نمیدونم اگه مقاله و مطلب اموزش دارید لطف میکنید در اختیارمون بذارید.

منبع انگلیسی خوب که زیاد هست؛ نیازی به معرفی نیست، یه سرچ بکنی ده تاش میریزه. فارسی هم که بذار در کوزه آبش رو بخور. اصلا طرفش نرفتم و گذری هم چیز درست و حسابی ندیدم.


راستی اگه بخوای به جای یه متن معمولی یه متن دیگه رو جایگزین کنی چطوری میشه مثلا به جای false فضای خالی بذاره؟؟
این کارا رو که با توابعی مثل str_replace هم میشه بسادگی انجام داد!

eshpilen
چهارشنبه 26 مرداد 1390, 10:23 صبح
این رگولار اکسپرشنی که برای Strip out کردن تگهای HTML در کد شما بود (<[/!]*?[^<>]*?>) برام مقداری عجیب بود. چون ظاهرا یه بخشهایی اضافه داره که نباشن هم هیچ فرقی نمیکنه.
در پشت پرده بنده با جناب eAmin (http://barnamenevis.org/member.php?58981-eAmin) هم بخاطر اینکه بنظرم در مبحث رگولار اکسپرشن وارد هستن تماس گرفتم و نظر ایشون رو خواستم.
ایشون گفتن:

راستش متوجه نمی شم، اگر منظورش فقط strip کردن تگها بوده باشه که استفاده از این الگوی ساده به اندازه کافی کارآمد هست بنظرم و حتی یک < اضافی هست!

<[^>]*?>با این گفتهء ایشون توجه بنده هم به وجود کاراکتر آغازین تگ (علامت کوچکتر) در این رگولار اکسپرشن جلب شد و مشکوک شدم که اصلا یه نقطهء ضعف و راه نفوذه. با تستی که انجام دادم این شک تایید شد.
الان شما این رشته رو با کد مربوطه تست کنید:

$content='<html>xx-<BR>-<br >-<br />-<br/><img alt="<>" src="t.jpg">tt</b></html>';
مشاهده میفرمایید که تگ img حذف نمیشه و صحیح و سالم تحویل خروجی میشه!!

بنظر میرسه رگولار اکسپرشن ارائه شده یک حفرهء نسبتا بزرگ داره. نه؟
مگه قرار نیست تمام تگها حذف بشن؟

حالا راه حل چیست، بنظر ساده میرسه (حذف علامت کوچکتر از رگولار اکسپرشن)، اما شایدم به این راحتی نباشه! امنیت هست و پیچیدگی.
منتظر بحثهای بعدی و همچنین همکاری احتمالی جناب eAmin (http://barnamenevis.org/member.php?58981-eAmin) در این مورد خواهم بود.

--------------------------------
ویرایش:
یه امکان دیگه هم وجود داره و اون اینکه این کدها برای کاربرد خاصی بودن که برای اون کاربرد خاص باید به این شکل میبودن!
شما این کدها رو از کجا آوردید؟ برای چه کاربردی بودن؟
و شما قصد دارید برای چه کاربردی از این الگوریتم استفاده کنید؟

eshpilen
چهارشنبه 26 مرداد 1390, 11:12 صبح
آقا جان اصلا معلوم هست این کد برای چه کاری بوده؟ از کجا آوردیش؟ واسه چی میخوای استفاده کنی؟
آخه این اصلا انگار برای کاربرد خاصی هست که همینجوری دیتای خام از سمت کاربر نمیاد.
مثلا این رو تست کنی:

$content='&lt;script&gt;';
$content=htmlspecialchars($content);
حتی با اینکه از htmlspecialchars استفاده کردیم، در خروجی تگ HTML تولید میشه.

ghasemweb
چهارشنبه 26 مرداد 1390, 11:51 صبح
کاربر میاد یه مطلبی رو تو دیتابیس درج میکنه که چون از ادیتور استفاده کردم تگهای html هم تو دیتابیس ذخیره میشه،حالا من میخوام بیام تو صفحه اصلی سایت 50 تا از این رکورد رو نمایش بدم که میخوام بخشی از مطلب رو نشون بدم نه همشو من اومدم مستقیم از تابع mb_substr استفاده کردم ولی نشد به خاطر این که ساختار قالب به هم ریخت. وقتی من این کار رو یا 10 رکورد تست کردم درست شد ولی با بیش از 10 تا رکورد قالب به هم میریزه .
اما وقتی از این روش میام تگها رو فیلتر میکنم مشکم تو قالب حل میشه و ادامه داستان هم خودتون مستحضرید.
راستی من این روش رو از تایپیک مشکل در substr کردن متن نوشته شده در rich textbox (http://barnamenevis.org/showthread.php?298461-%D9%85%D8%B4%DA%A9%D9%84-%D8%AF%D8%B1-substr-%DA%A9%D8%B1%D8%AF%D9%86-%D9%85%D8%AA%D9%86-%D9%86%D9%88%D8%B4%D8%AA%D9%87-%D8%B4%D8%AF%D9%87-%D8%AF%D8%B1-rich-textbox) به دست آوردم

eshpilen
پنج شنبه 27 مرداد 1390, 01:49 صبح
حالا مطمئنی این روش امنیت داره؟ یعنی کاربر نمیتونه مشابه اون نمونه کدهایی که در بالاتر گفتم رو به برنامه بده و خروجی HTML رو توی صفحات شما تزریق کنه؟

ghasemweb
پنج شنبه 27 مرداد 1390, 04:52 صبح
فکری واسه امنیتش نکردم شاید حق با شم باشه اگه لطف کنید حفره هاشو بگید که برطرف کنم و الا امنیت سایت به خطر میفته

eshpilen
پنج شنبه 27 مرداد 1390, 08:47 صبح
بنده با ویرایشگرهای WYSIWYG کار نکردم و نمیدونم داستانش چطوریه.
شما خودتون تست کنید.
مثلا این رو از طرف کاربر تایپ/Paste کنید و ببینید وقتی در دیتابیس شما ثبت میشه و بعدش اون رو در صفحهء اصلی سایت نمایش میدید آیا کد جاوااسکریپت اجرا میشه یا نه (اگر اجرا بشه یه پیام alert میده):

&lt;script&gt;alert(123);&lt;/script&gt;
این رو هم تست کنید:

<img alt="<>" src="123.jpg">
در این مورد چون شاید وجود این تگ تصویر در صفحه مشخص نشه، در سورس صفحه در مرورگر برای عبارت 123 سرچ کنید ببینید این تگ درج شده یا نه.

ghasemweb
پنج شنبه 27 مرداد 1390, 15:46 عصر
دقیقا حق با شماست هر دو کد اجرا میشه!!!
چیکار باید کرد نمیشه رگولار اکسپرشن رو طوری تغییر داد که این مشکل حل بشه. اصلا در مورد رگولار اکسپرش یه مقاله بذار که بخونم شاید یاد گرفتیم.

eshpilen
پنج شنبه 27 مرداد 1390, 18:37 عصر
دقیقا حق با شماست هر دو کد اجرا میشه!!!
الله اکبر الله اکبر :لبخند:


چیکار باید کرد نمیشه رگولار اکسپرشن رو طوری تغییر داد که این مشکل حل بشه.
اول باید اطلاعات مربوط به ویرایشگرهای WYSIWYG رو بخونم. تاحالا استفاده نکردم. ببینم وقت میکنم و توی چه مایه هاست کارش میتونم روش کار کنم یا نه.
شما از چه ادیتوری استفاده کردید؟ اگر لینک دانلود و رفرنسش هم دم دستت هست بذار.


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

ghasemweb
پنج شنبه 27 مرداد 1390, 23:16 عصر
شما از چه ادیتوری استفاده کردید؟ اگر لینک دانلود و رفرنسش هم دم دستت هست بذار.
از ckEditor لینک سایت سازندش (http://dev.ckeditor.com/ticket/6107)



شما میخوای فرمت هایی که کاربر در ادیتور اعمال کرده در خروجی صفحهء شما هم حفظ بشن دیگه؟

تو صفحه اصلی که میخوام بخشی از متن نشون داده بشه نه.فرمت برداشته بشه و متن عادی باشه ولی تو ادامه مطلب با فرمت کامل!

eAmin
پنج شنبه 27 مرداد 1390, 23:59 عصر
سلام

اینجا یک سوال پیش میاد، اینکه از این ادیتور قراره چه کسانی استفاده کنند؟ یا بهتر اینکه چه کسانی اجازه ی ارسال با استفاده از ادیتور رو دارند؟ اگر فقط کاربران با دسترسی ادمین باشه میشه گفت بود یا نبود این کد (البته قسمت strip کردن تگها) هیچ فرقی به حال امنیت سایت نمیکنه. شما به کدهاش خوب دقت کنید، اول آمده کدهای html رو strip کرده که البته اون هم بدرستی کارش رو انجام نمیده و بعد دوباره آمده هرچی &lt و &gt بوده رو دوباره به < و > تبدیل کرده! پس نتیجه میگیریم که این کدها فقط برای یک کاربر با دسترسی admin مناسبه. و حتی نیازی هم به این کدها نیست و می تونید با استفاده از htmlspecialchars و html_entity_decode اینکار ها رو انجام بدید، چون همونطور که گفتم در کدهایی که شما قرار دادید در اصل داره کار همین دوتابع رو شبیه سازی میکنه!

ولی اگر قراره کاربرانی که با این ادیتور سر و کار دارند عموم کاربران باشه و نیاز به امنیت بالا داشته باشه و جلوی حملاتی مانند xss جلوگیری کنه، باید به فکر پیاده سازی یک HTMLParser بیوفتید. برای این منظور بد نیست به اینجا یک نگاهی بندازید: OWASP AntiSamy Project (https://www.owasp.org/index.php/Category:OWASP_AntiSamy_Project) و همچنین این (http://refactormycode.com/codes/333-sanitize-html) رو هم برای ایده گرفتن نگاه کنید.

در ضمن این 2-3 تیکه کد رو فقط برای تست و قبل از اینکه به نتیجه ی کلی برسم نوشتم، شاید برای بهتر روشن شدن یک سری چیزها خوب باشه:


<?php
// Note: for testing purposes only
header('Content-type: text/plain');

$content = "
&lt;script&gt;alert(123);&lt;/script&gt;
<script>alert('1234')</script>
<p>asdfgvnujsiedgusiugb</p>
<p>asdfgvnujsiedgusiugb</p>
<p>asdfgvnujsiedgusiugb</p>
<p>asdfgvnujsiedgusiugb</p>
<span>dfihjodtrjhodrtpjhpoidgjrhioj <br /> <br></span>
fgnjhfgjfgjfjftfky
";

$html = htmlspecialchars($content, ENT_QUOTES);

$search = array("&lt;br /&gt;", "&lt;br&gt;");
$mContent = str_replace($search, "<br />", $html);

echo $mContent;

echo "\n\n";
echo html_entity_decode($html);
?>

eAmin
جمعه 28 مرداد 1390, 00:18 صبح
ویرایش: به هیچ عنوان از این تابع استفاده نکنید!
این تابع هم از مدیریت محتوای GetSimple (http://get-simple.info) هست:


/**
* Anti-XSS
*
* Attempts to clean variables from XSS attacks
* @since 2.03

* @author Martijn van der Ven
*
* @param string $str The string to be stripped of XSS attempts
* @return string
*/
function antixss($str){
// attributes blacklist:
$attr = array('style','on[a-z]+');
// elements blacklist:
$elem = array('script','iframe','embed','object');
// extermination:
$str = preg_replace('#<!--.*?-->?#', '', $str);
$str = preg_replace('#<!--#', '', $str);
$str = preg_replace('#(<[a-z]+(\s+[a-z][a-z\-]+\s*=\s*(\'[^\']*\'|"[^"]*"|[^\'">][^\s>]*))*)\s+href\s*=\s*(\'javascript:[^\']*\'|"javascript:[^"]*"|javascript:[^\s>]*)((\s+[a-z][a-z\-]*\s*=\s*(\'[^\']*\'|"[^"]*"|[^\'">][^\s>]*))*\s*>)#is', '$1$5', $str);
foreach($attr as $a) {
$regex = '(<[a-z]+(\s+[a-z][a-z\-]+\s*=\s*(\'[^\']*\'|"[^"]*"|[^\'">][^\s>]*))*)\s+'.$a.'\s*=\s*(\'[^\']*\'|"[^"]*"|[^\'">][^\s>]*)((\s+[a-z][a-z\-]*\s*=\s*(\'[^\']*\'|"[^"]*"|[^\'">][^\s>]*))*\s*>)';
$str = preg_replace('#'.$regex.'#is', '$1$5', $str);
}
foreach($elem as $e) {
$regex = '<'.$e.'(\s+[a-z][a-z\-]*\s*=\s*(\'[^\']*\'|"[^"]*"|[^\'">][^\s>]*))*\s*>.*?<\/'.$e.'\s*>';
$str = preg_replace('#'.$regex.'#is', '', $str);
}
return $str;
}

eshpilen
جمعه 28 مرداد 1390, 13:48 عصر
از ckEditor لینک سایت سازندش (http://dev.ckeditor.com/ticket/6107)

تو صفحه اصلی که میخوام بخشی از متن نشون داده بشه نه.فرمت برداشته بشه و متن عادی باشه ولی تو ادامه مطلب با فرمت کامل!
بنده چند ساعتی هست روی این موضوع تحقیق کردم.
همونطور که حدس میزدم بنظر میاد این قضیه حجم و پیچیدگی قابل توجهی داشته باشه. یعنی نه اونقدری که بنده الان اولویت و وقتی براش داشته باشم. این یه چیزی خارج از برنامه بود که گفتم ببینم شاید بتونم با یه مقدار تحقیق و تست کاری انجام بدم.
با اینکه در این وقت محدود نتونستم بصورت کامل به نتیجه ای برسم اما فکر میکنم سرنخها و مطالب مفیدی پیدا کردم که بدرد شما بخورن. شاید هم کلا مشکل شما رو حل کنن. مهم در درجهء اول جلوگیری از حمله های XSS بود که خوشبختانه بنده یک برنامهء آماده تحت GPL برای این کار پیدا کردم که با توجه به تستها تاجاییکه تونستم انجام بدم بنظر میرسه بقدر کافی خوب باشه.
این برنامه اسمش htmLawed هست؛ لینک های زیر رو ببینید:
http://www.bioinformatics.org/phplabware/internal_utilities/htmLawed/secure_JS_WYSIWYG.htm
http://www.bioinformatics.org/phplabware/internal_utilities/htmLawed/htmLawed_README.htm
http://www.bioinformatics.org/phplabware/internal_utilities/htmLawed/rsnake/RSnakeXSSTest.htm
از رفرنس و تشکیلات و امکانات مفصلی که داره بنظر میاد یه چیز حرفه ای باشه.

این لینک هم جهت کامل بودن رفرنسها برای علاقمندان به امنیت فکر میکنم جالب باشه (مربوط به XSS است): http://ha.ckers.org/xss.html

لینک دانلود htmLawed رو در این صفحه پیدا میکنید:
http://www.bioinformatics.org/phplabware/internal_utilities/htmLawed/more.htm

خب حالا روش استفاده چطوریه. خیلی ساده است. فقط یک فایل داره بنام htmLawed.php که اینکلود میکنید و بقیهء ماجرا که در قطعه کد زیر میبینید:

include_once('./htmLawed.php');
$safe_str=htmLawed($contents, array('safe'=>1));
این کد الان محتویات $contents رو گرفته و نسخهء بی خطر شدهء اون رو در متغییر $safe_str ذخیره میکنه. لزوما همهء این کدها کلا حذف نمیشن، اما به فرمی تبدیل میشن که هنگام درج در بطن سند HTML خطر XSS وجود نداشته باشه.
توجه داشته باشید که این کد الان تگهایی مثل img رو حذف یا غیرفعال نمیکنه. یعنی کاربران قادر هستن در پست خودشون از تصویر استفاده کنن؛ خب این چون اغلب جزو امکانات ادیتورهای WYSIWYG هست بنابراین غیرعادی بحساب نمیاد.
اما شما احتمالا میخواید که بعضی از تگهای HTML رو اجازه ندید (Black list) یا فقط بعضی از تگها رو اجازه بدید و بقیه رو اجازه ندید (White list). هردوی این کارها توسط این برنامه امکانپذیر هستن.
مثالی از لیست سفید:

htmLawed($in, array('safe'=>1, 'elements'=>'a, b, strong, i, em, li, ol, ul'));
همونطور که میبینید فقط تگهای محدودی مثل تگ لینک، Bold و لیست و غیره اجازه داده شدن. بقیهء تگهای HTML مثل تگ img حذف خواهند شد.

مثالی از لیست سیاه:

htmLawed($contents, array('safe'=>1, 'elements'=>'* -table -tr -td -th -tfoot -thead -col -colgroup -caption -img')
همهء تگها بجز تگهای مربوط به جدول و تگهای تصویر اجازه داده شدن.
البته تگ img رو بنده به مثال اصلی خودش اضافه کردم.

راستی تگهای applet-embed-iframe-object-script هم بصورت خودکار چه شما اونا رو تعیین بکنید و چه نکنید چه در لیست سیاه و چه در لیست سفید بهرصورت حذف میشن، چون اینها تگهای خطرناک بحساب میان که میشه باهاشون حملات XSS و احتمالا انواع حملات دیگری مثل XSRF رو صورت داد.

ضمنا سعی کنید حتی الامکان از لیست سفید که امن تره استفاده کنید. یعنی ببینید ویرایشگر شما چه امکاناتی رو میده (درج تصویر، سایز نوشته، Bold کردن و غیره) و فقط تگهایی رو که برای اون فرمتها نیاز هستن در لیست سفید خودتون درج کنید.


تو صفحه اصلی که میخوام بخشی از متن نشون داده بشه نهپس میخواید در اونجا فقط متن باقی بمونه؟ (و البته تگهای br)
این مورد جداست و انشاا... بعد بهش میپردازیم.

eshpilen
جمعه 28 مرداد 1390, 14:19 عصر
باید به فکر پیاده سازی یک HTMLParser بیوفتید.

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

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


برای این منظور بد نیست به اینجا یک نگاهی بندازید: OWASP AntiSamy Project (https://www.owasp.org/index.php/Category:OWASP_AntiSamy_Project) این لینک با اینترنت دایالاپ درپیت بنده که چند روزه قاط هم زده باز نشد. بعدا بهش نگاه میکنم.


این تابع هم از مدیریت محتوای GetSimple (http://get-simple.info/) هست، بنظر خوب عمل میکنه و جلوی اکثر روشهای xss گرفته شدهدر ابتدا تشکر میکنم از شما که دنبال راه اصولی تحقیق رفتید و از یک نرم افزار CMS روشی رو پیدا و مطرح کردید. بنده کد و رگولار اکسپرشن هاش رو مطالعه کردم و در وهلهء اول بنظرم جالب و خوب آمد، اما به زودی ضعف و حفره های متعددی بنظرم آمد و تست کردم و دیدم که ظاهرا مثل آبکش سوراخ سوراخه و جلوی سناریوهای نسبتا ساده ای رو نمیتونه بگیره.
بطور مثال جلوی این رو:

<script>alert(1);</script ddd>
حتی این رو:

<script src="2.js" />
این رو:

<a href="javascript:alert(5);">xss link</a>
بجای حرف j در javascript مقدار Numeric character reference (http://en.wikipedia.org/wiki/Numeric_character_reference) اون رو بذارید (کد 106).
ظاهرا نرم افزار این فروم کد بنده رو تبدیل میکنه و دیده نمیشه.
ضمنا اگر تگهای b رو در این کد میبینید اینا رو هم نرم افزار فروم خودش اضافه کرده و باید حذف بشن.

و این رو:

<embed src="4.mpg">

بنده که واقعا شگفت زده شدم از اینهمه درپیتی!! فکر میکردم چون کد مال یک نرم افزار CMS هست حتما حرفه ایه! عجیبه :متفکر:

eAmin
جمعه 28 مرداد 1390, 16:54 عصر
نوشتن HTMLParser اصلا کار ساده ای نیست. یعنی منظور ما چون امنیت هست این کار خیلی خیلی ظریف هست. راههای حملهء زیادی هست که هرکدوم ممکنه روی یک مرورگر و نسخه کار کنن. ضمنا HTML و بقیهء استانداردها و مرورگرها متحول میشن و این کدها باید مدام بررسی و آپدیت بشن. خلاصه اطمینان 100% در این روش اگر غیرممکن نباشه، بسیار دشواره.
در اینکه نوشتن یک HTMLParser کار هر کسی نیست و نیاز به تجربه و دانش خاص خودش رو می خواد، هیچ شکی در اون نیست! ولی منظور بنده در این حد بود که فقط اجازه بدیم تگهای خاصی بصورت کاملا Strict به عنوان ورودی دریافت بشه. اگر فرمایشات چند ماه قبل Mehdi Moosavi رو در این بخش مطالعه کرده باشید، اینکه ایشون گفتند که ما/Developer نباید در نظر بگیره که چه کاراکترهایی قراره وارد بشه بلکه در عوض ما/Developer باید بگیم که کاربر مجازه از چه کاراکترهایی استفاده کنه؟! یعنی کاربر رو محدود به کاراکترهایی کنیم که فقط ما براش تعریف کردیم. (البته ایشون هم از یک فرد با تجربه نقل کردند)
به نظر من هم اگر فقط این مورد رو رعایت کنیم میشه گفت امنیت ورودی ما کامل خواهد بود!

این برنامه اسمش htmLawed هست؛
برنامه جمع و جور خوبی بود، ولی کامل تر از این برنامه هم هست. همونطور که در لینکهایی که بالا معرفی کردم، یک برنامه به نام HTML Purifier (http://htmlpurifier.org/) معرفی شده بود که از هر لحاظ میشه گفت کامله.


هرچند بنده دقیقا نمیدونم مثلا این فروم از چه روشی استفاده میکنه. آیا مستقیما فرمت HTML رو میپذیره یا از BBCode استفاده میکنه؟
و بنده میگم آیا نمیشه بجای سر و کله زدن با HTML خطرناک، در همهء موارد از BBCode استفاده کنیم؟

این فروم ها از قابلیت BBCode استفاده میکنند، البته امکان این رو دارند که از HTML پشتیبانی کنند ولی در اکثر فروم های ایرانی بخاطر ضعف امنیتی که بوجود می یاد، این قابلیت برای کاربران غیر قابل استفاده شده. کافیه قابلیت HTML رو در فروم ها فعال کنند تا در یک تاپیک یک پست با حملات XSS ایجاد بشه، اونوقت هر کسی که از اون تاپیک بازدید کنه تمامی کوکی هاش دزدیده شده و ادامه ماجرا...
با شما موافقم، میشه از BBCode ها بجای تمامی کدها HTML استفاده کرد و نگران موارد دیگه نبود.


بنده کد و رگولار اکسپرشن هاش رو مطالعه کردم و در وهلهء اول بنظرم جالب و خوب آمد، اما به زودی ضعف و حفره های متعددی بنظرم آمد و تست کردم و دیدم که ظاهرا مثل آبکش سوراخ سوراخه و جلوی سناریوهای نسبتا ساده ای رو نمیتونه بگیره.

بنده هم همینطور گول الگوهای RegExp ش رو خوردم!

eshpilen
جمعه 28 مرداد 1390, 17:49 عصر
در اینکه نوشتن یک HTMLParser کار هر کسی نیست و نیاز به تجربه و دانش خاص خودش رو می خواد، هیچ شکی در اون نیست! ولی منظور بنده در این حد بود که فقط اجازه بدیم تگهای خاصی بصورت کاملا Strict به عنوان ورودی دریافت بشه. اگر فرمایشات چند ماه قبل Mehdi Moosavi رو در این بخش مطالعه کرده باشید، اینکه ایشون گفتند که ما/Developer نباید در نظر بگیره که چه کاراکترهایی قراره وارد بشه بلکه در عوض ما/Developer باید بگیم که کاربر مجازه از چه کاراکترهایی استفاده کنه؟! یعنی کاربر رو محدود به کاراکترهایی کنیم که فقط ما براش تعریف کردیم. (البته ایشون هم از یک فرد با تجربه نقل کردند)
به نظر من هم اگر فقط این مورد رو رعایت کنیم میشه گفت امنیت ورودی ما کامل خواهد بود!

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


برنامه جمع و جور خوبی بود، ولی کامل تر از این برنامه هم هست. همونطور که در لینکهایی که بالا معرفی کردم، یک برنامه به نام HTML Purifier (http://htmlpurifier.org/) معرفی شده بود که از هر لحاظ میشه گفت کامله.ممنون.
اینم سرفرصت تست کنم ببینم چطوریه.
کدهاشون رو که وقت ندارم بخونم. اونا که خوندم چون کم‌حجم بودن.
راستی اگر این راه حلها وجود داره پس چرا ملت همش میان میگن مشکل دارم و چکار کنم؟!



این فروم ها از قابلیت BBCode استفاده میکنند، البته امکان این رو دارند که از HTML پشتیبانی کنند ولی در اکثر فروم های ایرانی بخاطر ضعف امنیتی که بوجود می یاد، این قابلیت برای کاربران غیر قابل استفاده شده. کافیه قابلیت HTML رو در فروم ها فعال کنند تا در یک تاپیک یک پست با حملات XSS ایجاد بشه، اونوقت هر کسی که از اون تاپیک بازدید کنه تمامی کوکی هاش دزدیده شده و ادامه ماجرا...
با شما موافقم، میشه از BBCode ها بجای تمامی کدها HTML استفاده کرد و نگران موارد دیگه نبود.البته فکر نمیکنم هر BBCode ای هم کاملا امن باشه. بازم باید یه چیزایی رو چک و محدود کنیم.
مثلا در BBCode مربوط به لینک اگر کاربر بنویسه javascript:xxs و ما همینطوری این رو در href تگ a درج کنیم مسلما حمله صورت میگیره.
البته احتمالا باید از برنامه های آماده برای کار با BBCode استفاده کنیم که حتما خودشون این موارد رو لحاظ کردن.

بنده هم همینطور گول الگوهای RegExp ش رو خوردم!کدش رو از کجا آوردید؟
میگم باهاشون تماس بگیرم جایزه دریافت کنم :لبخند:

eshpilen
جمعه 28 مرداد 1390, 20:03 عصر
بنده نتونستم یه نمونه کد برای فیلتر کردن خروجی ادیتورهای WYSIWYG با استفاده از HTML Purifier پیدا کنم. اگر شما تونستید یه نمونه درج کنید.

eshpilen
جمعه 28 مرداد 1390, 20:43 عصر
بذار این مبحث رو کامل کنیم بره پی کارش. تقریبا سه چهارم روز روش کار کردم! اون یک چهارم دیگه رو هم خواب بودم :لبخند:

خب مورد دیگه این بود که میخواید خلاصهء مطلب رو بدون فرمت در صفحه درج کنید.
بنده فکر میکنم در اینمورد هم میتونیم و باید مجددا از htmLawed استفاده کنیم. ولی ممکنه تنظیم یا عملیات اضافی خاصی نیاز داشته باشه؛ اگر اشکالی بود بگید.

روش کار هم فکر میکنم به همین سادگی باشه:

htmLawed($in, array('safe'=>1, 'elements'=>'br'));
فقط تگ br رو اجازه دادیم.
فقط یه وقت ممکنه کاراکترهای بی خطر و بیهوده ای از عملیات فیلتر باقی بمونن که اونوقت باید سعی کنیم اونا رو قبل از انجام این عملیات با روشهای سادهء خودمون حذف کنیم.

ghasemweb
جمعه 28 مرداد 1390, 21:20 عصر
تست کردم ولی اون کدهایی که شما قبلا گذاشته بودی رو عبور میده و هم این 'elements'=>'br' بود و نبودش تاثیری نداره یعنی اگه یه وقت بخوام تگ br رو عبور ندم نمیشه

eshpilen
جمعه 28 مرداد 1390, 22:42 عصر
من اینو تست کردم نشد یعنی اون کدهایی که شما گفته بودی از فیلتر رذ میشه.

کدوم رو تست کردید؟
و دقیقا چه چیزی رد میشه؟
رشتهء ورودی و خروجی مورد تست رو درج کنید.



نمیدونم این حرفم درسته یا نه میشه خیلی راحتر از اینا مشکل منو حل کرد البته که نظر من هست و شاید ضعف داشته باشه. به کد زیر توجه کنید


<?php
$content='&lt;script&gt;سلام به <br/>اساتید محترم ';
$wlist='ضصثقفغعهخحجچپشسیبلاتن مکگظطزرذدئوژ ه ';
for($i=0;$i<=mb_strlen($content,'utf8');$i++)
{
if(strpos($wlist,mb_substr($content,$i,1))===false )
$h='';
else
$s.=mb_substr($content,$i,1,'utf8');

}
echo $s;
?>


یه جورایی لیست سفید گذاشتم ولی نمیدونم این br رو چیکارش کنمآهان فکر کنم منظورت رو از گفتهء قبلی هم فهمیدم.
بله اون اجازهء رد شدن بعضی چیزا رو میده، ولی اونا پس مانده هستن و خطری ندارن! مهم اینه که از اجرا شدن کد در مرورگر جلوگیری شده. ما اون کدهای خطرناک رو از طرف نفوذگر نوشتیم، در پست عادی کاربر که از اون چیزا نیست. حالا اگر در ورودی عادی هم چیزایی در خروجی دیده میشه که متن عادی نیست بگید تا یه فکری براش بکنیم. عینا رشتهء ورودی و خروجی رو درج کنید، چون بنده از اون ادیتورها ندارم که خودم تست کنم (حجمش زیاد بود دانلود نکردم).

این روش شما هم میتونه قابل قبول باشه، ولی خیلی محدود کننده هست که البته برای کاربرد شما شاید مشکلی نباشه، و بقول خودتون باید فکری برای مورد تگ br هم بکنید. راستی مثلا حروف انگلیسی چی؟ علامتگذاری هاش چی؟ اونا رو کاربر نمیتونه تایپ کنه؟

ضمنا مگه نگفتید در بخش «ادامهء مطلب» میخواید تمام فرمتها حفظ بشن. پس بالاخره باید از اون برنامه استفاده کنید، وگرنه راه دیگری بنظرتون میرسه؟

eshpilen
جمعه 28 مرداد 1390, 23:09 عصر
درمورد br هم میتونی اول تمام تگهای br رو با کاراکتر New line جایگزین کنی، و بعد از اجرای روش خودت روی رشته، مجددا تمام New line ها رو با تگ br جایگزین کنی.

ghasemweb
شنبه 29 مرداد 1390, 10:06 صبح
این روشی که من گفتم یه مشکل عمده داره که تقریبا بیخیالش شدم . به این دلیل که پردازش زیادی باید انجام بشه و کلی سرعت بارگذاری صفحه رو کند میکنه.
بله حق با شماست این کدهایی که رد میشه خطری نداره ولی نمیخوام نمایش داده بشه و حذف بشن بهتره.به نظرم همین htmLawed که گفتید خوبه ولی باز جای کار اینجور کدهارو حذف کنه.

eshpilen
شنبه 29 مرداد 1390, 11:32 صبح
ببین کاربر عادی که از اینطور چیزا وارد نمیکنه. اونی که وارد میکنه نفوذگره که بعدش که شما پستش رو دیدی میتونی این رو بفهمی و حذفش کنی (اصلا خود طرف رو هم حذف کن!!).
البته بیشتر میشه روش کار کرد و مثلا محتویات تگها رو هم حذف کرد (htmLawed فقط خود تگها رو حذف یا بی اثر میکنه - البته شاید آپشنی برای این داشته باشه). مثلا شما میتونی روشهای دیگر رو قبل از اعمال htmLawed بکار ببری که اونا تگها رو با محتویاتشون کلا حذف کنن. اعمال htmLawed بعد از بقیهء روشها برای تامین امنیت لازمه تا چیزهایی رو که روشهای دیگه نتونستن فیلتر کنن بی خطر کنه.
مثلا همون روشی رو که خودت در ابتدای تاپیک دادی میتونی تست کنی. اول اون رو روی متن اجرا کن و بعد htmLawed کن ببین نتیجه چی میشه.
بنده دیگه وقت ندارم. تاحدی که به امنیت مربوط میشد درمورد اصل مطلب تحقیق کردم. بقیش دیگه جزییات کاره و به خود شما مربوط میشه.

eshpilen
شنبه 29 مرداد 1390, 11:50 صبح
البته این رو هم امتحان کن:

htmLawed($contents, array('safe'=>1, 'keep_bad'=>0));
شاید این اون کاری رو که میخوای انجام بده.

ضمنا فکر نمیکنم به راحتی چیزی بهتر از htmLawed برای اینطور کارها پیدا بشه. داکیومنتش رو نگاه کنی اغراق نیست بگیم ده ها مورد بیش از آنچه ما میدونیم و به فکرمون میرسه رو چک و اصلاح میکنه. معلومه مطالعه و کار زیاد حرفه ای پشتش بوده.

البته HTML Purifier هم که معرفی شد چیز مجهزیه، ولی حجمش خیلی بیشتره و بنظرم کلی تر باشه. استفاده ازش در چنین کاربردهایی فکر نمیکنم اصلا بقدر htmLawed سرراست و مختصر باشه. مثال هم که پیدا نکردم. کسی اگر پیدا کرد در تاپیک درج کنه.

ghasemweb
شنبه 29 مرداد 1390, 20:55 عصر
ممنونم که وقت گذاشتید و مشکل رو بررسی و تحلیل کردید من هم موافقم که htmLawed قوی و با کاربری آسان به نظر میرسه.
ولی هنوز موفق نشدم به خواسته خودم برسم.


البته این رو هم امتحان کن:

htmLawed($contents, array('safe'=>1, 'keep_bad'=>0));
شاید این اون کاری رو که میخوای انجام بده.


مثلا این کد تغییری تو خروجی بوجود نیاورد:متفکر:
راستی برخلاف عنوان تایپیک که فوری بود فعلا عجله ای ندارم سر فرصت جواب بدید ممنون

eshpilen
شنبه 29 مرداد 1390, 23:12 عصر
ورودی شما چی بوده و خروجی چی بوده و چی میخواید باشه؟ دقیقا مشخص کنید و عین رشته ها و تشکیلاتش رو بذارید تا بنده هم بتونم تست کنم.

ghasemweb
یک شنبه 30 مرداد 1390, 13:49 عصر
مثلا در این مثال ورودی من این هست که همون کدهای شما رو اولش گذاشتم واسه تست:


<img alt="<>" src="123.jpg">
321
&lt;script&gt;alert(123);&lt;/script&gt;
سلام


خروجی هم این هست :



" src="123.jpg"> 321 <script>alert(123);</script>
سلام


میخوام فقط متن سلام در خرجی باشه؟ و البته اگر تگ br هم بود در خروجی تاثیر بذاره

eshpilen
یک شنبه 30 مرداد 1390, 20:59 عصر
یعنی میخواید فقط حروف فارسی از الف تا ی باقی بمونه؟
هیچ چیز دیگه ای در خروجی نباشه؟ مثلا نقطه هم حذف بشه؟ و هرگونه علامتی مثل علامت مساوی، خط تیره، @، پرانتز و غیره؟
هیچ عددی هم نباشه؟

ghasemweb
یک شنبه 30 مرداد 1390, 22:26 عصر
یعنی میخواید فقط حروف فارسی از الف تا ی باقی بمونه؟
هیچ چیز دیگه ای در خروجی نباشه؟ مثلا نقطه هم حذف بشه؟ و هرگونه علامتی مثل علامت مساوی، خط تیره، @، پرانتز و غیره؟
هیچ عددی هم نباشه؟

نه همش

حروف فارسی
اعداد
برخی اعراب و علائمی که واسه متن فارسی کاربرد داره مثل پرانتز و آکولاد و ...
بعضی از چیزا هم یادم نیست

راستی تگ br هم که باشه:بامزه:

amin1softco
یک شنبه 30 مرداد 1390, 23:40 عصر
$result = preg_replace("/<br([^>]*)>/","\n",$str);
$remove_html = strip_tags($result);
$result = nl2br($remove_html);
echo($result);

خوب اول تگ های br رو با یک چیزی عوض کن تگ های html رو حذف کن بعدش دوباره تگ های br را جایگزین کن مثل کد بالا

ghasemweb
دوشنبه 31 مرداد 1390, 00:10 صبح
تست کردم خوب عمل میکنه ولی این تیکه کد رو ایگنور نمیکنه!!!


&lt;script&gt;alert(123);&lt;/script&gt;

amin1softco
دوشنبه 31 مرداد 1390, 09:49 صبح
خوب یک خط بهش اضافه کن اینجوری


$str='&lt;script&gt;alert(123);&lt;/script&gt;';
$result = preg_replace("/<br([^>]*)>/","\n",$str);
$result=htmlspecialchars_decode($result);
$remove_html = strip_tags($result);
$result = nl2br($remove_html);

echo($result); //alert(123);


البته اگه نخواهیم از htmlawed استفاده کنیم همین دو خط احتیاجه:


$result=htmlspecialchars_decode($result);
$result = strip_tags($result,'<br />');

ghasemweb
سه شنبه 01 شهریور 1390, 10:39 صبح
منظورم رو نگرفتید!!

من میخوام اگه تو متن همچین چیزی بود حذف بشه نه این که نمایشش بده



&lt;script&gt;alert(123);&lt;/script&gt;

amin1softco
سه شنبه 01 شهریور 1390, 15:27 عصر
خوب عزیزه من تک های اسکریپتش حذف می شه حالا اگه دوست داری محتویات بینشم حذف بشه اونو با یک تگ ناشناخته عوض کن مثل کد زیر :


$str='سش<br>يسل<br />ام&lt;script&gt;alert(123);&lt;/script&gt;<script language:"javascript">alert("1234");</script> <?= showImg (\'image.jpg\', \'\', \'class="content"\'); ?>';
$result=htmlspecialchars_decode($str);
$result = preg_replace("/<script([^<\/]*)<\//i","<؟=",$result);
$result = strip_tags($result,'<br');//inja benevisid > ta hazf nashe

echo($result);

idocsidocs
جمعه 11 شهریور 1390, 07:35 صبح
بنده چند ساعتی هست روی این موضوع تحقیق کردم.
همونطور که حدس میزدم بنظر میاد این قضیه حجم و پیچیدگی قابل توجهی داشته باشه. یعنی نه اونقدری که بنده الان اولویت و وقتی براش داشته باشم. این یه چیزی خارج از برنامه بود که گفتم ببینم شاید بتونم با یه مقدار تحقیق و تست کاری انجام بدم.
با اینکه در این وقت محدود نتونستم بصورت کامل به نتیجه ای برسم اما فکر میکنم سرنخها و مطالب مفیدی پیدا کردم که بدرد شما بخورن. شاید هم کلا مشکل شما رو حل کنن. مهم در درجهء اول جلوگیری از حمله های XSS بود که خوشبختانه بنده یک برنامهء آماده تحت GPL برای این کار پیدا کردم که با توجه به تستها تاجاییکه تونستم انجام بدم بنظر میرسه بقدر کافی خوب باشه.
این برنامه اسمش htmLawed هست؛ لینک های زیر رو ببینید:
http://www.bioinformatics.org/phplabware/internal_utilities/htmLawed/secure_JS_WYSIWYG.htm
http://www.bioinformatics.org/phplabware/internal_utilities/htmLawed/htmLawed_README.htm
http://www.bioinformatics.org/phplabware/internal_utilities/htmLawed/rsnake/RSnakeXSSTest.htm
از رفرنس و تشکیلات و امکانات مفصلی که داره بنظر میاد یه چیز حرفه ای باشه.

این لینک هم جهت کامل بودن رفرنسها برای علاقمندان به امنیت فکر میکنم جالب باشه (مربوط به XSS است): http://ha.ckers.org/xss.html

لینک دانلود htmLawed رو در این صفحه پیدا میکنید:
http://www.bioinformatics.org/phplabware/internal_utilities/htmLawed/more.htm

خب حالا روش استفاده چطوریه. خیلی ساده است. فقط یک فایل داره بنام htmLawed.php که اینکلود میکنید و بقیهء ماجرا که در قطعه کد زیر میبینید:

include_once('./htmLawed.php');
$safe_str=htmLawed($contents, array('safe'=>1));
این کد الان محتویات $contents رو گرفته و نسخهء بی خطر شدهء اون رو در متغییر $safe_str ذخیره میکنه. لزوما همهء این کدها کلا حذف نمیشن، اما به فرمی تبدیل میشن که هنگام درج در بطن سند HTML خطر XSS وجود نداشته باشه.
توجه داشته باشید که این کد الان تگهایی مثل img رو حذف یا غیرفعال نمیکنه. یعنی کاربران قادر هستن در پست خودشون از تصویر استفاده کنن؛ خب این چون اغلب جزو امکانات ادیتورهای WYSIWYG هست بنابراین غیرعادی بحساب نمیاد.
اما شما احتمالا میخواید که بعضی از تگهای HTML رو اجازه ندید (Black list) یا فقط بعضی از تگها رو اجازه بدید و بقیه رو اجازه ندید (White list). هردوی این کارها توسط این برنامه امکانپذیر هستن.
مثالی از لیست سفید:

htmLawed($in, array('safe'=>1, 'elements'=>'a, b, strong, i, em, li, ol, ul'));
همونطور که میبینید فقط تگهای محدودی مثل تگ لینک، Bold و لیست و غیره اجازه داده شدن. بقیهء تگهای HTML مثل تگ img حذف خواهند شد.

مثالی از لیست سیاه:

htmLawed($contents, array('safe'=>1, 'elements'=>'* -table -tr -td -th -tfoot -thead -col -colgroup -caption -img')
همهء تگها بجز تگهای مربوط به جدول و تگهای تصویر اجازه داده شدن.
البته تگ img رو بنده به مثال اصلی خودش اضافه کردم.

راستی تگهای applet-embed-iframe-object-script هم بصورت خودکار چه شما اونا رو تعیین بکنید و چه نکنید چه در لیست سیاه و چه در لیست سفید بهرصورت حذف میشن، چون اینها تگهای خطرناک بحساب میان که میشه باهاشون حملات XSS و احتمالا انواع حملات دیگری مثل XSRF رو صورت داد.

ضمنا سعی کنید حتی الامکان از لیست سفید که امن تره استفاده کنید. یعنی ببینید ویرایشگر شما چه امکاناتی رو میده (درج تصویر، سایز نوشته، Bold کردن و غیره) و فقط تگهایی رو که برای اون فرمتها نیاز هستن در لیست سفید خودتون درج کنید.

پس میخواید در اونجا فقط متن باقی بمونه؟ (و البته تگهای br)
این مورد جداست و انشاا... بعد بهش میپردازیم.
علاوه بر حفظ امنیت، باید بتونیم که ابزارهای لازم رو در اختیار مدیر سایت قرار بدیم.
مدیر ها گاهی احتیاج پیدا می کنن که علاوه بر تصویر، فایل صوتی و تصویری هم توی سایتشون قرار بدن.

معمولا این کار رو هم از طریق ادیتور انجام می دن.

آیا استفاده از htmLawed جلوی نمایش فایلهای صوتی و تصویری که لینکشون از طریق ادیتور وارد کدهای html شده رو می گیره؟

A B C D
جمعه 11 شهریور 1390, 11:13 صبح
چه فایل صوت و تصویری؟ یعنی با چه فرمتی؟ نمیخوای که مستقیما درج کنی؟ چون الان دیگه تقریبا همه از روش فلش استفاده میکنن.

آیا استفاده از htmLawed جلوی نمایش فایلهای صوتی و تصویری که لینکشون از طریق ادیتور وارد کدهای html شده رو می گیره؟ بله چون تگهای Object و Embed رو خنثی میکنه و اونا رو تگهای خطرناک میدونه. و البته حتما درست هم فکر میکنه!
ولی اینطور که در منابع دیگه در نت آمده امکان درج امن مثلا ویدئوهای یوتیوب وجود داره. و ما اگر بخوایم میتونیم باوجود استفاده از htmLawed این کار رو انجام بدیم.
منتها باید محدودیت گذاشت و مثلا فقط ویدئوهای یوتیوب رو اجازه بدیم و خلاصه منابع قابل اعتماد. نه اینکه همینجوری از هر منبعی و هر فرمتی اجازه بدیم؛ وگرنه دیگه تامین امنیت هم تقریبا غیرممکن خواهد بود.
حالا هدف شما چیه؟ کاربران لینک از سایتهای معروف میخوان بذارن؟ مثلا میخوان ویدئوی یوتیوب درج کنن؟ یا سناریوی دیگه ای داری؟

اینا هم راجع به درج امن ویدئوهای یوتیوب:
http://htmlpurifier.org/docs/enduser-youtube.html
http://www.phpbb.com/community/viewtopic.php?f=46&t=579376#youtube

درمورد لینک اول باید بگم ما میتونیم از روشش استفاده کنیم اما نیازی به استفاده از htmlpurifier نداریم و میتونیم از همون htmLawed خودمون استفاده کنیم.
درمورد لینک دوم باید بگم از روش BBCode سفارشی استفاده میکنه و این لینک رو برای این گذاشتم که نشون بدم با BBCode هم میشه این کارها رو انجام داد (چون ظاهرا بعضی ها فکر میکنن نمیشه).

idocsidocs
جمعه 11 شهریور 1390, 16:02 عصر
چه فایل صوت و تصویری؟ یعنی با چه فرمتی؟ نمیخوای که مستقیما درج کنی؟ چون الان دیگه تقریبا همه از روش فلش استفاده میکنن.
بله چون تگهای Object و Embed رو خنثی میکنه و اونا رو تگهای خطرناک میدونه. و البته حتما درست هم فکر میکنه!
ولی اینطور که در منابع دیگه در نت آمده امکان درج امن مثلا ویدئوهای یوتیوب وجود داره. و ما اگر بخوایم میتونیم باوجود استفاده از htmLawed این کار رو انجام بدیم.
منتها باید محدودیت گذاشت و مثلا فقط ویدئوهای یوتیوب رو اجازه بدیم و خلاصه منابع قابل اعتماد. نه اینکه همینجوری از هر منبعی و هر فرمتی اجازه بدیم؛ وگرنه دیگه تامین امنیت هم تقریبا غیرممکن خواهد بود.
حالا هدف شما چیه؟ کاربران لینک از سایتهای معروف میخوان بذارن؟ مثلا میخوان ویدئوی یوتیوب درج کنن؟ یا سناریوی دیگه ای داری؟

اینا هم راجع به درج امن ویدئوهای یوتیوب:
http://htmlpurifier.org/docs/enduser-youtube.html
http://www.phpbb.com/community/viewtopic.php?f=46&t=579376#youtube

درمورد لینک اول باید بگم ما میتونیم از روشش استفاده کنیم اما نیازی به استفاده از htmlpurifier نداریم و میتونیم از همون htmLawed خودمون استفاده کنیم.
درمورد لینک دوم باید بگم از روش BBCode سفارشی استفاده میکنه و این لینک رو برای این گذاشتم که نشون بدم با BBCode هم میشه این کارها رو انجام داد (چون ظاهرا بعضی ها فکر میکنن نمیشه).
این هم شد دردسر برای من !
یه مدت دور راه انداختن ادیتور tinymce بودم تازه می بینم که هنوز کار داره !

A B C D
جمعه 11 شهریور 1390, 16:46 عصر
این هم شد دردسر برای من !
یه مدت دور راه انداختن ادیتور tinymce بودم تازه می بینم که هنوز کار داره !
اینکه میگم نوشتن یه برنامهء اصولی که باید بقدر کافی امن هم باشه چقدر سخته و حجم کد خیلی بیشتری داره بخاطر همینطور چیزهاست.
اینا تنها یکی دو مورد از خیلی موارد هست. درمورد هر بخش و الگوریتم و روشی آدم باید تحقیق کنه و نکته های اصولی و امنیتی اون رو بفهمه و پیاده کنه.

البته دیگه خیلی هم سخت نیستا!
شاید بهتر باشه اول از کارهای کوچک تر و ساده تر شروع کنی.

A B C D
جمعه 11 شهریور 1390, 16:52 عصر
نظرتون در مورد این کلاس (http://htmlpurifier.org/comparison)چیه؟
http://htmlpurifier.org/comparison

ظاهرا htmLawed قدیمی هست ولی htmlpurifier جدید تر و امن تر.

بله بنظرم همینطوره.
اون صفحه رو کامل خوندم و یه چند صفحهء دیگه دربارهء htmlpurifier.
البته htmlpurifier رو قبلا مطرح کرده بودن، ولی اون موقع چون یه مثال سرراست و معتبر از روش استفادش پیدا نکردم اون رو توصیه نکردم چون نمیدونستم چه تنظیماتی میخواد یا نمیخواد و تا چه حد برای کارهای امنیتی درنظر گرفته شده و امنیت داره. فکر میکردم احتمالا نیاز به تنظیمات دستی زیادی داشته باشه تا امن بشه.
اما الان دیدم انتهای صفحهء دانلودش (http://htmlpurifier.org/download#Installation) مثال هم زده که تست کردم و ظاهرا کار مورد نظر ما رو به همین سادگی انجام میده.
پس بیایید از این ببعد همه با هم از 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 دیگری دارید، باید تنظیمات مربوطه رو انجام بدید.

البته فکر نمیکنم استفاده از htmLawed هم واقعا اونقدرها بد یا خطرناک باشه، ولی وقتی بهتر از اون هست چرا استفاده نکنیم؟
اینو گفتم که اونایی که از htmLawed استفاده کردن حالا شوکه نشن فکر نکنن به این خاطر هک شدن یا میشن.
یک مزیت htmLawed رو میتونیم کم حجم تر و سبک تر بودنش بدونیم. اما بهرحال در مسائل امنیتی حجم و سنگین بودن هزینهء زیادی برای پرداختن نیست.

تاجاییکه در اون صفحه خوندم دو ایراد امنیتی اصلی به htmLawed گرفته:
- یکی اینکه گفته چنین برنامه هایی باید با تنظیمات پیشفرض امن باشن (درحالیکه در htmLawed نیاز هست گزینهء safe رو تنظیم کنید تا امن بشه)، چون خیلی کاربران مستندات رو نمیخونن و ممکنه در این زمینه اشتباه کنن.
- دیگه اینکه میگه htmLawed حتی درحالت امن اجازهء وجود فرم ها رو در خروجی میده که نباید اینطور باشه.

بنظر بنده در هر دو مورد حق با طرفه!
البته در مورد تگ form هم میتونیم با دادن یک لیست سیاه به htmLawed مشکل رو برطرف کنیم، ولی بنظر بنده هم نباید این تگ رو درحالت امن اجازه میداد. بالاخره کاربر که حرفه ای نیست و داره به این تنظیم اعتماد میکنه و فکر میکنه به هیچ شکل نمیشه هیچ سوء استفاده ای ازش کرد.

درمورد امنیت درمقابل XSS هم طرف گفته «احتمالا». پس نمیشه گفت htmLawed درمقابل XSS ناامنه.

بقیهء ایرادهایی هم که گرفته بنظرم از نوع امنیتی نیست و به استاندارد بودن خروجی مربوط میشن.

در نهایتش منکه برای سویچ به htmlpurifier کاملا قانع شدم.

alireza.stack
جمعه 11 شهریور 1390, 23:25 عصر
ممنون کارم راه افتاد. راستش من در مورد رگولار اکسپرشن چیز زیادی نمیدونم اگه مقاله و مطلب اموزش دارید لطف میکنید در اختیارمون بذارید.
راستی اگه بخوای به جای یه متن معمولی یه متن دیگه رو جایگزین کنی چطوری میشه مثلا به جای false فضای خالی بذاره؟؟

می تونید از مقاله ی زیر برای عبارات منظم استفاده کنید: http://www.bugx.ir/webdesign/content/50

idocsidocs
دوشنبه 28 شهریور 1390, 00:24 صبح
$config = HTMLPurifier_Config::createDefault();
$config->set('Core.Encoding', 'UTF-8');
$config->set('HTML.Doctype', 'HTML 4.01 Transitional');
$purifier = new HTMLPurifier($config);

برای صفحاتی که فرمت UTF8 دارن و برای doctype از HTML 4.01 Transitional استفاده می کنن لازم نیست از کد بالا استفاده کرد. کد زیر هم جواب می ده.

require_once '/path/to/htmlpurifier/library/HTMLPurifier.auto.php';

$purifier = new HTMLPurifier();
$clean_html = $purifier->purify($dirty_html);

سوالی که دارم اینه که چطور باید به تگهایی مثل آبجکت اجازه داد تا از این فیلتر عبور کنن؟