2010-10-10 7 views
7

In meiner codeigniter Konfig habe ich $config['global_xss_filtering'] = TRUE;. In meinem Admin-Bereich habe ich einen CSS-Editor, der den Frontend-Inhalt generiert.Codeigniter global_xss_filtering

Alles, was getippt und in den Editor gestellt wird, funktioniert gut, Bilder werden schön angezeigt, HTML funktioniert. Alle außer Blitz. Immer wenn ich in den HTML-Modus umschalte und ein Youtube-Codestück einfüge, wird es mit Escapezeichen versehen und der Code wird auf der Startseite angezeigt, anstatt einen Youtube-Film anzuzeigen.

Wenn ich $config['global_xss_filtering'] = FALSE; setze, wird der Youtube-Code wie er sollte übergeben. Dies liegt daran, dass "Objekt", "Einbetten" usw. von CI als "ungezogen" gekennzeichnet und daher ausgeblendet werden.

Wie kann ich die XSS-Filterung für diese eine Controller-Methode umgehen?

Antwort

8

Deaktivieren Sie es standardmäßig und aktivieren Sie es für Orte, die es wirklich brauchen.

Zum Beispiel, ich habe es für alle meine Controller ausgeschaltet, damit sie dann für Kommentare, Seiten, usw.

Eine Sache, die Sie tun können, ist eine MY_Input erstellen (oder MY_Security in CI 2) wie die in PyroCMS und überschreiben Sie die Methode xss_clean mit einer genauen Kopie minus dem Objekt | embed | Teil der Regex.

http://github.com/pyrocms/pyrocms/blob/master/system/pyrocms/libraries/MY_Security.php

Es ist eine verdammt lange herum, aber es funktioniert.

Vielleicht könnten wir eine Konfigurationsoption erstellen könnte die schlechten Elemente für 2.0 aufgelistet werden?

0

Einfach gehen Sie wie folgt auf die Ansichten, wenn eingebettete Objektcode anzeigt, wie von YouTube und etc:

echo str_replace(array('&lt;', '&gt;'), array('<', '>'), $embed_filed); 
0

Die globale XSS-Filter nur entweicht (oder Umwandlung) bestimmte „gefährlich“ HTML-Tags wie <html>

Einfache Lösung:

  1. Set $config['global_xss_filtering'] = TRUE;
  2. Run y unsere POST-Daten durch HTMLPurifier, um alle ekligen <script> Tags oder Javascript zu entfernen.
  3. auf der Seite, wo Sie die Formulare erhalten POST Daten html_entity_decode() verwenden rückgängig zu machen, was XSS Filterung tat.

    //by decoding first, we remove everything that XSS filter did 
    //then we encode all characters equally. 
    $content = html_entity_decode($this->input->post('template_content')) 
    
  4. Dann sofort es durch htmlentities laufen()

    $content = htmlentities($content); 
    
  5. Store als Blob in MySQL-Datenbank

  6. Wenn Sie html_entity_decode() die Informationen für den Benutzer zur Bearbeitung Lauf angezeigt werden soll

Dies ist, wie ich d ID es. Wenn jemand einen größeren Fehler in dem, was ich getan habe, weiß, bitte sag es mir. Es scheint für mich gut zu funktionieren. Habe keine unerwarteten Fehler gehabt.

+1

Sie geben einem Angreifer eine einfache Route zum Einbetten von XSS. Alles, was er tun muss, ist HTML-kodieren den Angriff. Es wird alle XSS-Filter umgehen und dann von html_entity_decode zurück in den Angriff konvertiert werden. –

+0

Wie sonst sollte ich Menschen erlauben, HTML in einem Textfeld zu verwenden? Ich führe es durch HTMLPurifier, ist das nicht genug? – zechdc

+0

Dies entfernt auch die Inline-Stil-Attribute, wenn ich eine verwenden –

0

In CodeIgniter 2.0 das Beste, was zu tun, um die xss_clean auf dem Kern CI Bibliothek außer Kraft zu setzen ist, mit diesem Ordner auf application/Kern MY_Security.php setzt mit dann /application/config.php

$config['xss_exclude_uris'] = array('controller/method'); 

hier die MY_Security.php https://gist.github.com/slick2/39f54a5310e29c5a8387:

<?php 

/** 
* CodeIgniter version 2 
* Note: Put this on your application/core folder 
*/ 

class MY_Security extends CI_Security { 

    /** 
    * Method: __construct(); 
    * magic 
    */ 
    function __construct() 
    { 
     parent::__construct(); 
    } 

    function xss_clean($str, $is_image = FALSE) 
    { 

     $bypass = FALSE; 

     /** 
     * By pass controllers set in /application/config/config.php 
     * config.php 
     * $config['xss_exclude_uris'] = array('controller/method') 
     */ 

     $config = new CI_Config; 
     $uri = new CI_URI; 
     $uri->_fetch_uri_string(); 
     $uri->_explode_segments(); 

     $controllers_list = $config->item('xss_exclude_uris'); 

     // we need controller class and method only 
     if (!empty($controllers_list)) 
     { 
      $segments = array(0 => NULL, 1 => NULL); 
      $segments = $uri->segment_array(); 
      if (!empty($segments)) 
      { 
       if (!empty($segments[1])) 
       { 
        $action = $segments[0] . '/' . $segments[1]; 
       } 
       else 
       { 
        $action = $segments[0]; 
       } 
       if (in_array($action, $controllers_list)) 
       { 
        $bypass = TRUE; 
       } 
      } 

      // we unset the variable 
      unset($config); 
      unset($uri); 
     } 



     if ($bypass) 
     { 
      return $str; 
     } 
     else 
     { 
      return parent::xss_clean($str, $is_image); 
     } 
    } 

} 
2

Mein Fall war, dass ich global_xss_filtering werden standardmäßig wollte, aber manchmal musste ich die $ _POST (PST können Sie dies mit jedem globalen PHP-Array tun, z.B. $ _GET ...) Daten roh sein, wie aus dem Browser senden, so meine Lösung war:

  1. offen index.php in Stammordner des Projekts
  2. hinzugefügt, um die folgende Zeile Code $ unsanitized_post = $ _POST; nach $ application_folder = 'application'; (Linie 92)
  3. dann bei Bedarf ich die rohe $ _POST ich folgendes tun würde:

    global $ unsanitized_post;

    print_r ($ unsanitized_post);