Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/codeigniter/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php CodeIgniter对非表单变量/输入的验证?_Php_Codeigniter - Fatal编程技术网

Php CodeIgniter对非表单变量/输入的验证?

Php CodeIgniter对非表单变量/输入的验证?,php,codeigniter,Php,Codeigniter,假设我有用户生成的数据,这些数据不是通过表单发布的。 是否有一种方法可以使用/扩展Codeignators form_validation类来验证该数据 例如 听起来像是一个肮脏的黑客,但是你可以通过设置$\u post数据来欺骗一个表单post?假设您收到JSON,您可以执行以下操作: $json = "...."; //json encoded string $arr = json_decode($json, true); foreach($arr as $key => $value)

假设我有用户生成的数据,这些数据不是通过表单发布的。 是否有一种方法可以使用/扩展Codeignators form_validation类来验证该数据

例如


听起来像是一个肮脏的黑客,但是你可以通过设置$\u post数据来欺骗一个表单post?假设您收到JSON,您可以执行以下操作:

$json = "...."; //json encoded string
$arr = json_decode($json, true);
foreach($arr as $key => $value)
{
    $_POST[$key] => $value;
}

// do form validation as if the data was posted from a form.
这当然只是一个快速解决方案。您可以扩展/覆盖表单验证库的部分内容。我会怎么做:

  • 添加MY_Form_validation.php库,复制粘贴Form_validation.php中使用
    $\u POST
    设置规则()
    运行()
    匹配()
  • 将MY_Form_validation.php中的所有
    $\u POST
    实例替换为
    $this->validate_data
  • 在构造函数中将
    $validate\u data
    设置为
    $\u POST
  • 添加一个函数
    set\u validate\u data()
    ,该函数允许您覆盖
    $this->validate\u data

如果要使用清理后的数据,则必须在验证数据后使用$\u POST数组。如果这是不可接受的,还可以添加一个清除$this->validate_数据并返回XSS clean数组的函数。

您可以扩展codeigniter核心表单验证库的run和set_规则方法。这就是我在不扩展核心的情况下的工作方式:

  // Data coming from backbone model  
     $data = json_decode(file_get_contents('php://input'), true); 
     $this->config->load('myValidConf/form_validation');
     $non_post = array(
           'foo' => $data['foo']
      );
     $_POST = $non_post; 
     if ($this->form_validation->run('myConfigarray')!== FALSE) {
            echo 'we're ok';
     } else {
         echo validation_errors() ;
     }

希望对你有帮助

是的,您可以通过
set_data()
方法,现在开始

$this->form_validation->set_data(array(
        'name'    =>  'Full Name',
        'city'    =>  'City',
));

$this->form_validation->set_rules('name', 'Name', 'trim|required');
$this->form_validation->set_rules('city', 'City', 'trim|required');
$this->form_validation->set_rules('age', 'Age', 'trim|required');

if ($this->form_validation->run() == FALSE) {
    echo 'Invalid: ' . validation_errors();
} else {
    echo 'Valid';
}

可能与问题的答案无关。。但我可以知道:……那么,通过哪种方式,用户生成的数据来自用户?如果用户没有提交表单?Hi@TechCare99,您可能会认为用户提供的数据是json,而不是单个表单元素,或者该数据是来自需要清理的数据库的未处理数据不是好代码。更好的方法是创建一个类似于验证的库,它可以在任何数组上运行,而不仅仅是$\u POST。你问了一个方法,我给了你一个,你并没有说你不想要肮脏的黑客:p我添加了一个更好代码的建议。覆盖$\u POST似乎是一个糟糕的做法。
$this->form_validation->set_data(array(
        'name'    =>  'Full Name',
        'city'    =>  'City',
));

$this->form_validation->set_rules('name', 'Name', 'trim|required');
$this->form_validation->set_rules('city', 'City', 'trim|required');
$this->form_validation->set_rules('age', 'Age', 'trim|required');

if ($this->form_validation->run() == FALSE) {
    echo 'Invalid: ' . validation_errors();
} else {
    echo 'Valid';
}