cakephp3-如何进行xss过滤?

cakephp3-如何进行xss过滤?,cakephp,cakephp-3.0,xss,cakephp-3.x,server-side-validation,Cakephp,Cakephp 3.0,Xss,Cakephp 3.x,Server Side Validation,我使用的Cakephp版本是3.4.x 我的CakePHP3应用程序中有十几个表单。我想为所有表单实现xss过滤。在不更改所有表单函数的情况下,最简单的方法是什么 我在一个答案中读到,为了在视图中进行清理,我们应该使用CakePHP便利函数h($string),它将使所有尝试XSS的行为完全无害 我试过了,但没有成功 \src\Template\Users\view.ctp <p><span>Address</span>: <?= h($user-&g

我使用的Cakephp版本是3.4.x

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

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

我试过了,但没有成功

\src\Template\Users\view.ctp

<p><span>Address</span>: <?= h($user->address) ?></p>
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']);
}
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;
}
\src\Model\Table\UsersTable.php

<p><span>Address</span>: <?= h($user->address) ?></p>
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']);
}
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;
}

谢谢

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

class User extends Entity
{    
    protected function _setAddress($value) {
        return strip_tags($value);
    }
}
使用此变量,每次更新或创建实体时,都可以在保存到数据库之前修改输入数据。关于突变子的更多信息:

你们也可以用另一种方式,但我在一分钟前写的。如果你想使用,你应该测试这段代码。使用
$entity->getDirty()
方法,我们可以获得所有修改的字段,并在
表::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;
}    

您需要从
实体中删除标记

请检查
cakephp 3.X的官方解决方案

您需要在
型号中使用此选项

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));
        }
    }
}

h()
怎么不适合你?从您的屏幕截图上看,它看起来像是对有害的脚本标记进行了编码,这样它就不会运行了。便利功能不会剥离内容,只是确保内容编码正确,以防止用户输入注入潜在有害代码。但脚本标记会保存在数据库中。这就是我想要阻止的@Monkeynijai博士不相信这是可以直接用CakePHP实现的。您可能需要在保存之前查看
中手动剥离标记的情况,查看对此的公认答案:。调用未定义的方法Cake\Event\Event::getData()@Dariusz MajchrzakWhat on the output,而不是在保存时剥离一些标记@AnnaBelle cakephp?3.4.x@Dariusz Majchrzak的哪个版本