PDA

View Full Version : امنیت برای المان hidden در فرم



sara.ghavam
چهارشنبه 05 خرداد 1395, 11:37 صبح
سلام دوستان من برای ساخت فرم از توابع خود codeigniter استفاده کردم و یک hidden input هم دارم


echo form_hidden('news_id', $news_id);

میخواستم بدونم که چطوری میشه امنیت رو برقرار کرد؟ با توجه به اینکه خب وقتی صفحه لود میشه کاربر اگر بخواد شیطنت کنه میتونه مثلا مقدار news_id رو عوض کنه اونوقت اطلاعات مربوط به خبر دیگه ای آپدیت میشه و همه چیز به هم میریزه

البته من

تو model از کد زیر استفاده کردم

$news_id = $this->input->post('news_id',true);

این چزی که گفتم برای همه المان های فرم صدق میکنه/ میشه کمکم کنید؟

plague
چهارشنبه 05 خرداد 1395, 16:32 عصر
لطفا سوالت رو کامل و با نمونه کد بنویسی (اون تکه ای کد که راجبش سوال داری نه همه کد هات ! ) که بشه بهت کمک کرد
شما وقتی کد مدلت رو نزاشتی ما از کجا قراره بفهمیم که میخای با این news_id چیکار کنی که بگیم چجوری امنش کنی ؟ حداقل میگفتی فرم چیه و قراره چیکار کنی با این آیدی

در کل این سناریو چیز زیاد مهمی نیست .... بدترین کاری که کاربر میتونه بکنه اینه که یه کد مخرب بزاره برای sql injectionجای آیدی که اگه شما کوئری هات رو با استفاده از سیستم مخصوص فریم ورک (active record) بنویسی اونها رو فریم ورک خنثی میکنه و نیازی نیست بابتشون نگرانی داشته باشی ... شما میتونی اون خبر رو از دیتابیس اول بخونی با استفاده از آیدی که کاربر فرستاده ... در صورتی که وجود نداشت در دیتابیس کل عملیات رو متوقف کنی

ولی کاربر میتونه عدد آیدی رو عوض کنه به یک عدد دیگه بزاره که این در برخی موارد مشکل خاصی به بار نمیاره مثلا

اگه فرم ثبت نظر باشه برای خبر و عدد آیدی رو عوض کنه آیدی یه خبر دیگه رو بزاره فوقش اینه که نظرش برای یه خبر دیگه ثبت میشه ! که چیز مهمی نیست و هیچکس هم انقد بیکار نیست

ولی مثلا یه فرم هست کاربری میخاد مشخصاتش رو ویرایش کنه .... شما نباید شناسه اون کاربر رو بزاری تو فرم به صورت مخفی !! چون اونوقت میتونه تغییرش بده و مشخصات یکنفر دیگه رو ویرایش کنه ... سیستم شما باید بدونه شناسه کاربر لاگین شده چیه در همه لحظات نه اینکه از توی فرم دریافتش کنه

یا اینکه مثلا یه صفحه داریم برای محصولات کاربر تیک میزنه کدوم ها رو میخاد و با تیک زدنش مثلا شما با جی کوئری قیمت اینای یکه تیک زده رو جمع میکنی و درجا بهش نشون میدی جمع کل مبلغ ... یه اشتباه آماتوری که بعضی ها انجام میدن اینه که این قیمت جمع کل رو همون سمت کاربری میریزن توی یه فیلد مخفی و وقتی کاربر دکمه خرید نهایی رو زد این مبلغ رو میفرستن به سمت سرور و از حساب کاربر کم میکنن ... که در اینصورت ینفر وارد باشه راحت میتونه این مبلغ کل رو از فیلد مخفی تغییر بده و کم کنه

شما باید محاسباتی اینجوری که سمت کلاینت انجام میشه رو کلا ندیده بگیری در سمت سرور و از اول محاسبه کنی
یعنی شما فقط آیدی محصولات خریداری شده رو پست میکنی به سرور و سمت سرور دوباره محصولات رو از دیتابیس میخونی و قیمت هاشون رو جمع میکنی و اون مبلغ جمع شده رو از حساب کاربر کم میکنی

sara.ghavam
پنج شنبه 06 خرداد 1395, 14:26 عصر
خیلی ممنون که پاسخ دادین

خب من کدهام رو که گذاشتم تو این فرمی که من گفتم محتوای یک خبر نشون داده میشه بعد کاربر این محتوا رو تغییراتی بهش میده چیزهایی بهش اضافه میکنه و سپس فرم که ارسال میشه توی مدل فقط این اطلاعات بر روی دیتابیس update میشه و بعد خبر بعدی نمایش داده میشه
این نرم افزار عمومی نیست و قراره به صورت داخلی تو یک شرکت استفاده بشه.
من الان ID خبری که تو فرم نمایش داه میشه و قراره آپ دیت بشه رو به صورت مخفی از طریق فرم ارسال میکنم که توی مدل بدونم باید چه خبری رو آپدیت کنم اما الان اگر یک کاربر زرنگ پیدا بشه که کد خبر رو عوض کنه اونوقت میتونه خبرهای دیگه رو دستکاری کنه که خروجی نهایی کار خراب میشه

امیدوارم که متوجه شده باشید.
الان من برای اینکه بدونم کدوم خبر رو باید آپدیت کنم این راه به ذهنم رسید. راه حل بهتر شما چیه؟؟؟

maspadana
پنج شنبه 06 خرداد 1395, 16:08 عصر
کلا نمیشه امنیت اون اطلاعات رو تضمین کرد
تنها کاری ک می تونید بکنید اینه ک موقع ثبت و به روز رسانی اطلاعات بررسی کنید که کاربر ب اون اطلاعات دسترسی داشته یا نه

sara.ghavam
پنج شنبه 06 خرداد 1395, 17:06 عصر
خب من وقتی الان ID خبر رو به صورت hidden میفرستم به مدل اگر کاربر بخواد میتونی این ID رو تغییر بده و یک خبر دیگه ویرایش بشه

خب این خیلی بده برای من لطفا کمک کنید و یه راه حلی بگید که من بتونم این ID خبر رو داشته باشم اما کاربر هم نتونه به اون دسترسی داشته باشه نتونه اون رو تغییر بده

charcharkh
پنج شنبه 06 خرداد 1395, 17:23 عصر
بزارش توی یه سشن راحت :لبخندساده:

plague
پنج شنبه 06 خرداد 1395, 20:09 عصر
والله اینجوری که شما داری میگی کاربر ها دسترسی دارن که خبر ها رو ادیت کنن ! دیگه مشکل چیه ؟
شما نگران آیدیش هستی زیاد معنی نمیده وقتی که کاربر دسترسی داره هر خبری رو ویرایش کنه (حداقل این چیزیه که من فهمیدم از توضیحات شما )

اگه کاربر دسترسی براش ثبت شده که خبر های خاصی رو ادیت کنه
خیلی راحت تو کنترلر قبل از ویرایش چک میکنی آیدی اون خبر رو که این کاربر دسترسی داره ویرایش کنه یا نه و اگه نداشت اجازه نمیدی

arash_fa
پنج شنبه 20 خرداد 1395, 18:18 عصر
شما از سشن یا کوکی استفاده کن مثلا


$this->session->set_userdata('LAST_NEWS_ID_EDIT',$id);

بعد زمان ویرایش یا زدن دکمه چک کن مقدار اینپوت hidden با مقدار زیر یکیه : مثلا:


($this->session->userdata('LAST_NEWS_ID_EDIT') == $this->input->post('news_id') ) OR EXIT('خطا در ارسال جعلی');