CakePhp:避免XSS攻击,保持蛋糕的易用性

J4N*_*J4N 2 php security xss cakephp

我喜欢cakePhp的一个原因是,我们可以轻松地生成一个生成的编辑表单,以便我们保存.

例如在控制器中:

function add() {
        if (!empty($this->data)) {
            $this->Post->create();
            if ($this->Post->save($this->data)) {
                $this->Session->setFlash(__('The post has been saved', true));
                $this->redirect(array('action' => 'index'));
            } else {
                $this->Session->setFlash(__('The post could not be saved. Please, try again.', true));
            }
        }
        $users = $this->Post->User->find('list');
        $this->set(compact('users'));
    }
Run Code Online (Sandbox Code Playgroud)

问题是我们的字段容易受到XSS(跨站点脚本)的攻击.我知道"Sanitize :: Clean"方式,但我有一个问题:这意味着我们必须在保存对象之前在所有字段上执行此操作.如果我们添加一个字段怎么办?我们应该继续我们所有的代码来检查我们是否对它进行消毒?有没有办法说"在保存它之前清理这个对象",而没有指定任何字段?

谢谢!

Ros*_*oss 7

正如andreas正确指出的那样,通常接受最佳实践来存储原始HTML并且仅对输出进行清理(通过存储原始输入,它可以帮助跟踪谁发布了恶意内容等).

要在视图中进行清理,您应该使用CakePHP便捷函数h($string),它是htmlspecialchars的捷径,它将使对XSS的所有尝试完全无害.

编辑 - 这不会在物理上删除 XSS代码,而只是以一种不会损害您的应用程序的方式呈现它.

echo h('<script>alert("xss");</script>');

会产生 &lt;script&gt;alert(&#039;xss&#039;);&lt;/script&gt;