【问题标题】:How can I validate GET controller params in CakePHP 2?如何在 CakePHP 2 中验证 GET 控制器参数?
【发布时间】:2020-09-03 13:49:26
【问题描述】:

鉴于模型:

public $validate = [
    'amount' => array(
        'rule' => array('comparison', '>=', 0),
        'message' => 'You must buy over 0 of this item!'
    )
];

如何验证以下参数 #2?

public function buy(int $item, int $amount) {

验证似乎只为 POST 构建,我想退出这里。

【问题讨论】:

    标签: validation cakephp cakephp-2.0


    【解决方案1】:

    首先,使用GET 请求修改数据库是一种反模式,原因有很多。即使你假设一个友好的用户代理(你永远不应该这样做!),浏览器可能会表现得古怪并做一些意想不到的事情,例如多次发送 GET 请求(这是完全有效的,因为 GET 不会修改数据) ,对于POST/PUT/DELETE,他们通常不会这样做。

    我强烈建议您将端点更改为处理 POST 请求。

    话虽如此,您通常可以验证您想要的任何内容,验证机制首先只是验证数据,他们不知道也不关心数据的来源。你可以将任何你想要的数据交给你的模型,并让它验证它:

    $data = array(
        'item' => $item,
        'amount' => $amount,
    );
    $this->ModelName->set($data);
    
    if ($this->ModelName->validates()) {
        // data is valid
    } else {
        // data is invalid
        $errors = $this->ModelName->validationErrors;
    }
    

    此外,您也可以完全手动使用 CakePHP 的验证方法:

    App::uses('Utility', 'Validation');
    
    $isValid = Validation::comparison($amount, '>' 0);
    

    这个例子当然没有太大意义,因为$isValid = $amount > 0 会做同样的事情,但是它应该只是表明你可以在不涉及模型的情况下验证任何地方。

    另见

    【讨论】:

    • @VaelVictus 一些正常的事情例如是对 CORS 的预检请求,但这当然是一个 OPTIONS 请求,但如果你不在你的应用程序中处理它们,你会有一个GET 端点中的问题。一个更好的例子可能是 Firefox,如果它在响应的前 x 个字节中找不到字符集信息,它会中止 GET 请求,然后再次发送相同的请求,它将假定一个特定的字符集。 CSRF 也是需要牢记的,GET 端点通常没有受到保护,因此攻击者可以轻松利用它。
    猜你喜欢
    • 2023-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多