ایمن سازی اطلاعات دریافتی از ادیتور

greencat

Member
سلام
می‌خواستم بدون وقتی روی یه textarea ادیتور قرار میدیم در سمت سرور برای پاک سازی و ایمن سازی اطلاعات دریافت شده از طرف اون چه کاری باید انجام داد. چون این اطلاعات رو جای دیگه ای قرار از دیتابیس فراخوانی کنم و چاپ کنم.
مثلا باید از وجود تگ‌هایی مثل <script> جلوگیری کردش یا از حملات xss و یا sqlinjection چون با غیر فعال کردن جاوا اسکریپت ادیتور بر روی textarea ظاهر نمیشه و برای همین می‌خوام سمتسرور پاک سازی کنم اطلاعات رو، کار برای ان تبه ظنرم سخت هستش چون وقتی جاوا اسکریپت فعال باشه اطلاعاتی که از طرف ادیتور ارسال میشه پر از تگ html هستش و ادیتور ها خودشون به text خالی تگ اضافه می‌کنن حالا ما از کجا باید تشخیص بدیم این تگ اضافه شده تگ مجاز هستش یا غیر مجاز؟ یا اینکه این تگ توسط کاربر اضافه شده زمانی که جاوا اسکریپت غیر فعال بوده و ادیتور نبود یا اینکه این تگر رو خود ادیتور به text برای فرمت بندی text بشه اضافه کرده؟
ممنون.
 

i-php-i

Active Member
سلام
می‌خواستم بدون وقتی روی یه textarea ادیتور قرار میدیم در سمت سرور برای پاک سازی و ایمن سازی اطلاعات دریافت شده از طرف اون چه کاری باید انجام داد. چون این اطلاعات رو جای دیگه ای قرار از دیتابیس فراخوانی کنم و چاپ کنم.
مثلا باید از وجود تگ‌هایی مثل <script> جلوگیری کردش یا از حملات xss و یا sqlinjection چون با غیر فعال کردن جاوا اسکریپت ادیتور بر روی textarea ظاهر نمیشه و برای همین می‌خوام سمتسرور پاک سازی کنم اطلاعات رو، کار برای ان تبه ظنرم سخت هستش چون وقتی جاوا اسکریپت فعال باشه اطلاعاتی که از طرف ادیتور ارسال میشه پر از تگ html هستش و ادیتور ها خودشون به text خالی تگ اضافه می‌کنن حالا ما از کجا باید تشخیص بدیم این تگ اضافه شده تگ مجاز هستش یا غیر مجاز؟ یا اینکه این تگ توسط کاربر اضافه شده زمانی که جاوا اسکریپت غیر فعال بوده و ادیتور نبود یا اینکه این تگر رو خود ادیتور به text برای فرمت بندی text بشه اضافه کرده؟
ممنون.

منم همین سوال رو دارم.
 

Masoud1365

مدیر انجمن
خود php که یه سری توابع برای فیلتر کردن مقادیر خطرناک داره !
منظور شما غیر از اونها هست ؟
 

greencat

Member
نه، منظور من این هستش خود ایدتور به text یه سری مقادیر اضافه میکنه مثل تگ‌های html برای استایل بندی متن، مثل استفاده از <br /> یا <p> برای ایجاد سطر جدید، این توابع php که مقادیر خطرناک رو فیلتر می‌کنه میادش مثلا < یا > یا " و ... رو تبدیل به کد اصلیشون می‌کنه و غیر فعال میشن و نمایش داده میشن این طوری مشکل امنیتی رو شاید حل کنه اما میادش تگ‌های خود ادتورم که برای قالب بندی text به کار گرفته شده هم غیر فعال و تبدیل به کد اصلی می‌کنه و متن اون طوری که باید نمایش داده بشه نمایش داده نمیشه.
منظورم رو تونستم برسونم بهتون؟
 

Masoud1365

مدیر انجمن
ببینید مثلا تابع add_slash ( البته حالا املاشو مطمئن نیستم :دی ) قبل از یه سری کاراکترها اسلش قرار میده زمانی که میخوایی نمایش بدی باید از stripslash استفاده کنی که اون اسلش ها رو برداره و نمایش بده ! ( منظورت همین بود ؟ )
 

greencat

Member
شرمنده ولی باز هم نه!!
مشکل من کاراکتر‌هایی مثل < و یا > هستن که ازشون توی تگ ها استفاده میشه می خوام جلوی تگ های زائد و اضافی رو که کاربر خودش وارد میکنه نه ادیتور رو بگیرم مثل <script> و یا iframe الان مثلا خود این textarea مجید آنلاین رو نیگاه کنید تگ‌هایی رو که خود ادیتور به متن اضافه می کنه توی سورس صفحه به صورت تگ نمایش داده می شن ولی تگ هایی رو که کاربر خودش به توی متن می نویسه مثل <script> و یا <b> و یا حتی <?php این تگ ها رو به کد اصلی و اسکی شون تبدیل می‌کنه.
در مورد add_slashe هم فقط گذاشتن تنهای اون کافی نیستش چون کاربر حرفه‌ای اگر " کار نکرد "\ رو هم تست میکنه تا اگر خود برنامه نویسی با 1 اسلش " رو خنثی کرد با اضافه شدن \ به "\ تبدیل بشه به "\\ و باز " باقی بمونه، در کل منظورم استفاده از این تابع نبود.
 

i-php-i

Active Member
شرمنده ولی باز هم نه!!
مشکل من کاراکتر‌هایی مثل < و یا > هستن که ازشون توی تگ ها استفاده میشه می خوام جلوی تگ های زائد و اضافی رو که کاربر خودش وارد میکنه نه ادیتور رو بگیرم مثل <script> و یا iframe الان مثلا خود این textarea مجید آنلاین رو نیگاه کنید تگ‌هایی رو که خود ادیتور به متن اضافه می کنه توی سورس صفحه به صورت تگ نمایش داده می شن ولی تگ هایی رو که کاربر خودش به توی متن می نویسه مثل <script> و یا <b> و یا حتی <?php این تگ ها رو به کد اصلی و اسکی شون تبدیل می‌کنه.
در مورد add_slashe هم فقط گذاشتن تنهای اون کافی نیستش چون کاربر حرفه‌ای اگر " کار نکرد "\ رو هم تست میکنه تا اگر خود برنامه نویسی با 1 اسلش " رو خنثی کرد با اضافه شدن \ به "\ تبدیل بشه به "\\ و باز " باقی بمونه، در کل منظورم استفاده از این تابع نبود.

منم این مشکل رو داشتم.

از داکیومنتهای ادیتور نتوستم مشکلم رو پیدا کنم.

اما کاری که کردم این بود که برای تگهایی که توسط این ادیتور تحت تاثیر قرار می گیرن، یه تابع جداگانه نوشتم.

شما نباید از توابعی مثل htmlentitise و ... استفاده کنید. بجای این توابع که روی تگها تاثیر می ذارن، باید از توابع خودتو استفاده کنید.
 

farik

Well-Known Member
با سلام..
تا اونجا که من فهمیدم شما میخواین تگهایی مثل <SCRIPT > یا امثال اونها روحذف کنین..
خوب برای اینکار 2 راه دارین..
1)استفاده از توابعی مثل stripTags که تگها رو حذف میکنه..
2)خودتون با عبارات منظم جلوی اینکار رو بگیرین..
البته من خودم در مواقع عادی 100% راه حل اول رو انتخاب میکنم ولی گاهی بسته به شرایط راه دوم مفید تره...
موفق باشید..
 

greencat

Member
سلام
ممنون از جوابتون اما با این کار تگ‌هایی که خود ادیتور برای استایل بندی و فرمت دهی به متن هم به متن اضافه کرده حذف میشه و متن به هم ریخته نشون داده می‌شه، در ثانی مثل فروم‌ها شاید کاربر بخواد کدی رو توی متنش وارد کنه و به بقیه نشون بده با این کار اون کدها هم از بین میرن!!! پس استفاده از این توابع ممکن نیستش! در مورد عبارات منظم هم همین نکته باز وجود دارد!
 

farik

Well-Known Member
با سلام..
خوب اول از همه بگم که شما یکم گاهی لازمه در استفاده از عبارات منظم ابتکار به خرج بدین مثلا بیاین و همه تگهای مجازی رو که تو تکست اومده بگیرین و محل و خودشون رو بریزین تو یک ارایه بعد که غیر مجاز ها رو حذف کردین اینها رو به تکست اضافه کنین(یک مثال ساده این بود)..
دوما یک نگاه ساده به php.net گاهی از هر کاری میتونه مفیدتر باشه...
راستش من خوب متوجه نشدم..شما میخواین یک بلک لست از تگها تهیه کنین که کاربر اگه اونها رو زد شما تگ ها رو حذف کنین..یا نه میخواین میخواین فقط یکسری تگ خاص رو کاربر بزنه...
برای حالت اول که الان تابع خاصی یادم نیست و از همون عبارتها استفاده کن..(با همون روشی که گفتم)..برای حالت دوم هم از تابعی که تو پست قبلی گفتم استفاده کنین..یعنی سstrip_tag..اینم syntax:
کد:
string strip_tags  ( string $str  [, string $allowable_tags  ] )
سوالی بود در خدمتم..
 

greencat

Member
سلام
قبل از همه ممنون به خاطر جوابتون، اما شما کلا سوال من رو متوجه نشدید.
نیگا کنید شما این textarea فروم ها رو در نظر بگیرید مثلا همین مجید آنلاین، از ادیتور استفاده می کنند که مجید آنلاین هم ادیتور real-time داره هم غیر real-time حالا توی این قسمت کاربر می تونه هر تگی رو وارد کنه html، جاوا اسکریپت، php و غیره ... حالا سوال من اینه که چه طوری این کدها امن سازی میشن وقتی که ادیتور غیر فعال هستش چون خود ادیتور این ایمن سازی رو انجام میده.
اگر پست های بالایی رو که فرستادم بخونید متوجه میشد منظورم رو، ما نباید تگی رو حذف کنیم باید غیر فعال کنیم و خاصیت کد بودنش رو ازش بگیریم اما تگ هایی رو که خود کاربر وارد کرده فقط نه ادیتور چون اگر تگ های ادیتور غیر فعال بشه فرمت بندی متن بهم می‌ریزه.
 

farik

Well-Known Member
با سلام مجدد..
خوب بحث اینه که شما کلا نباید بزارین یکسری کد ها تو سیستمتون وارد بشن...مثلا یک کاربر عاقل هیچوقت نمیاد کد script رو تو پستش بزاره...به همین خاطر من میگم بیاین و به جز چند تا تگ مثل p ,a,...بقیه رو فیلتر کنین..اونم تا اونجا که فعلا مغز من کار میکنه راهش عبارات منظممه...
یا هم میتونین مثل مجید انلاین بین تگهای ادیتور و تگهای html فرق بزارین(اگه دقت کنین همه تگها با [] ها هست)..اما خوب قبول دارم که این روش مناسب نیست خیلی..
به هر حال این افکار ذهن من بود..دوستان نظری ندارن؟...:shock:پ
l,tr fhadn
 

greencat

Member
این از نظر ما هستش ( یعنی برنامه نویس سیستم ) که هر کدی نباید وارد بشه، اما کاربر میخواد یک کد php یا js و یا هر تکه کد دیگه ای رو بزاره تا بقیه ببینن و اشکال گیری کنن، (منظورم از مجید آنلاین سیستم مورد استفادش یعنی ویبولتون هستش)، ادیتور این فرق رو گذاشته تا بفهمه کدی که کاربر وارد کرده و ادیتور وارد کرده یه فرقی داشته باشه اما هیچ تضمینی وجود نداره کاربر کدهاش رو داخل این نشانه یعنی [] بذاره! داره؟! شاید یکی از این علامت ها رو گذاشت و یکی رو نه ( یعنی علامت شروع رو گذاشت و پایان رو نه و یا به عکس) و هر احتمال دیگه ای. با عبارت منظم به احتمال قوی نمی شه.
به هر حال ممنون از جوابتون.
 

eAmin

Well-Known Member
سلام
به کدهایی که بین [] قرار میگیره BBCode گفته میشه. و پیدایش این تکنیک هم واضحه، یعنی در زمانی که ادیتور پویا فعال نیست، بتونیم محتویات textarea رو قالب بندی (طبق الگوی از پیش تعیین شده) و به نمایش بذاریم. ادیتور این فروم هم زمانی که ادیتور پویا فعال نیست از این روش استفاده میکنه. سوال شما این بود که شاید کاربر بخواد کدهای خودش رو برای عموم به نمایش بزاره، اونوقت باید چکار کرد؟ به اینصورت که در مرحله اول تگ [c ode] ایجاد میشه، بعد کدهای کاربر توسط ادیتور یا با توابعی مثل htmlentities و htmlspecialchars به کدهای غیر قابل اجرا در html تبدیل میشن. مثال زیر رو مشاهده کنید:
HTML Entities
کد:
<script>alert('a')</script>

&lt;script&gt;alert('a')&lt;/script&gt;
بعد از قرار گرفتن کدهای کاربر بین bbcode ها در سرور این کدها به معادل html ای خودشون تبدیل میشن، مثلا [c ode] به <code> تبدیل میشه و از اونجایی که کدهای کاربر هم غیر قابل اجرا شده و فقط برای نمایش کاربرد داره، به نمایش در میاد.
در حالت پویا هم تقریبا همین حالت مورد استفاده قرار میگیره منتها چون توسط JavaScript کدهای کاربر قبل از ارسال به سرور تبدیل شده هستند، نیازی به استفاده از BBCode ها نیست.
با توضیحات فکر میکنم متوجه شده باشید که کدهای کاربر در نهایت تبدیل به کدهای غیر قابل اجرا میشن.
ادیتور این فرق رو گذاشته تا بفهمه کدی که کاربر وارد کرده و ادیتور وارد کرده یه فرقی داشته باشه اما هیچ تضمینی وجود نداره کاربر کدهاش رو داخل این نشانه یعنی [] بذاره! داره؟! شاید یکی از این علامت ها رو گذاشت و یکی رو نه ( یعنی علامت شروع رو گذاشت و پایان رو نه و یا به عکس) و هر احتمال دیگه ای.
کاربر برای ما تصمیم نمیگیره، این ما هستیم که به کاربر میگیم اینکار رو انجام بده! اگر ادامه کد رو نذاشته خوب ما هم اجرا نمیکنیم و مثل همین ادیتور فقط بصورت یک تکست معمولی نشون میدیم و قالب بندی نمیکنیم.
با عبارت منظم به احتمال قوی نمی شه.
اتفاقا یکی از بهترین راه ها استفاده از عبارات منظم هست. اگر اصولی یک الگوی منظم بنویسید، اونوقت امنیت خیلی بالایی خواهید داشت!
برای چی میگم امنیت بالا؟ چون این خاصیت عبارات منظم هست که ورودی باید دقیقا همون چیزی باشه که ما تعیین کردیم، اگر حتی یک کاراکتر هم بصورت اشتباه وارد شده باشه و در الگویی که ما نوشتیم نباشه اونوقت کاربر اجازه ی ادامه کار رو نداره.

موفق باشید.
 

greencat

Member
سلام
قبل از همه چیز ممنون از جوابتون اما، اطلاعاتی که در مورد bbcode ها گفتید درست و میدونستم.
نیگا تا اونجایی که من میدونم و بررسی کردم فروم‌هایی مثل مجید آنلاین ( vbullton ) ابتدا چک میکنن ببین که ادیتور حالتش چی بوده؟ ادیتور realtime فعال بوده یا نه معمولی؟ یعنی wysisyg بوده ادیتور یا نه، اگر ادیتور real نبودش بله حرف شما درست میاد از توابعی مثل htmlentities و htmlspecialchars استفاده میکنه اما وقتی ادیتور wysiwyg بوده دیگه از این توابع نمیتونه استفاده کنه چون خود ادیتور هم همون لحظه در پشت صحنه تگ های html رو روی متن وارد میکنه پس اگر از این توابع استفاده کنه استایل متن بهم می ریزه. من حالا سوالم اینه توی این حالت که همیشه ادیتور real داریم باید چی کار کردش اگر کاربر جاوا اسکریپت رو غیر فعال کنه ادیتور ظاهر نمیشه و ما سمت سرور از کجا بدونیم که این اطلاعات که توش تگ هستش رو چه طور پاک سازی کنیم؟!! چون هم ادیتور به متن تگ وارد کرده هم کاربر.
نیگا بزارید واضح تر بگم. فرض کنیم ما راه فرم خارجی برای ارسال اطلاعات رو بسته باشیم.
خوب حالا کاربر باید فقط از طریق فرمی که ما مشخص کردیم اطلاعات رو بفرسته، اینجا حالا دو حالت داریم:

حالت اول) جاوا اسکریپت فعال باشه: توی این حالت مشکلی نیستش چون ادیتور ظاهر میشه و اگر کاربر تگی رو وارد کنه خود ادیتور پشت پرده مثلا <script>alert('a')</script> رو به &lt;script&gt;alert('a')&lt;/script&gt; تبدیل میکنه و مشکلی نیست. حتی اگر داخل
کد:
 هم نذارتش چون همون لحظه کاراکتر های خواص مثل > و یا < به کداشون تبدیل میشن.

[B]حالت دوم) [/B]جاوا اسکریپت غیر فعال باشه: توی این حالت که کاربر از عمدا یا سهوا جاوا اسکریپت رو غیر فعال کرده، که در این حالت ادیتور ظاهر نمیشه و کار نمی کنه ( چون تماما با Js هستش) و کاربر اطلاعات رو از یه textarea بدون ادیتور می فرسته و اگر کد  <script>alert('a')</script> رو وارد کنه همین کد باقی می مونه.
حالا مشکل اینجاس ما سمت سرور از کجا بفهمیم که کاربر این اطلاعات رو زمانی که جاوا اسکریپت فعال بوده فرستاده یا نبوده؟ که تگ ها رو خودمون خواصیت تگ بودن رو ازش بگیریم یا نه چون اگر جاوا اسکریپت فعال نبوده هرچی تگ توی متن هستش خود کاربر وارد کرده و باید خاصیت کد بودن ازشون گرفته شه و به راحتی میتونیم از   htmlentities  و htmlspecialchars استفاده کنیم چون تگی برای استایل بندی متن نداریم ولی اگر جاوا اسکریپت فعال بوده ادیتور داریم و  برخی کد ها توسط کاربر وارد شده و بعضی هاشم خود ادیتور برای استایل بندی متن که ما باید فقط اونایی رو که کاربر وارد کرده رو غیر فعال کنیم پس نمیتونیم به راحتی از   htmlentities  و htmlspecialchars برای همه تگ ها وارد کنیم.
منظورم رو متوجه شدید؟
استفاده از عبارات منظم خوبه و همون طور که شما هم گفتید خیلی امن هستش و شکی توش نیستش، اما مشکل همونی هستش که بالا هم گفتم و گرنه منم توی قدرت rqgexp شکی ندارم.
 

farik

Well-Known Member
سلام برای بار چهارم:دی..
خوب من که گفتم..مثلا هیچ وقت ادیتور نمیاد تگ script رو بزاره تو قالب پس شما میاین و میگین یکسری تگ ها رو همیشه خودش تغییر بده...اما واسه اون تگهایی که بیخطر ترن و ممکنه فقط در استایل متن تغییر ایجاد کنند..شما میتونین از یک فیلد hidden استفاده کنین ..اینطوری اگه ادیتور بود که خوب دیگه دست نمیزنین به کدها وگرنه بقیه کدها رو هم تبدیل به متن میکنید..البته اگه خودم بود این کار رو نمیکردم تا کاربر بتونه حتی بدون ادیتور هم متن رو قالب بندی کنه..و فقط کدهای خطرناک رو در هر حال فیلتر میکردم..
موفق باشید..
 

جدیدترین ارسال ها

بالا