PDA

View Full Version : سوال: تفاوت اصلی دوتابع htmlentities و htmlspecialchars در چی هست؟



idocsidocs
شنبه 28 خرداد 1390, 01:48 صبح
لطفا بگید که تفاوت اصلی دوتابع htmlentities و htmlspecialchars در چی هست؟

آیا می شه این دوتابع رو بجای همدیگه استفاده کرد و در هر صورت یک نتیجه گرفت؟

من سایت پی اچ پی رو نگاه کردم. لطفا نظر خودتون رو بگید. لطفا توضیح بدید.

idocsidocs
شنبه 28 خرداد 1390, 14:10 عصر
کسی نظری نداره؟

AMIBCT
شنبه 28 خرداد 1390, 14:25 عصر
htmlspecialchars زيرمجموعه‌ي htmlentities هست

htmlspecialchars فقط پنج نويسه‌ي & " ' > < رو به html Entitiy تبديل مي‌كنه
ولي htmlentities تمام نويسه‌هايي كه Entity داشته باشن

idocsidocs
شنبه 28 خرداد 1390, 15:44 عصر
htmlspecialchars زيرمجموعه‌ي htmlentities هست

htmlspecialchars فقط پنج نويسه‌ي & " ' > < رو به html Entitiy تبديل مي‌كنه
ولي htmlentities تمام نويسه‌هايي كه Entity داشته باشن
با این وجود چه دلیلی داره که بعضی ها پیشنهاد می کنن که از هر دو با هم استفاده کنیم؟ همونطور که شما می گید تابع htmlspecialchars زیرمجموعه تابع htmlentities هست و استفاده از هردو با هم یک نتیجه رو داره.

AMIBCT
شنبه 28 خرداد 1390, 20:53 عصر
از خود بعضی‌ها بپرسید که دلیلشون چیه

هر کسی هر چیزی گفت که نباید عمل کنید

بهترین منبع مستندات خود php هست که چنین چیزی رو نگفته و اصلا با منطق هم جور در نمیاد

idocsidocs
شنبه 28 خرداد 1390, 21:30 عصر
از خود بعضی‌ها بپرسید که دلیلشون چیه

هر کسی هر چیزی گفت که نباید عمل کنید

بهترین منبع مستندات خود php هست که چنین چیزی رو نگفته و اصلا با منطق هم جور در نمیاد
از این به بعد از htmlentities استفاده می کنم.

امیـرحسین
شنبه 28 خرداد 1390, 21:59 عصر
UTF8 رو هم در نظر بگیرید؛

echo htmlentities($str, ENT_QUOTES, "UTF-8");

eshpilen
شنبه 28 خرداد 1390, 22:48 عصر
یه نگاهی به این بکنید: http://www.w3schools.com/tags/ref_entities.asp
در بخش Reserved Characters in HTML همون چند کاراکتری رو که تابع htmlspecialchars به تنهایی از پسشون برمیاد درج کرده. فکر میکنم از نظر امنیتی در بیشتر جاها فقط همین کاراکترها تبدیل بشن کافیه (ولی در بعضی موارد خاص شاید کافی نباشه - البته بنده موردی سراغ ندارم).
بهرحال فکر نمیکنم استفاده از هرکدوم در عمل فرق چندانی بکنه. شاید دوست داشته باشید برای احتیاط از htmlentities استفاده کنید (میگن کار از محکم کاری عیب نمیکنه!). بهرصورت بنده در خیلی منابع دیدم که از htmlspecialchars برای جلوگیری از XSS استفاده میکنن، و لابد کافی هست!
یکسری کاراکترها رو بخاطر اینکه با کیبورد نمیشه تایپ کرد یا براحتی نمیشه تایپ کرد یا احتمالا گاهی به دلایل دیگری مثل خوانایی بصورت entity هم گذاشتن. وگرنه لزوما مشکل امنیتی نداره و در HTML و مرورگر معنای خاصی ایجاد نمیکنن. مثل بقیهء کاراکترها هستن.

idocsidocs
شنبه 28 خرداد 1390, 23:08 عصر
یه نگاهی به این بکنید: http://www.w3schools.com/tags/ref_entities.asp
در بخش Reserved Characters in HTML همون چند کاراکتری رو که تابع htmlspecialchars به تنهایی از پسشون برمیاد درج کرده. فکر میکنم از نظر امنیتی در بیشتر جاها فقط همین کاراکترها تبدیل بشن کافیه (ولی در بعضی موارد خاص شاید کافی نباشه - البته بنده موردی سراغ ندارم).
بهرحال فکر نمیکنم استفاده از هرکدوم در عمل فرق چندانی بکنه. شاید دوست داشته باشید برای احتیاط از htmlentities استفاده کنید (میگن کار از محکم کاری عیب نمیکنه!). بهرصورت بنده در خیلی منابع دیدم که از htmlspecialchars برای جلوگیری از XSS استفاده میکنن، و لابد کافی هست!
یکسری کاراکترها رو بخاطر اینکه با کیبورد نمیشه تایپ کرد یا براحتی نمیشه تایپ کرد یا احتمالا گاهی به دلایل دیگری مثل خوانایی بصورت entity هم گذاشتن. وگرنه لزوما مشکل امنیتی نداره و در HTML و مرورگر معنای خاصی ایجاد نمیکنن. مثل بقیهء کاراکترها هستن.
من شنیدم که با استفاده از بای پس کردن XSS می شه توابعی مثل htmlentities رو دور زد.

می شه بگید منظور از بای پس کردن XSSچیه و چرا htmlentities نمی تونه جلوش رو بگیره؟

eshpilen
شنبه 28 خرداد 1390, 23:20 عصر
نشنیدم یا یادم نمیاد. شما فهمیدی یا منبعی براش داشتی به منم بگو.

idocsidocs
یک شنبه 29 خرداد 1390, 00:35 صبح
نشنیدم یا یادم نمیاد. شما فهمیدی یا منبعی براش داشتی به منم بگو.
این روش رو چندجا دیدم.
یه رشته به شکل زیر رو تزریق می کنن و باعث بایپس می شن. (البته نمی دونم که منظور از بایپس کردن همینه یا نه)

آیا تابع htmlentities می تونه جلوی این کدهای مخرب رو بگیره؟

%AA%D9%81%D8%A7%D9%88%D8%AA-%D8%A7%D8%B5%D9%84%DB%8C-%D8%AF%D9%88%D8%AA%D8%A7%D

AMIBCT
یک شنبه 29 خرداد 1390, 08:35 صبح
الان اين رو در يه فايل HTML بنويسيد ببينيد چه خرابكاري اتفاق مي‌افته؟

استفاده از htmlspecialchars قبل از ارسال خروجي قطعا جلوي XSS رو مي‌گيره
HTML بر اساس Tag كار مي‌كنه
اگه Tag ها از بين برن كه با اين دستور اين طور مي‌شه،
ديگه راهي براي اجراي اسكريپت نيست

اگه شما راهي داريد معرفي كنيد

از شما خواهش دارم مستند و با دليل صحبت كنيد
اينكه يه نفر ناشناس يه چيزي گفته يا يه برنامه‌نويس مبتدي يه كاري كرده دليل نمي‌شه

eshpilen
یک شنبه 29 خرداد 1390, 08:47 صبح
این کد چیکار میکنه؟ کجاش مخربه؟
بعدشم به اینصورت تست میکنیم:

<?php

echo htmlentities ($_GET['str']);

?>

و مثلا با این آدرس:
http://localhost/test.php?str=%AA%D9%81%D8%A7%D9%88%D8%AA-%D8%A7%D8%B5%D9%84%DB%8C-%D8%AF%D9%88%D8%AA%D8%A7%D

و سورس صفحه رو که نگاه کنیم، htmlentities بیشتر کاراکترهاش رو تبدیل کرده. اونایی هم که نکرده حتما لازم نبودن.

البته حالا که گفتی یه چیزایی یادم اومد راجع به این بایپس کردن. فکر میکنم این بایپس کردن با استفاده از باگ بعضی نرم افزارها و سرویس دهنده های وب بوده. بنابراین فکر نمیکنم الان هم کار بکنه. یا حداقلش دیگه آمار این باگها و سرورها باید درحد ناچیزی باشه.
مثلا باگی خونده بودم که باهاش مثل آب خوردن سورس صفحه های ASP رو درمیاوردن. ولی این مال یه نسخه ای از IIS بوده که الان رفع شده. اینم منبعش: https://www.owasp.org/index.php/Windows_::DATA_alternate_data_stream

A well-known vulnerability of this nature existed in older versions of IIS.

میگه یک آسیب پذیری شناخته شده از این نوع در نسخه های قدیمی تر IIS وجود داشت.

پس این مال نسخه های قدیمی IIS بوده و الان بنظرم نسل این نسخه ها کاملا منقرض شده.

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