PDA

View Full Version : مبتدی: امن ترین راه انتقال مقدار از یک صفحه به صفحه دیگر



alterman
شنبه 04 خرداد 1392, 12:15 عصر
دوتا سوال از دوستان عزیز:

اولی اینکه من با متدهای get و post و session برای ارسال مقادیر بین صفحات php آشنایی دارم
اگر شما هم مثل http://phpsec.org/projects/guide/4.html و با رعایت مسائل امنیتی اعتقاد دارید که session
امن ترین راه برای ارسال مقادیر بین صفحات php هست اگر اطلاعات زیادی بخواهید بین صفحات رد و بدل کنید آیا بازهم session رو بهترین راه میدونید یا اینکه به خاطر زیاد شدن حجم اطلاعات روی سرور از روش دیگری استفاده میکنید؟

سوال دوم هم اینکه فرض کنید که میخواهیم یک range قیمت به مشتری برای یک محصول خاص پیشنهاد بدیم
(قیمت ها درتگهای ul li a هستند) و با کلیک کاربر روی هر کدوم وارد پنل قیمت نهایی میشه
کاری که من کردم



while($i<5){

$amountHash= md5(uniqid(rand(),true));
$priceHash = md5(uniqid(rand(),true));
// just calculating price , nothing more
$price = $chap + ($cp * $a[$i] ) + ($cb * $a[$i]) + ($cr * $a[$i]);
//مقدار
$_SESSION[$amountHash] = $a[$i];
//قیمت
$_SESSION[$priceHash] = $price;


echo '<td><div>
<ul><li><a href="pricePanel.php?qty='.$amountHash.'&prc='.$priceHash.'" ><span>تعداد :'.$amount.'</span><span> قیمت:'. $price .'ریال</span>
</a></li></ul></div>


</td>';


$i++;

}



که درواقع برای مقدار و قیمت با MD5 یک hash یونیک ساخته میشه و با اون hash در session ذخیره بشه
کاربر روی هر قیمتی که کلیک بکنه hash قیمت و مقدار همراه با url به صفحه pricePanel ارسال مییشه و
در اون صفحه هم


if(isset($_GET['amount']) && isset($_GET['price'])){
$amountHash = $_GET['qty'] ;
$priceHash = $_GET['prc'];
session_start();
$amount = $_SESSION[$amountHash];
$price = $_SESSION[$priceHash];
}



که این طوری محتویات session رو دریافت میکنم

این کد روی Local کاملا کار میکنه
ولی وقتی روی host آپ میکنم فقط دفعه اول کار نمیکنه!

اگه دوستان میدنن مشکل از کجاست یا کلا راه دیگه ای پیشنهاد میکنند ممنون میشم مطرح کنند

امیـرحسین
شنبه 04 خرداد 1392, 12:42 عصر
پارامترهای GET و POST باید توجیه داشته باشه. کلیدهای GET رو کاربر میتونه بوکمارک یا ذخیره کنه و کلیدهای POST میتونن Resubmit شن. یعنی فقط اطلاعاتی که برای این دو حالت منطق دارن باید GET یا POST باشن.
امنیت SESSION یه حد مشخصیه. اگر میخواید ازش استفاده کنید میتونید بجای ساختن کلیدهای تصادفی یه array درست کنید حاوی همه اطلاعات و اون رو با یک کلید تصادفی در SESSION ذخیره کنید (یعنی یه array رو داخل SESSION قرار بدید).
برای بهینگی و امنیت بیشتر میتونید اطلاعات SESSION رو داخل دیتابیس نگهداری کنید و ...

siavashsay
شنبه 04 خرداد 1392, 12:42 عصر
دوست عزیز !
این بستگی به اطلاعات شما داره ! معمولا از سشن برای مقادیری استفاده میشه که قابل جعل ( دستکاری ) نباشه !
یعنی اینکه اگر کاربر اونا رو دستکاری کرد اتفاق خاص ( مهمی ) برای سایت پیش نیاد !
مثلا برای فرم لاگین که از شما نام کاربری و رمز عبور رو میخواد از سشن استفاده میکنن که در صورت درست بودن مقادیر یک سشن با نام کاربری میسازن و اون رو هندل میکنن !
اما برای مقادیری از قبیل قیمت و نوع کالا فک نکنم این نیاز باشه !
حالا گیریم که کابر نوع کالا رو عوض کرد ! خوب میره و اون کالا رو میخره !
اما اگر منظور شما اینه که مثلا کالای A باید 1000 تومان قیمت داشته باشه و کالای B قیمت 500 تومان و کاربر با دستکاری خواست که کالای A رو به قیمت کالای B یعنی 500 تومان خرید کنه این دیگه نیاز به یک verify داره که اونم در مرحله آخر خرید باید از توی دیتابیس چک شه !
مثلا در صفحه آخر تایید کالا شما باز هم باید چک کنید که کالای مورد نظر انتخابی توسط کاربر همون مبلغی مورد نظر شما رو داشته و در غیر اینصورت کاربر رو با خطا روبرو کنید و فقط به یک تایید در مرحله اول بسنده نکنید !
موفق باشید :)

alterman
شنبه 04 خرداد 1392, 13:04 عصر
اما اگر منظور شما اینه که مثلا کالای A باید 1000 تومان قیمت داشته باشه و کالای B قیمت 500 تومان و کاربر با دستکاری خواست که کالای A رو به قیمت کالای B یعنی 500 تومان خرید کنه این دیگه نیاز به یک verify داره که اونم در مرحله آخر خرید باید از توی دیتابیس چک شه !


ممنون از راهنمایی خیلی خوبتون ، منتها مثل اینکه من مسئله رو خوب توضیح ندادم
بینید مشکل اینجاست قراره به یک محصول چاپی (که تقریبا 200 تا بیشتر المان تاثیرگذار روی قیمت داره ) یک رنج پیشنهادی قیمت با تعداد مورد نظر دریافت بکنه
قرار نیست محصول a باید 1000 تومان باشه و محصول b مثلا فلان قیمت که بعدا بشه verify کرد.
و حالا فقط روی یکی از قیمت های پیشنهادی که کلیک شد بره 50 تا المان بعدی روش چک بشه و بعد دوباره المان های بعدی
که اینجا امنیت خیلی مهمه یعنی اگه session hijack بشه و قیمت پیشنهادی با المان های مثلا a , b عوض بشه کل سیستم قیمت دهی میره هوا

alterman
شنبه 04 خرداد 1392, 13:27 عصر
توی stackoverflow یه سری میگفتن چون کاربر با کلیک روی لینک میره یه صفحه دیگه session دفعه اول فرصت ذخیره نشدن پیدا نمیکنه
اما من هرکار کردم با session_register و کارهای دیگه باز هم نمیشد.
راجع به این حلقه while اگه دوستان ایده ای دارند مطرح بکنند بسیار ممنون میشم
درواقع مشکل اصلی اینه که به تعداد مقدار/قیمت پیشنهادی باید session یونیک ذخیره بشه ( که من این کار رو با تولید hash یونیک و قراردادنش به عنوان نام session انجام دادم)
اما همونطور که گفتم فقط بار اول session کار نمیکنه