0

CakePHP Version Ich verwende ist 3.4.xcakephp3- wie XSS-Filterung zu tun? in meiner cakephp 3 Anwendung

ich mehr als ein Dutzend Formen haben. Ich möchte XSS-Filter für alle Formulare implementieren. Was ist der einfachste Weg dies zu tun, ohne Änderungen an allen Formularfunktionen vorzunehmen?

Ich lese in einer Antwort, dass, um in einer Ansicht zu sterilisieren, wir die CakePHP-Komfortfunktion h ($ string) verwenden sollten, die alle Versuche an XSS völlig harmlos macht.

Ich habe versucht, aber ID hat nicht geklappt.

enter image description here

\ src \ Template \ Users \ view.ctp

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

Gibt es eine Möglichkeit xss Filterung zu implementieren, bevor die Daten in die Datenbank zu speichern?

Meine Controller-Funktion (die für mich gebacken CakePHP) für

\ src \ Controllers \ 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 \ Modell \ einen neuen Benutzer und seinen Info Hinzufügen Tabelle \ 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; 
} 

Vielen Dank!

+0

Wie hat 'h()' nicht für Sie arbeiten? Auf Ihrem Screenshot sieht es so aus, als hätte es das schädliche Skript-Markup so codiert, dass es nicht ausgeführt wird. Die Convenience-Funktion entkleidet den Inhalt nicht, sondern stellt nur sicher, dass sie korrekt codiert ist, um zu verhindern, dass Benutzereingaben potenziell schädlichen Code eingeben. – drmonkeyninja

+1

Skript-Tags werden jedoch in der Datenbank gespeichert. Das will ich verhindern. @drmonkeyninja – Annabelle

+0

Ich glaube nicht, dass dies etwas ist, was Sie direkt mit CakePHP tun können. Sie müssen wahrscheinlich die Tags im 'beforeSave' manuell entfernen, schauen Sie sich die akzeptierte Antwort dazu an: https://stackoverflow.com/questions/7130867/remove-script-tag-from-html-content. – drmonkeyninja

Antwort

0

Sie können Mutatormethode in Ihrer Benutzer-Entity-Klasse verwenden:

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

dieses Mutator verwenden, können Sie Eingabedaten ändern, bevor auf die Datenbank jedes Mal zu speichern, wenn Entität aktualisiert oder erstellt. Mehr über Mutatoren: https://book.cakephp.org/3.0/en/orm/entities.html#accessors-mutators

Sie können auch anders verwenden, aber ich schrieb diese Minute. Sie sollten diesen Code testen, wenn Sie ihn verwenden möchten. Mit $entity->getDirty() Methode können wir alle geänderten Felder erhalten, und ihre Werte in Table::beforeSave() Methode ändern:

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; 
}  
+0

Aufruf zu undefinierter Methode Cake \ Event \ Event :: getData() @Dariusz Majchrzak – Annabelle

+0

Was ist mit ['h()'] (https://api.cakephp.org/3.4/function-h.html) auf der * * output ** Anstatt einige Tags beim Speichern zu entfernen? [Broken HTML wird dies übergeben] (http://php.net/manual/en/function.strip-tags.php#refsect1-function.strip-tags-notes) – Sevvlor

+0

@AnnaBelle welche Version von Cakephp? –