PDA

View Full Version : امنیت در ارسال کدها با GET



ali abedian
پنج شنبه 05 تیر 1393, 10:49 صبح
سلام دوستان
من تازه مدت کوتاهی هست که دارم با بانک اطلاعاتی در PHP کار میکنم و از بانک MYSQL هم استفاده میکنم.. دارم سایتهای خودمو به بانک متصل میکنم و الان مسئله ی امنیتی سایتها برام مطرح شده.. برای همین از بزرگان و اساتید محترم راهنمایی میخوام

سوال اول: در ارسال مقادیر توسط GET چه خطراتی وجود داره؟ (اینکه هکر بتونه با ارسال کدهای مخرب کار خودشو انجام بده)
مثلا این تکه کد رو در نظر بگیرید:
http://www.site.com/view.php?id=25
البته اینو میدونم که در طرف دیگه ای که قرار هست این مقادیر مورد استفاده قرار بگیره باید برخی نکات امنیتی رعایت بشه و در دریافت مقادیر کدها فیلترهایی صورت بگیره تا کدهای مخرب هکر ، پاکسازی بشه


>> در ارتباط با همین سوالی که مطرح کردم، یک سوال دیگه ای هم هست: اینکه اگر در ارسال مقادیر با GET امکان هک براحتی وجود داره، آیا استفاده از MD5 و ارسال یک کد امنیتی همراه این مقادیر کار اصولی ای هست؟ یعنی اگر این کد امنیتی بصورت
http://www.site.com/view.php?id=25&security=8e296a067a37563370ded05f5a3bf3ec
ارسال بشه، از نظر فنی کار اشتباهی هست؟ یعنی با این کار و نمایش کد MD5 ، هکر میتونه استفاده هایی کنه؟ یا اصلا هکر میتونه همراه این کد ارسالی ، مقادیری رو ارسال کنه که کد امنیتی بی اثر بشه؟
البته در صفحه ی view.php مقدار ارسال شده در کد امنیتی با مقدار تولید شده هنگام اینسرت در جدول برابری داده میشه و در صورت برقرار بودن شرط تساوی هست که بقیه کدها اجرا میشه!

ممنون میشم در مورد این یه مقدار واضح تر توضیح بدید تا مشکلم حل شه

البته اینو هم بگم که در جایی خوندم که استفاده از MD5 با اشکالاتی همراه هست و بهتره که از SHA256 و SHA512 استفاده بشه.. اگر تمایل داشتین ، بعد از اینکه در مورد بخش اول سوالاتم پاسخ کامل دادید، در مورد این قسمت هم یه نظری بدید
متشکر از توجه تون
بی صبرانه منتظر پاسخ های خوب شما استاتید هستم
یا علی

saeedvir
پنج شنبه 05 تیر 1393, 11:20 صبح
تفاوت POST و Get که یکی نمایش یا عدم نمایش در نوار آدرس و یکی دیگه هم اندازه ارسال است.

به شما قول می دم اگه در آدرس گیری مثل همون آدرس اولی که گفتید استفاده کنید و در سمت سرور در فایل پردازش (در اینجا view.php) نکات امنیتی مثل xss filter و sql filter و استفاده از pdo را رعایت کنید ،

هیچ اتفاقی نمی افته. پس همش به برنامه نویسی شما مربوطه که تمام همت و تلاش رو بزارید تا امکان هک شدن را به حداقل برسونید.

اون روش دومی که گفتید (ایجاد Token) بیشتر در جلوگیری از CSRF (https://www.owasp.org/index.php/Cross-Site_Request_Forgery_%28CSRF%298CSRF%29) استفاده میشه.

بازم سوالی داشتید مطرح کنید.


اینجا هم میتونه کمکتون کنه. (http://www.gowebdev.ir/catgview.php?catg=%D9%87%DA%A9%20%D9%88%20%D8%A7%D 9%85%D9%86%DB%8C%D8%AA%20%D9%88%20%D8%B4%D8%A8%DA% A9%D9%87)

eshpilen
پنج شنبه 05 تیر 1393, 12:16 عصر
بر اساس استاندارد و اصولش، درخواستهایی که تغییری در وضعیت یا عملیات مهمی رو در سمت سرور موجب میشن، باید با متد post ارسال بشن. فرضا دستوری باعث حذف رکوردی یا درج/ویرایش اطلاعاتی در دیتابیس میشه یا انتقال یک پولی رو موجب میشه، باید با متد post باشه.
حالا اینکه چرا، خب استانداردش اینو میگه، و به همین دلیل ممکنه سرورها یا نرم افزارهای کلاینت با درخواستهای post به نحو متفاوت و محتاتانه تری برخورد کنن.
و بنظرم همینطور اطلاعاتی که ارزش امنیتی دارن هم بهتره با post ارسال بشن. البته این جزو استاندارد نیست بصورت صریح، و بستگی به مورد و شکل و کاربرد اطلاعات مورد نظر داره خب (یوقتا شاید اصلا به شکل get نیازه).

eshpilen
پنج شنبه 05 تیر 1393, 12:30 عصر
میگن این ماجرا برای یه شرکتی پیش آمده بوده که یک روبات گوگل بوده فکر کنم اومده و یکسری لینک هایی رو که توی سایت پیدا کرده پیمایش کرده، بعد از قضا اون لینک ها هرکدام برای حذف یک اطلاعاتی بودن، و به این شکل بدون اینکه عمدی درکار بوده باشه و برنامه نویسان پیشبینی کرده باشن تمام اون اطلاعات از بین میره!
یک روبات، البته روبات گوگل، روبات خوب و غیرتبهکار، درخواست get ارسال میکنه، ولی درخواست post ارسال نمیکنه و فرم سابمیت نمیکنه!
اشتباه از اون برنامه نویسان بود که عملیاتی رو که موجب تغییری میشد با متد get انجام داده بودن.
همینطور، نرم افزارهای کلاینت از نظر استاندارد مجاز هستن حتی قبل از اینکه کاربر روی لینکی کلیک کنه اون لینک رو واکشی کنن (مثلا کش کنن و برای سرعت لود بیشتر موقعی که کاربر روش کلیک میکنه دیتا از قبل آماده باشه). پس یک لینک/get برای انجام کارهایی که فقط با عمل کاربر باید انجام بشن درست نیست. گرچه امروزه روز فکر نمیکنم بشه نرم افزاری رو پیدا کرد که سرخود چنین کاری بکنه؛ شاید یک دلیلش هم همین باشه که این استاندارد تاحالا بقدر کافی رعایت نشده و دیگه نمیشه کاریش کرد. خیلی ها نمیدونن و خیلی ها هم تنبلی و اهمال میکنن.
کاربرد عمدهء get در واکشی/نمایش/دریافت اطلاعات توسط کلاینت است، نه چیزهایی که تغییراتی رو موجب میشن یا عملیات های مهم و امنیتی.
یک مسئلهء دیگر از نظر امنیتی اینه که اطلاعات در URL ممکنه توسط سرورها و کلاینت کش یا Log بشن و باقی بمونن و دست دیگران بیفتن. ولی دیتایی که از طریق post ارسال میشه بطور معمول کش نمیشه (یا حداقل اینقدر زیاد و راحت و همه جا کش نمیشه - مطمئن نیستم/الان حضور ذهن ندارم). ضمنا خود کاربر ممکنه ندانسته یک URL رو بوکمارک کنه، جایی کپی پیست کنه، برای دیگران ارسال کنه، بدون اینکه بدونه حاوی اطلاعات/عملیات امنیتی مهمی است.

البته میگم که از نظر امنیتیش بازم بستگی به نوع و شکل اطلاعات و عملیات داره.
ضمنا استفاده همزمان از هردوی پارامترهای URL و پارامترهای ارسال شده توسط POST منع کلی نداره و بازم بستگی به مورد و شکل و کاربرد هرکدام داره که کدام رو بشه/باید/بهتره در کدوم قسمت گذاشت. منظورم اینه که مثلا شما یک فرم دارید که با متد post سابمیت میشه به یک url که توش یکسری پارامترها و اطلاعات دیگه بصورت query string وجود دارن. البته در کل به این درخواست post گفته میشه و دیگه get نیست، ولی بهرحال یکسری اطلاعات هم همزمان دارن از طریق url منتقل میشن.

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

اکثرا از get زیاد استفاده میکنن بخاطر راحتی و سرعت کدنویسی و تست است. من خودم خیلی وقتا با اینکه میدونستم اصولیش استفاده از post است از get استفاده کردم به همین دلیل، ولی خب بعضی از این موارد رو بعدا به post تغییر دادم. شاید در بعضی موارد به صرفه تر باشه که موقع توسعه و تست و وقتی هنوز برنامه کامل و قطعی نشده و به اصطلاح deployment صورت نگرفته، با get کار کنیم و بعد در مراحل آخر بیایم و یکسری رو به post تبدیل کنیم.

eshpilen
پنج شنبه 05 تیر 1393, 12:55 عصر
>> در ارتباط با همین سوالی که مطرح کردم، یک سوال دیگه ای هم هست: اینکه اگر در ارسال مقادیر با GET امکان هک براحتی وجود داره، آیا استفاده از MD5 و ارسال یک کد امنیتی همراه این مقادیر کار اصولی ای هست؟ یعنی اگر این کد امنیتی بصورت
http://www.site.com/view.php?id=25&security=8e296a067a37563370ded05f5a3bf3ec
ارسال بشه، از نظر فنی کار اشتباهی هست؟ یعنی با این کار و نمایش کد MD5 ، هکر میتونه استفاده هایی کنه؟ یا اصلا هکر میتونه همراه این کد ارسالی ، مقادیری رو ارسال کنه که کد امنیتی بی اثر بشه؟
البته در صفحه ی view.php مقدار ارسال شده در کد امنیتی با مقدار تولید شده هنگام اینسرت در جدول برابری داده میشه و در صورت برقرار بودن شرط تساوی هست که بقیه کدها اجرا میشه!

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

ali abedian
پنج شنبه 05 تیر 1393, 13:26 عصر
از پاسخ همه ی دوستان متشکرم..
والله بیشتر سوالم اینه که آیا میشه هکری، کدهایی رو همراه این پارامترها ارسال کنه که حتی شرطهایی که توی صفحه مقصد هستن (منظور همون فیلترهایی که در صفحه مقصد میشن) بی اثر بشن؟
که البته در جواب اول دوستان، گفته شد که همچین اتفاقی نمیافته ولی خب بازم مطرح کردم که شاید دوستان نظراتی رو داشته باشن در این مورد!!

سوال بعدیم این بود که آیا این کد امنیتی که با md5 تولید میشه، ارسالش با متد GET کار اشتباهی هست ؟! به خاطر اینکه در متد GET همه ی مقادیر ارسالی دیده میشن، آیا هکر با داشتن این کد MD5، میتونه کار خرابکارانه ای انجام بده یا نه؟!
به نظر میاد که ارسال کد امنیتی MD5 برای استفاده ای که مد نظرم هست کار کاملاً بی فایده ای هست!


سوال دیگه اینکه : آیا مقادیری که با متد POST ارسال میشن، به هیچ وجه قابل مشاهده نیستن؟ یعنی روشهایی برای رمزگشایشون نیست؟ اگر هست آیا براحتی امکان پذیره؟

eshpilen
شنبه 07 تیر 1393, 08:27 صبح
والله بیشتر سوالم اینه که آیا میشه هکری، کدهایی رو همراه این پارامترها ارسال کنه که حتی شرطهایی که توی صفحه مقصد هستن (منظور همون فیلترهایی که در صفحه مقصد میشن) بی اثر بشن؟
بطور معمول خیر.


به نظر میاد که ارسال کد امنیتی MD5 برای استفاده ای که مد نظرم هست کار کاملاً بی فایده ای هست!
بطور معمول بله.


سوال دیگه اینکه : آیا مقادیری که با متد POST ارسال میشن، به هیچ وجه قابل مشاهده نیستن؟ یعنی روشهایی برای رمزگشایشون نیست؟ اگر هست آیا براحتی امکان پذیره؟
مقادیر POST رو هم میشه دید و دستکاری کرد (یخورده سخت تر از GET، ولی بازم سخت بحساب نمیاد). هیچوقت روی دیده نشدن و عدم جعلی بودن اونا اتکا نکنید، مگر اینکه از روشهای مکمل رمزنگاری برای محافظت از اونا استفاده کرده باشد (که اینم بطور معمول کار حرفه ای است).
منتها به اون دلایلی که گفتم، از نظر امنیتی هم در خیلی موارد POST بهتر از GET است. یک دلیلش جلوگیری از اشتباهات غیرعمدی کاربران است بطور مثال.