JQuery выдаёт 403 запрещённой ошибки в codeigniter - PullRequest
0 голосов
/ 27 февраля 2019

Я делаю некоторые вычисления, чтобы проверить, правильно ли пользователь ввел правильную сумму или нет.Я вызываю метод JQuery для события keyup текстового поля.Поскольку этот запрос будет отправляться снова и снова по ключу, я создал токен csrf внутри формы и использовал его сгенерированное значение в методе JQuery.Каждый раз, когда это вызывается, выдает ошибку «403 Forbidden».Пожалуйста, дайте мне знать, что я делаю неправильно.

Вот мой HTML:

<form id="form1" method="post" action="">
                             <?php 
                                                    $hash_name=$this->security->get_csrf_token_name();
                        $hash_value=$this->security->get_csrf_hash();
                        ?>
                        <input type="text" id="hash_value" value="<?php echo $hash_value;?>" style="display: none" />                           
                              <h3>Transfer to cash wallet</h3>
                              <div class="form-group form-animate-text" style="margin-top:40px !important;">
                                <input type="text" class="form-text" name="amount" id="ent_amount" onkeyup="check_balance(this.value)" required>
                                <span class="bar"></span>
                                <label>Amount to transfer</label>
                              </div>                                 
                              <h5 id="amount_over"></h5>                                  
                              <input type='button' class="btn btn-sm btn-primary m-t-n-xs" onclick="submitCash()" id='myBtn' value="Transfer" />
                            </form>

Вот мой метод JQuery:

<script type="text/javascript">

function check_balance(str){

    $(document).ready(function(){   

        var hash_value=$("#hash_value").val();

         $.ajax({
             type: "POST",
             url: "<?php echo base_url(); ?>" + "Users/check_earning", 
             data: {amount: str, csrf_snt_token: hash_value},
             dataType: "text",  
             cache:false,
             success: 
                  function(data){
                   if(data==200){

                   }
                  else{

                    $('#amount_over').html('* Transfer amount is greater than total balance'); 

                    }


                  }
              });
         return false;

     });   


}
     </script>

вот мой контроллерфункция

public function check_earning(){

        $entered_amount=$this->input->post('amount');                   
        $total_earnings=500;           
        if($entered_amount>$total_earnings){

            echo "error";
        }
        else{

            echo "200";
        }

    }

Любая помощь будет высоко ценится.

Ответы [ 4 ]

0 голосов
/ 01 марта 2019

На самом деле проблема заключалась в получении свежего сгенерированного токена.Я делал несколько запросов AJAX на этой странице.После каждого запроса к контроллеру codeigniter генерирует новый токен CSRF, и я посылаю один и тот же токен снова и снова.Я использовал cookie, чтобы получить свежий токен CSRF, потому что Codeigniter хранит каждый свежий токен CSRF в куки.я удалил эти строки из формы

$hash_name=$this->security->get_csrf_token_name();
$hash_value=$this->security->get_csrf_hash();
<input type="text" id="hash_value" value="<?php echo $hash_value;?>" style="display: none" />

После удаления я получаю свежий токен из cookie с помощью javascript.вот мой код

<script type="text/javascript">

function get_cookie(ck) {    
    var name = ck + "=";
    var ca = document.cookie.split(';'); 
    for(var i=0; i<ca.length; i++) {
       var c = ca[i];
       while (c.charAt(0)==' ') c = c.substring(1);
       if (c.indexOf(name) == 0) return c.substring(name.length,c.length);
   }
   return "";   
}

function check_balance(str){

    var csrf_ck=get_cookie('csrf_cookie_snt');
    $.ajax({
    type: "POST",
    url: '<?php echo site_url("users/check_earning"); ?>', 
    data: {amount: str, '<?php echo $this->security->get_csrf_token_name(); ?>':csrf_ck},
    dataType: "text",  
    cache:false,
    success: 
         function(data){
          if(data=='200'){

          }
         else{

           $('#amount_over').html('* Transfer amount is greater than total balance'); 

           }


         }
     });

}

</script>
0 голосов
/ 27 февраля 2019

Вы можете попробовать токен csrf напрямую в JS вместо HTML

 $.ajax({
         type: "POST",
         url: '<?php echo site_url("users/check_earning"); ?>', 
         data: {amount: str, '<?php echo $this->security->get_csrf_token_name(); ?>':'<?php echo $this->security->get_csrf_hash(); ?>'},
         cache:false,
         success: 
              function(data){
               if(data=='200'){

               }
              else{

                $('#amount_over').html('* Transfer amount is greater than total balance'); 

                }


              }
          });

Обратите внимание на несколько изменений.Также не забудьте включить csrf_protection в TRUE в config/config.php

0 голосов
/ 27 февраля 2019

Я думаю, что dataType: "text" вызывает проблему здесь.Попробуйте значение application/x-www-form-urlencoded или application/json, в зависимости от ожидаемого dataType на сервере.Вот так -

          $.ajax({
             type: "POST",
             url: "<?php echo base_url(); ?>" + "users/check_earning", 
             data: {amount: str, csrf_snt_token: hash_value},
             dataType: "application/json",  
             cache:false,
             success: 
                  function(data){
                   if(data==200){

                   }
                  else{

                    $('#amount_over').html('* Transfer amount is greater than total balance'); 

                    }


                  }
              });

PS: User должно быть user в конечной точке.

0 голосов
/ 27 февраля 2019

Можете ли вы проверить это?

function check_balance(str){
        var hash_value = $("#hash_value").val();
        $.ajax({
            type: "POST",
            url: "<?php echo site_url('users/check_earning'); ?>", //changes
            data: ({amount: str, csrf_snt_token: hash_value}), //changes
            dataType: 'json',  
            cache:false,
            success:function(data){
                if(data.status == 0){

                }else{
                    $('#amount_over').html('* Transfer amount is greater than total balance'); 
                }
            }
        });
        return false;
    }

контроллер:

public function check_earning() {
        $entered_amount = $this->input->post('amount');
        $total_earnings = 500;
        if ($entered_amount > $total_earnings) {
            $response_array['status'] = 1;
        } else {
            $response_array['status'] = 0;
        }
        echo json_encode($response_array);
        exit();
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...