PDA

View Full Version : سوال: سوال در مورد فرستادن ایمن آرایه توسط متد post



amirhossein.sh
چهارشنبه 13 اردیبهشت 1396, 22:25 عصر
سلام خدمت دوستان عزیز

چجوری میتونم یک آرایه رو به صورت ایمن توسط متد پست ارسال کنم ؟

خودم روش زیر رو پیاده کردم اما اگه کاربر یکم زرنگ باشه با دستکاری کد های html میتونه باگ درست کنه


$essential_fields_array = array('name','lastname');
if(@$_POST['submit'] == 'go'){ var_dump($_POST);}?>
<form action=""> <input type="hidden" name="essential_fields" value="<?php echo serialize($essential_fields_array) ?>"/> <input type="submit" name="submit" value="go"></form>

hossein1377
چهارشنبه 13 اردیبهشت 1396, 22:49 عصر
سلام اگه توضیح بهتر بدی بهتر میتونم کمکت کنم مثلا برای چه کاری می خوای
ولی با این توضیح که دادی معلومه می خوای مقداری(ارایه) را که از قبل در php داری را ارسال کنی به صفحه ی دیگری خب تو می تونی اطلاعات فرم را به همین صفحه ارسال کنی و با php بگیری شون و به علاوه مقداری(ارایه) که می خوای بفرستی را با curl بفرستی به صفحه دیگر البته این باعث دو درخواست در سرور میشه شاید اگه بیشتر توضیح بدی بشه کار دیگه ای کرد

amirhossein.sh
پنج شنبه 14 اردیبهشت 1396, 00:08 صبح
سلام اگه توضیح بهتر بدی بهتر میتونم کمکت کنم مثلا برای چه کاری می خوای
ولی با این توضیح که دادی معلومه می خوای مقداری(ارایه) را که از قبل در php داری را ارسال کنی به صفحه ی دیگری خب تو می تونی اطلاعات فرم را به همین صفحه ارسال کنی و با php بگیری شون و به علاوه مقداری(ارایه) که می خوای بفرستی را با curl بفرستی به صفحه دیگر البته این باعث دو درخواست در سرور میشه شاید اگه بیشتر توضیح بدی بشه کار دیگه ای کرد


من برای هر کدوم از فرم های سایتم یه آرایه ای میسازم و داخل اون خصوصیات فیلد هارو مشخص میکنم و میگم مثلا فیلد نام خانوادگی باید 20 کاراکتر از نوع string باشه . وقتی فرم ارسال شد میرم تو کلاس کنترلر و اونجا کارای بررسی صحت داده های ارسالی از طرف کاربرو انجام میدم و اخر سر خطا هارو بر میگردونم ، اما این جا یه حفره امنیتی خیلی بزرگی وجود داره اونم اینه که این پیکربندی(همون آرایه ای که تنظیمات فیلد ها داخلشه) داخل خود فرم به صورت hidden قرار گرفته و کاربر اگه یکم زرنگ باشه میاد محتویات صفحه رو دستکاری میکنه و مثلا اونجا که من گفتم نام خانوادگی از نوع string باشه میکنتش int و کلا حساب کتاب مارو به هم میریزه ، مشکل اینه که من میخوام یه چیزیو با متد پست انتقال بدم اما نمیخوام کاربر بهش دسترسی داشته باشه

در مورد curl هم تا حالا هیچ مطالعه ای نداشتم لطفا بگو چجوری میتونه مشکلمو حل کنه ؟

hossein1377
پنج شنبه 14 اردیبهشت 1396, 10:31 صبح
روش کاری که می خوای پیش ببری تنها راهش با curl است (به احتمال 90%) که تو اول فرم را به همین صفحه ارسال کن و مقادیر فرم ها را به علاوه بقیه موارد با curl ارسال کن به صفحه مد نظر و اونجا مانند فرم معمولی می تونی با $_POST به تمامی موارد دسترس داشته باشی
اینجا کامل نمی تونم توضیح بهت بدم ولی چندتا مقاله که می تونه کار شما را حل کن میگم
http://phpkar.blog.ir/post/%D8%A2%D8%B4%D9%86%D8%A7%DB%8C%DB%8C-%D8%A8%D8%A7-%DA%A9%D8%AA%D8%A7%D8%A8%D8%AE%D8%A7%D9%86%D9%87-CURL-%D8%AF%D8%B1-PHP

https://webgoo.ir/151/%D8%A7%D8%B1%D8%B3%D8%A7%D9%84-%D9%BE%D8%A7%D8%B1%D8%A7%D9%85%D8%AA%D8%B1-%D8%A8%D9%87-url-%D9%88-%D8%AF%D8%B1%DB%8C%D8%A7%D9%81%D8%AA-%D9%85%D9%82%D8%A7%D8%AF%DB%8C%D8%B1-%D8%A8%D8%A7-php
(https://webgoo.ir/151/%D8%A7%D8%B1%D8%B3%D8%A7%D9%84-%D9%BE%D8%A7%D8%B1%D8%A7%D9%85%D8%AA%D8%B1-%D8%A8%D9%87-url-%D9%88-%D8%AF%D8%B1%DB%8C%D8%A7%D9%81%D8%AA-%D9%85%D9%82%D8%A7%D8%AF%DB%8C%D8%B1-%D8%A8%D8%A7-php)
شما باید بعد از اینکه فرم ساب میت شد مقادیر را بگیر و با یک حلقه به عبارت زیر تبدیل کنی
مثلا اگر دوتا فیلد داری به اسم username و password باید:
باید این رشته را تولید کنی: password=content1&username=content2&(حالا همون$essential_fields_array که رمزنگاری کردی را مثلا باین مقدار قرار بده)
password=content1&username=content2&essentialfield=$essential_fields_array
و درکل یه چنین کدی درست میشه


<?php
//تنظیم آدرس url
$curl = curl_init('ادرس موردنظر');
//تنظیم ارسال از طریق متد POST
curl_setopt($curl, CURLOPT_POST, 1);
//تنظیم پارامترها
curl_setopt($curl, CURLOPT_POSTFIELDS, 'password=content1&username=content2&essentialfield=$essential_fields_array');
//تعین اینکه پاسخ سرور دریافت شود یا خیر
curl_setopt($curl, CURLOPT_RETURNTRANSFER, TRUE);
//اجرای نشست
$result = curl_exec($curl);
//پایان نشست
curl_close($curl);
?>



من فقط یه توضیح مختصر و یه راهنمایی کوچیک کردم اما اگه بری تحقیق کنی و curl را یاد بگیری شاید بهتر از این هم انجام بتونی بدی

amirhossein.sh
پنج شنبه 14 اردیبهشت 1396, 11:56 صبح
یعنی تو این روش دیگه نیازی نیست به فرم یه فیلد از نوع hidden اختصاص بدم و مقدار اون رو برابر آرایه تنظیمات فرم قرار بدم ؟؟؟ و یه جورایی بعد از اینکه اسم و فامیل وارد شد و سابمیت شد این کرل هست که میاد اون آرایه رو هم به متد پست اضافه میکنه و میفرسته به کلاس ؟

hossein1377
پنج شنبه 14 اردیبهشت 1396, 12:56 عصر
دقیقا همینطوره تو مقادیر فرم را دریافت میکنی و به همراه مقادیر دیگر می فرستی به صفحه دلخواه 😉

plague
پنج شنبه 14 اردیبهشت 1396, 14:28 عصر
من برای هر کدوم از فرم های سایتم یه آرایه ای میسازم و داخل اون خصوصیات فیلد هارو مشخص میکنم و میگم مثلا فیلد نام خانوادگی باید 20 کاراکتر از نوع string باشه . وقتی فرم ارسال شد میرم تو کلاس کنترلر و اونجا کارای بررسی صحت داده های ارسالی از طرف کاربرو انجام میدم و اخر سر خطا هارو بر میگردونم ، اما این جا یه حفره امنیتی خیلی بزرگی وجود داره اونم اینه که این پیکربندی(همون آرایه ای که تنظیمات فیلد ها داخلشه) داخل خود فرم به صورت hidden قرار گرفته و کاربر اگه یکم زرنگ باشه میاد محتویات صفحه رو دستکاری میکنه و مثلا اونجا که من گفتم نام خانوادگی از نوع string باشه میکنتش int و کلا حساب کتاب مارو به هم میریزه ، مشکل اینه که من میخوام یه چیزیو با متد پست انتقال بدم اما نمیخوام کاربر بهش دسترسی داشته باشه

در مورد curl هم تا حالا هیچ مطالعه ای نداشتم لطفا بگو چجوری میتونه مشکلمو حل کنه ؟

راه حلی نداره چون کارت اشتباهه
ولیدیشن باید سمت سرور انجام بشه و قوانینش هم باید سمت سرور ثبت بشه (توی کنترلر)


من درک نمیکنم چرا گفتن دوستان curl چون هیچ ربطی نداره , شاید من درست نخوندم
curl به کارت نمیاد چون اون باز سمت سرور انجام میشه یعنی شما باید اطلاعات فرم رو بفرستی دوباره به بک اندی که curl توش قرار داره
حالا اگه اطلاعات ولیدیشن رو توی فرم بزاری باز یوزر میتونه دستکاری بکنه
اگه میخای اطلاعات ولیدیشن رو توی curl بزاری خب دیگه چه کاریه مستقیما توی کنترلرت بزار

amirhossein.sh
پنج شنبه 14 اردیبهشت 1396, 16:30 عصر
مشکل برطرف شد، اصلا نیازی به این نبود که بیام آرایه پیکربندی رو ب صورت مخفی تو فرم قرار بدم فقط کافی بود بعد از سابمیت شدن فرم بیام توسط دستور زیر آرایه رو بذارم داخل متد post


<?php $_POST['form_setting'] = $form_setting;?>


راه حلی نداره چون کارت اشتباهه
ولیدیشن باید سمت سرور انجام بشه و قوانینش هم باید سمت سرور ثبت بشه (توی کنترلر)


من درک نمیکنم چرا گفتن دوستان curl چون هیچ ربطی نداره , شاید من درست نخوندم
curl به کارت نمیاد چون اون باز سمت سرور انجام میشه یعنی شما باید اطلاعات فرم رو بفرستی دوباره به بک اندی که curl توش قرار داره
حالا اگه اطلاعات ولیدیشن رو توی فرم بزاری باز یوزر میتونه دستکاری بکنه
اگه میخای اطلاعات ولیدیشن رو توی curl بزاری خب دیگه چه کاریه مستقیما توی کنترلرت بزار

hossein1377
پنج شنبه 14 اردیبهشت 1396, 18:24 عصر
راه حلی نداره چون کارت اشتباهه
ولیدیشن باید سمت سرور انجام بشه و قوانینش هم باید سمت سرور ثبت بشه (توی کنترلر)


من درک نمیکنم چرا گفتن دوستان curl چون هیچ ربطی نداره , شاید من درست نخوندم
curl به کارت نمیاد چون اون باز سمت سرور انجام میشه یعنی شما باید اطلاعات فرم رو بفرستی دوباره به بک اندی که curl توش قرار داره
حالا اگه اطلاعات ولیدیشن رو توی فرم بزاری باز یوزر میتونه دستکاری بکنه
اگه میخای اطلاعات ولیدیشن رو توی curl بزاری خب دیگه چه کاریه مستقیما توی کنترلرت بزار

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

hossein1377
پنج شنبه 14 اردیبهشت 1396, 18:27 عصر
نکته دیگه این که کاربر به هیچ وجه نمی تونه اطلاعات ولیدیشن را تغییر بده چون تو بک اند ارسال میشه ولی بازم اگه برای ولیدیشن می خوای بهتره کلاس جداگونه بنویسی و اطلاعات را از قبل در این کلاس داشته باشی