PDA

View Full Version : سوال: هربار refresh یک insert جدید!



yeksib
جمعه 13 بهمن 1391, 22:46 عصر
سلام !
من یک فرم معمولی دارم که کاربر پس از پرکردنش submit میکنه و فرمش insert میشه!
حالا اگه کاربر بیاد صفحه رو refresh کنه تمامی اطلاعات قبلی گویا در حافظه میمونه و دوباره insert میشه !و هرچند بار هم که اینکار رو بکنه باز هم میشه!
حالا من چه طور میتونم جلوی این کار رو بگیرم؟
از همگی ممنونم.

siavashsay
جمعه 13 بهمن 1391, 22:58 عصر
1- میتونید بعد از ثبت اطلاعات کاربر رو به صفحه دیگه منتقل کنید تا اطلاعات POST که در صفحه مونده پاک شه !
2- میتونید با استفاده از CAPTCHA کد برای فرمتون از این کار جلوگیری کنید ! چون در این حالت کد عوض میشه و اگر کاربر رفرش کنه با خطا روبرو میشه و اطلاعات مجدد insert نمیشه !
3- استفاده از token که مثل همون captcha کد هست اما به نحو دیگه ای ( برای اطلاعات بیشتر در مورد CSRF - TOKEN برای فرم ها جستجو کنید ! )
اما در هر صورت بهتره که یه جوری کاربر رو به صفحه دیگه ای منتقل کنید تا اطلاعات POST از حافظه صفحه خارج شن !
یا با استفاده از یک header به همون صفحه حالت refresh بگذارید !
موفق باشید

yeksib
جمعه 13 بهمن 1391, 23:14 عصر
1- میتونید بعد از ثبت اطلاعات کاربر رو به صفحه دیگه منتقل کنید تا اطلاعات POST که در صفحه مونده پاک شه !
2- میتونید با استفاده از CAPTCHA کد برای فرمتون از این کار جلوگیری کنید ! چون در این حالت کد عوض میشه و اگر کاربر رفرش کنه با خطا روبرو میشه و اطلاعات مجدد insert نمیشه !
3- استفاده از token که مثل همون captcha کد هست اما به نحو دیگه ای ( برای اطلاعات بیشتر در مورد CSRF - TOKEN برای فرم ها جستجو کنید ! )
اما در هر صورت بهتره که یه جوری کاربر رو به صفحه دیگه ای منتقل کنید تا اطلاعات POST از حافظه صفحه خارج شن !
یا با استفاده از یک header به همون صفحه حالت refresh بگذارید !
موفق باشید
این شماره 3 و header رو هستم !
ولی header که همیشه وسط صفحه جواب نمیده چون قبلش خروجی داره و تازش هم اگه header کار کنه مثلا وقتی میخواهیم بعداز ثبت ، کاربر رو مطلع کنیم از ثبت اطلاعتش ، فورا چون هدر اجرا میشه هیچ چی نمایش داده نمیشه!(این کار رو قبلا انجام دادم خوب جواب نداده)
روش 3 رو هم زیاد باهاش کار نکردم !

siavashsay
جمعه 13 بهمن 1391, 23:25 عصر
کاربر رو مطلع کنیم از ثبت اطلاعتش ، فورا چون هدر اجرا میشه هیچ چی نمایش داده نمیشه
یک handler ایجاد کنید ! مثلا فرض میکنیم صفحه ثبت مشخصات شما به نام register.php هست !
حالا header رو اینطوری بنویسید :

header("Location:register.php?msgid=1")
حالا توی صفحه register تعریف کنید که اگر متغیر GET وجود داشت یک پیغام نشون بده !
مثال :

if(isset($_GET['msgid'])){
$msgid=$_GET['msgid'];
if($msgid==1){
echo "Your Data is Registered!";
}
}
اینجا شما دارید به صفحه میگید که اگر متغیر GET با عنوان msgid وجود داشت و مقدار اون برابر 1 بود بگه که اطلاعات وارد شد !
و در صورتی این متغیر فرستاده میشه که کاربر اطلاعاتش رو با موفقیت ثبت کنه !
حالا یک سوال پیش میاد که اگر کاربر به صورت دستی متغیر GET رو آخر URL اضافه کرد چی ؟!
جواب اینه که کاربر داره با خودش بازی میکنه که یک پیغام بهش نشون داده شه ! چون اون متغیر صرفا جهت اعلام یک پیغام هست نه انجام عملیات خاصی !
هرچقدر دلش میخواد اونکارو بکنه !
در مورد CSRF هم یک تحقیق بکنید توی همین فروم گمونم خودم یک تاپیک دارم در موردش !
موفق باشید :)

yeksib
جمعه 13 بهمن 1391, 23:41 عصر
یک handler ایجاد کنید ! مثلا فرض میکنیم صفحه ثبت مشخصات شما به نام register.php هست !
حالا header رو اینطوری بنویسید :

header("Location:register.php?msgid=1")
حالا توی صفحه register تعریف کنید که اگر متغیر GET وجود داشت یک پیغام نشون بده !
مثال :

if(isset($_GET['msgid'])){
$msgid=$_GET['msgid'];
if($msgid==1){
echo "Your Data is Registered!";
}
}
اینجا شما دارید به صفحه میگید که اگر متغیر GET با عنوان msgid وجود داشت و مقدار اون برابر 1 بود بگه که اطلاعات وارد شد !
و در صورتی این متغیر فرستاده میشه که کاربر اطلاعاتش رو با موفقیت ثبت کنه !
حالا یک سوال پیش میاد که اگر کاربر به صورت دستی متغیر GET رو آخر URL اضافه کرد چی ؟!
جواب اینه که کاربر داره با خودش بازی میکنه که یک پیغام بهش نشون داده شه ! چون اون متغیر صرفا جهت اعلام یک پیغام هست نه انجام عملیات خاصی !
هرچقدر دلش میخواد اونکارو بکنه !
در مورد CSRF هم یک تحقیق بکنید توی همین فروم گمونم خودم یک تاپیک دارم در موردش !
موفق باشید :)

پاسختون خیلی عالی بود الان امتحانش کردم ولی من متاسفانه با همون مشکلی که خدمتتون عرض کردم مواجه شدم !
Warning: Cannot modify header information - headers already sent by

siavashsay
شنبه 14 بهمن 1391, 00:12 صبح
بسیار خوب !
ظاهرا آخرین راه استفاده از token هست !
الان یک تاپیک زدم ! گفتم دیگه پست نباشه تا بقیه هم استفاده کنن !
موفق باشید !

ravand
شنبه 14 بهمن 1391, 09:52 صبح
این اخطار بیشتر مواقعی پیش میاد که کاراکتر اضافه قبل از header وجود داشته باشه:

Warning: Cannot modify header information - headers already sent by

mamali-mohammad
شنبه 14 بهمن 1391, 13:22 عصر
بهترین روش که خودم استفاده می کنم :
فرم بلاخره محدودیت باید داشته باشه دیگه ؟ درسته ؟
مثلا عنوان خالی نباشه ؟
درست ؟
حالا وقتی فرم insert شد بیا title='' خالی کن !
طرف رفرش میکنه اما هیچ مقداری توی title نیست

MMSHFE
شنبه 14 بهمن 1391, 13:25 عصر
پاسختون خیلی عالی بود الان امتحانش کردم ولی من متاسفانه با همون مشکلی که خدمتتون عرض کردم مواجه شدم !
Warning: Cannot modify header information - headers already sent by
فایلتون رو با کدگذاری UTF-8 without BOM ذخیره کنید و اول اسکریپت دستور ;()ob_start و آخرش دستور ;()ob_end_flush رو بنویسید، مشکل رفع میشه.

MMSHFE
شنبه 14 بهمن 1391, 13:25 عصر
بهترین روش که خودم استفاده می کنم :
فرم بلاخره محدودیت باید داشته باشه دیگه ؟ درسته ؟
مثلا عنوان خالی نباشه ؟
درست ؟
حالا وقتی فرم insert شد بیا title='' خالی کن !
طرف رفرش میکنه اما هیچ مقداری توی title نیست
این روش رو امتحان کردین؟ با Refresh دوباره هدرهای قبلی ساخته و ارسال میشه حتی اگه فرم خالی شده باشه.

mamali-mohammad
شنبه 14 بهمن 1391, 14:21 عصر
این روش رو امتحان کردین؟ با Refresh دوباره هدرهای قبلی ساخته و ارسال میشه حتی اگه فرم خالی شده باشه.

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