رتبه موضوع:
  • 0 رای - 0 میانگین
  • 1
  • 2
  • 3
  • 4
  • 5
جلوگیری از ارسال دوباره اطلاعات فرم با ریلود شدن صفحه
#1
سلام وقت بخیر دوستان. من یک فرم ثبت نام در سایتم دارم که بعد از ثبت اطلاعات وقتی که صفحه ریلود (F5) میشود دوباره همان اطلاعات میخواد به مرورگر فرستاده شود. چه کاری باید انجام شود که با ریلود کردن صفحه این عمل صورت نگیرد؟؟
پاسخ
تشکر شده توسط:
#2
نمیشه جلوی Reload رو گرفت مگه اینکه بعد از اینکه اطلاعات رو سابمیت کردین، کاربر رو با دستور header توی PHP یا تگ meta مجدداً به همون صفحه ریدایرکت کنین تا اطلاعات Post شده حذف بشه. یک راه دیگه استفاده از یک توکن مخفی هست که توی کد بگذارین. برای مثال این کد رو درنظر بگیرین:
<?php
session_start();
$token = sha1(rand(1, 1000));
$_SESSION['token'] = $token;

if (isset($_POST['token']) && $_POST['token'] == $token) {
    // process form here
}

?>
<form ...>
    <input name="token" type="hidden" value="<?= $token ?>" />
    ...
    <input type="submit" value="Send" />
</form>

توی این حالت چون دفعات بعدی که صفحه با Refresh نمایش داده میشه، توکن عوض شده ولی چیزی که ارسال میشه همون توکن قبلی هست، دیگه فرم پردازش نمیشه.
پاسخ
تشکر شده توسط: hosien
#3
(01-02-1401، 04:22 ب.ظ)ADMIN نوشته: نمیشه جلوی Reload رو گرفت مگه اینکه بعد از اینکه اطلاعات رو سابمیت کردین، کاربر رو با دستور header توی PHP یا تگ meta مجدداً به همون صفحه ریدایرکت کنین تا اطلاعات Post شده حذف بشه. یک راه دیگه استفاده از یک توکن مخفی هست که توی کد بگذارین. برای مثال این کد رو درنظر بگیرین:
<?php
session_start();
$token = sha1(rand(1, 1000));
$_SESSION['token'] = $token;

if (isset($_POST['token']) && $_POST['token'] == $token) {
    // process form here
}

?>
<form ...>
    <input name="token" type="hidden" value="<?= $token ?>" />
    ...
    <input type="submit" value="Send" />
</form>

توی این حالت چون دفعات بعدی که صفحه با Refresh نمایش داده میشه، توکن عوض شده ولی چیزی که ارسال میشه همون توکن قبلی هست، دیگه فرم پردازش نمیشه.


سلام استاد شهرکی csrf token رو برای امنیت فرم ورود و ثبت نام نوشته بودم اما نمیدونستم که این کاربرد رو هم داره. ولی کدهای من باعث حذف اطلاعات post نمیشه... کجای کد ایراد داره. متشکر

<div class="signup">
        <form action="<?= baseUrl()?>/user/register/" id="form" method="post">
            <input type="hidden" name="csrfToken1" value="<?= generateToken()?>">
            <label for="chk" class="sig">ثبت نام</label>

            <div class="user-box">
                <input type="text" name="usernamereg" title="Enter Username" placeholder="نام کاربری" required>
                <!--<label>نام کاربری</label>-->
            </div>
            <div class="user-box">
                <input type="text" name="email" title="Enter email" placeholder="ایمیل" required>
                <!--<label>Email</label>-->
            </div>
<!--            <div class="user-box">
                <input type="password" name="passreg" title="Enter password" autocomplete="off" placeholder="رمز عبور" required>
                <label>Password</label>
            </div>-->
            <div class="user-box">
                <input type="text" name="mobile" title="Enter mobile" placeholder="شماره همراه" required>
                <!--<label>موبایل</label>-->
            </div>

            <button type="submit">ثبت نام</button>
        </form>
    </div>

    
    <!--login-->
    <div class="login">
        <form action="<?= baseUrl()?>/user/login/" method="post">
            <input type="hidden" name="csrfToken2" value="<?= generateToken()?>">
            <label for="chk" class="log" >ورود</label>

            <div class="user-box">
                <input type="text" name="usernamelog"  placeholder="نام کاربری" required>

                <!--<label>Username</label>-->

            </div>

            <div class="user-box">

                <input type="text"  name="mobile" autocomplete="off" placeholder="موبایل" required>

                <!--<label>Password</label>-->

            </div>

            <div class="user-box">

                <input type="checkbox" title="مرا به خاطر بسپار" placeholder="مرا به خاطر بسپار">
                <span>مرا به خاطر بسپار</span>
                <!--<label>مرا به خاطر بسپار</label>-->

            </div>
            <button type="submit">ورود</button>
        </form>

......................................................................................................

public function login(){
        if(isset($_POST['usernamelog'])){
            $this->loginCheck();
        } else {
            $this->loginForm();
        }
    }
   
    private function loginForm(){
        View::render('/user/login-register.php');
    }
    
    private function loginCheck(){
        checkCsrfToken();
        
        $usernamelog = htmlentities($_POST['usernamelog']);
        $mobile = htmlentities($_POST['mobile']);
      
        echo $usernamelog;
        br();
        echo $mobile;

        $record = UserModel::fetch_by_username_mobile_login($usernamelog,$mobile);
         
        if($record == null){
         message('fail',_username_not_registered);
         
           }    
        else {
                $_SESSION['id'] = $record['id'];
                $_SESSION['username'] = $record['username'];
                $_SESSION['mobile'] = $record['mobile'];
                $_SESSION['email'] = $record['email'];              
                View::render('/page/home.php');         
            }
            
        }

..................................................................................................................

function generateToken(){
   $csrfToken= generateHash(64);
   $_SESSION['csrfToken'] = $csrfToken;
   return $csrfToken;
}

function checkCsrfToken(){
    if(!isset($_SESSION['csrfToken'])){
        echo "csrf Token Error";
        exit();
    }
    if(str_contains($_POST['csrfToken'], '1')){
            if($_SESSION['csrfToken'] == $_POST['csrfToken']){
            unset($_SESSION['csrfToken']);
            return ;
            }
        
       else{
            echo "csrf Token ERROR";
            exit();
        }
    }
    
    if(str_contains($_POST['csrfToken'], '2')){
            if($_SESSION['csrfToken'] == $_POST['csrfToken']){
            unset($_SESSION['csrfToken']);
            return ;
            }
        
       else{
            echo "csrf Token ERROR";
            exit();
        }
    } 
}
پاسخ
تشکر شده توسط:
#4
(01-02-1401، 04:22 ب.ظ)سلام استاد شهرکی csrf token رو برای امنیت فرم ورود و ثبت نام نوشته بودم اما نمیدونستم که این کاربرد رو هم داره. ولی کدهای من باعث حذف اطلاعات post نمیشه... کجای کد ایراد داره. متشکر نوشته:
کد:
<div class="signup">
       <form action="<?= baseUrl()?>/user/register/" id="form" method="post">
           <input type="hidden" name="csrfToken1" value="<?= generateToken()?>">
           <label for="chk" class="sig">ثبت نام</label>

           <div class="user-box">
               <input type="text" name="usernamereg" title="Enter Username" placeholder="نام کاربری" required>
               <!--<label>نام کاربری</label>-->
           </div>
           <div class="user-box">
               <input type="text" name="email" title="Enter email" placeholder="ایمیل" required>
               <!--<label>Email</label>-->
           </div>
<!--            <div class="user-box">
               <input type="password" name="passreg" title="Enter password" autocomplete="off" placeholder="رمز عبور" required>
               <label>Password</label>
           </div>-->
           <div class="user-box">
               <input type="text" name="mobile" title="Enter mobile" placeholder="شماره همراه" required>
               <!--<label>موبایل</label>-->
           </div>

           <button type="submit">ثبت نام</button>
       </form>
   </div>

   
   <!--login-->
   <div class="login">
       <form action="<?= baseUrl()?>/user/login/" method="post">
           <input type="hidden" name="csrfToken2" value="<?= generateToken()?>">
           <label for="chk" class="log" >ورود</label>

           <div class="user-box">
               <input type="text" name="usernamelog"  placeholder="نام کاربری" required>

               <!--<label>Username</label>-->

           </div>                

           <div class="user-box">

               <input type="text"  name="mobile" autocomplete="off" placeholder="موبایل" required>

               <!--<label>Password</label>-->

           </div>

           <div class="user-box">

               <input type="checkbox" title="مرا به خاطر بسپار" placeholder="مرا به خاطر بسپار">
               <span>مرا به خاطر بسپار</span>
               <!--<label>مرا به خاطر بسپار</label>-->

           </div>
           <button type="submit">ورود</button>
       </form>


............................
public function login(){
        if(isset($_POST['usernamelog'])){
           $this->loginCheck();
       } else {
           $this->loginForm();
       }
   }
  
   private function loginForm(){
       View::render('/user/login-register.php');
   }
   
   private function loginCheck(){
       checkCsrfToken();
       
       $usernamelog = htmlentities($_POST['usernamelog']);
       $mobile = htmlentities($_POST['mobile']);
     
       echo $usernamelog;
       br();
       echo $mobile;

       $record = UserModel::fetch_by_username_mobile_login($usernamelog,$mobile);
        
       if($record == null){
        message('fail',_username_not_registered);
        
          }    
       else {
               $_SESSION['id'] = $record['id'];
               $_SESSION['username'] = $record['username'];
               $_SESSION['mobile'] = $record['mobile'];
               $_SESSION['email'] = $record['email'];              
               View::render('/page/home.php');         
           }
           
       }
......................................................................................
function generateToken(){
   $csrfToken= generateHash(64);
  $_SESSION['csrfToken'] = $csrfToken;
  return $csrfToken;
}

function checkCsrfToken(){
   if(!isset($_SESSION['csrfToken'])){
       echo "csrf Token Error";
       exit();
   }
   if(str_contains($_POST['csrfToken'], '1')){
           if($_SESSION['csrfToken'] == $_POST['csrfToken']){
           unset($_SESSION['csrfToken']);
           return ;
           }
       
      else{
           echo "csrf Token ERROR";
           exit();
       }
   }
   
   if(str_contains($_POST['csrfToken'], '2')){
           if($_SESSION['csrfToken'] == $_POST['csrfToken']){
           unset($_SESSION['csrfToken']);
           return ;
           }
       
      else{
           echo "csrf Token ERROR";
           exit();
       }
   } 
}
پاسخ
تشکر شده توسط:




کاربران در حال بازدید این موضوع: 1 مهمان