PDA

View Full Version : امنیت در سبدخرید



Mahboubeh.M
شنبه 26 دی 1394, 07:30 صبح
سلام دوستان. وقتتون بخیر

من در سایتم سبد خرید دارم و کالاها به کاربر نمایش داده میشه و در زیر هر کالا دکمه «افزودن به سبد خرید» وجود داره که با کلیک بر روی اون، برای رویداد onclick دکمه، کد جی کوئری زیر نوشته شده:

({post('shopping.php',{itemID:ID,itemCnt:num.$

بنابراین وقتی کاربر view page source رو بزنه به راحتی متوجه میشه که برای افزودن به سبد یک فایل php با نام shooping وجود داره که دو فیلد itemID و itemCnt با متد post به اون ارسال میشه. میخواستم بدونم این از لحاظ امنیتی مشکلی برای سبدخرید ایجاد نمیکنه ؟؟ چون به راحتی قابل دیدنه که با کلیک روی دکمه «افزودن» فایل shopping.php اجرا میشه!!

اگر راه حل بهتری وجود داره ممنون میشم بگین.

مهرداد سیف زاده
شنبه 26 دی 1394, 08:14 صبح
برای این که هر کی نتونه خارج از سیستم سایت بهش request بزنه باید از مکانیزماهی مثل csrf یا valid value استفاده کنید
در csrf موقع بالا اومدن page‌یک کد هش ساخته میشه و در session کاربر ذخیره میشه و در داخل page هم قرار میگیره. برای هر درخواست باید این رشته ارسال بشه و شما در سمت سرور با دریافت هر درخواست رشته موجود در session رو با رشته ارسالی مقایسه میکنید اگر یکی بود یعنی درخواست از سمت برنامه شما بوده و گرنه fail میکنید
همچنین اعتبار سنجی مقدارها رو باید داشته باشید
و بعد از اون نام فیلدهای دیتابیس از نمایش و درخواستش جدا باشه. یعنی با پیگیری درخواستها کسی نباید بفهمه نام فیلدهای دیتابیس شما چی هست.

Mahboubeh.M
شنبه 26 دی 1394, 12:17 عصر
برای این که هر کی نتونه خارج از سیستم سایت بهش request بزنه باید از مکانیزماهی مثل csrf یا valid value استفاده کنید
در csrf موقع بالا اومدن page‌یک کد هش ساخته میشه و در session کاربر ذخیره میشه و در داخل page هم قرار میگیره. برای هر درخواست باید این رشته ارسال بشه و شما در سمت سرور با دریافت هر درخواست رشته موجود در session رو با رشته ارسالی مقایسه میکنید اگر یکی بود یعنی درخواست از سمت برنامه شما بوده و گرنه fail میکنید
همچنین اعتبار سنجی مقدارها رو باید داشته باشید
و بعد از اون نام فیلدهای دیتابیس از نمایش و درخواستش جدا باشه. یعنی با پیگیری درخواستها کسی نباید بفهمه نام فیلدهای دیتابیس شما چی هست.


ممنون آقای سیف زاده.
من از جی کوئری برای ارسال اطلاعات استفاده کردم. چطور میتونم این کد هش رو به صفحه موردنظرم بفرستم؟؟ اگر از form استفاده میکردم میتونستم input type=hidden رو برای این امر بکار ببرم ولی اگر در ({post('shopping.php',{itemID:ID,itemCnt:num.$ یک فیلد برای مقدار هش شده استفاده کنم باز هم کاربر میتونه این مقدار رو ببینه!! من چطور میتونم این کد هش رو با جیکوئری بفرستم طوری که به کاربر نمایش داده نشه؟؟؟

شرمنده میشه در مورد این قسمت هم بیشتر توضیح بدین «با پیگیری درخواستها کسی نباید بفهمه نام فیلدهای دیتابیس شما چی هست.»؟؟

مهرداد سیف زاده
شنبه 26 دی 1394, 13:34 عصر
کد هش شده رو در همون input بصورت hidden قرار بدید و بهش id بدید مثل _CsrgToken و بعد با هر بار درخواست یکی از مقدارهای ajax شما باشه. موقع ارسال ajax هم گرفتنش راحت هست


$.post('/path/to/file'
, {
CsrfToken: $('#_CsrfToken').val(),
key:'value'
}
, function(data, textStatus, xhr) {
console.log(data);
});







شرمنده میشه در مورد این قسمت هم بیشتر توضیح بدین «
با پیگیری درخواستها کسی نباید بفهمه نام فیلدهای دیتابیس شما چی هست.
»؟؟

مثلا فیلد دیتابیس شما برای محصول هست: product_color که رنگ محصول رو مشخص میکنه. برای امنیت بیشتر در زمان ارسال درخواستها بجای این نام از Pcolor استفاده کنید یا هر اسم دیگری.

Unique
یک شنبه 27 دی 1394, 15:08 عصر
میخواستم بدونم این از لحاظ امنیتی مشکلی برای سبدخرید ایجاد نمیکنه ؟؟ چون به راحتی قابل دیدنه که با کلیک روی دکمه «افزودن» فایل shopping.php اجرا میشه!!
خیر ، اهمیتی نداره چون مثلا همه سایت ها فرم ورود دارن و مشخص هست نام کاربری و گذرواژه برای یک صفحه با POST ارسال میشه ! خوب حالا که چی ؟ مشکل امنیتیش چیه ؟


برای این که هر کی نتونه خارج از سیستم سایت بهش request بزنه باید از مکانیزماهی مثل csrf یا valid value استفاده کنید
صحبت ایشون درسته زمانی که بخواهیم مانع از حملات CSRF بشیم ! یعنی مثلا کسی مکانیزم سایت شما را بدونه ، بعدش شخص دیگه ای که داره خرید میکنه را با ضعف CSRF متحمل به پرداخت سبد خرید برای خودش بکنه یا خسارت های دیگه ای بزنه. اما باز هم هر کسی "خودش" میتونه سورس را ببینه و مقدار hash را به دست بیاره ! و باز هم مشکل امنیتی وجود نداره.


و بعد از اون نام فیلدهای دیتابیس از نمایش و درخواستش جدا باشه. یعنی با پیگیری درخواستها کسی نباید بفهمه نام فیلدهای دیتابیس شما چی هست.
این هم مهم هست ولی نه به این اندازه که خودمون را به زحمت بندازیم ! اگه سایت ما مثلا Injection بخوره ، پیدا کردن نام فیلد ها کار را کمی سخت میکنه اما غیر ممکن نه ! پس حساسیت را بگذاریم روی طراحی پایگاه و مقابله با Sql Injection.