cakephp3-如何进行xss过滤?
我使用的Cakephp版本是3.4.x 我的CakePHP3应用程序中有十几个表单。我想为所有表单实现xss过滤。在不更改所有表单函数的情况下,最简单的方法是什么 我在一个答案中读到,为了在视图中进行清理,我们应该使用CakePHP便利函数h($string),它将使所有尝试XSS的行为完全无害 我试过了,但没有成功 \src\Template\Users\view.ctpcakephp3-如何进行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
<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的哪个版本