0

我使用的 Cakephp 版本是3.4.x

我的 cakephp 3 应用程序中有十几个表格。我想为所有表单实现 xss 过滤。在不更改所有表单功能的情况下,最简单的方法是什么。

我在一个答案中读到,为了清理视图,我们应该使用 CakePHP 便利函数 h($string) ,它将使所有 XSS 尝试完全无害。

我试过这个,但 id 没有成功。

在此处输入图像描述

\src\Template\Users\view.ctp

<p><span>Address</span>: <?= h($user->address) ?></p>

有没有办法在将数据保存到数据库之前实现 xss 过滤?

我的控制器功能(为我烘焙的 cakephp)用于添加新用户和他的信息

\src\Controller\UsersController.php

public function add(){
    $this->viewBuilder()->setLayout('admin')  ;
    $user = $this->Users->newEntity();
    if ($this->request->is('post')) {
        $user = $this->Users->patchEntity($user, $this->request->getData());
        if ($this->Users->save($user)) {
            $this->Flash->success(__('The user has been saved.'));

            return $this->redirect(['action' => 'index']);
        }
        $this->Flash->error(__('The user could not be saved. Please, try again.'));
    }
    $groups = $this->Users->Groups->find('list', ['limit' => 200]);
    $this->set(compact('user', 'groups'));
    $this->set('_serialize', ['user']);
}

\src\Model\Table\UsersTable.php

public function beforeSave(Event $event)
{
    $entity = $event->getData('entity');

    if ($entity->isNew()) {
        $hasher = new DefaultPasswordHasher();

        // Generate an API 'token'
        $entity->api_key_plain = sha1(Text::uuid());

        // Bcrypt the token so BasicAuthenticate can check
        // it during login.
        $entity->api_key = $hasher->hash($entity->api_key_plain);
    }
    return true;
}

谢谢!

4

2 回答 2

0

您需要从entity.

请查看官方解决方案cakephp 3.X

你需要在model

use Cake\Event\Event;
use ArrayObject;


public function beforeMarshal(Event $event, ArrayObject $data, ArrayObject $options)
{
    foreach ($data as $key => $value) {
        if (is_string($value)) {
            $data[$key] = trim(strip_tags($value));
        }
    }
}
于 2019-06-06T15:14:10.300 回答
0

您可以在用户实体类中使用 mutator 方法:

class User extends Entity
{    
    protected function _setAddress($value) {
        return strip_tags($value);
    }
}

使用此 mutator,您可以在每次更新或创建实体时在保存到数据库之前修改输入数据。有关突变器的更多信息:https ://book.cakephp.org/3.0/en/orm/entities.html#accessors-mutators

您也可以使用其他方式,但我是在这一分钟前写的。如果您想使用,您应该测试此代码。使用$entity->getDirty()方法我们可以获取所有修改的字段,并在Table::beforeSave()方法中更改它们的值:

public function beforeSave($event)
{
    $entity = $event->getData('entity');

    $modified = $entity->getDirty();
    foreach((array) $modified as $v) {
        if(isset($entity->{$v})) {
            $entity->{$v} = strip_tags($entity->{$v});
        }
    }

    return true;
}    
于 2017-06-29T16:58:12.620 回答