如何检查现有的数据与jquery验证库与codeigniter 4当csrf设置为自动?



我有一个表单,我试图验证与jquery验证插件和编码器4,我已经启用csrf设置自动生成每个请求。我能够在第一个请求上获得验证状态,但当我尝试另一个请求时,我得到错误403,当我将第二个参数设置为json_encode()时,我得到错误500。我希望能够在ajax调用的每个请求后更新csrf。

//我的路由器
  $routes->post('check-category', 'AdminCategory::check_category');

//我的控制器
//check if category name exist
    public function check_category()
    {
        $name = $this->request->getPost('name');
        $query = $this->db->table('categories')
                          ->where(['cat_name' => $name])
                          ->get()
                          ->getResult();
        
        $status = true;
        if(count($query) > 1){
            $status = false;
        }else{
            $status = true;
        }
        $data['csrf'] = csrf_hash();
        echo json_encode($status, $data);
    }

//javascript
    $('#create_category').validate({
        onkeyup: false,
        rules: {
            name: {
                remote: {
                    url: 'check-category',
                    type: "post",
                    data:{
                        csrf_hash_name: function(){
                           return $('input[name="csrf_hash_name"]').val();
                        }
                    },
                    complete: function(data){
                       $('input[name="csrf_hash_name"]').val(data.csrf);
                    }
                }
            }
        },
        messages: {
            name: {remote: "This category exists."}
        },
        submitHandler: function(form) { return false; }
    });

提前感谢。

PHP函数json_encode()的结构如下:

json_encode ( mixed $value , int $flags = 0 , int $depth = 512 ) : string|false

并返回:

包含所提供值的JSON表示的字符串。

在您的控制器函数check_category()中,您正在发送$status,而$data正在设置无效标志:

echo json_encode($status, $data);  // wrong

change $status = true; into $data['status'] = true;

,只是回显状态和CSRF散列

echo json_encode($data);  // correct

经过一番努力,我终于找到了解决问题的办法。现在我可以用dataFilter对象更新csrf令牌,并在ajax调用期间消除错误403。这是我对我的控制器所做的,即使我通过从db直接到控制器获取数据打破了Mvc原则。我知道这不是我所做的最好的方法,如果有任何建议,请纠正我,我将感激不尽。谢谢!

//我的控制器方法

    public function check_category()
    {
        $name = $this->request->getPost('name');
        $query = $this->db->table('categories')->where(['cat_name' => $name])->countAllResults();
        
        $valid = true;
        if($query > 0){
            $valid = false;
        }else{
            $valid = true;
        }
        $csrf = csrf_hash();
        return $this->response->setJSON(['valid'=>$valid, 'csrf'=>$csrf]);
    }

//my javascript

    $('#create_category').validate({
          onkeyup: false,
          rules: {
              name: {
                  required: true,
                  remote: {
                      url: 'check-category',
                      type: 'post',
                      dataType:'json',
                      dataFilter: function(data){
                          let obj = eval('('+data+')');
                          $('input[name="csrf_hash_name"]').val(obj.csrf);
                          return obj.valid;
                      },
                      data:{ csrf_hash_name: function(){ return $('input[name="csrf_hash_name"]').val(); } }
                  }
              }
          },
          messages: {
              name: {
                  required: "Enter a Category.",
                  remote: "{0} This category exists."
              }
          },
          submitHandler: function(form) {
              return false;
        }
      });

相关内容

  • 没有找到相关文章

最新更新