2010-10-10 12 views
7

Nella mia configurazione di codeigniter ho $config['global_xss_filtering'] = TRUE;. Nella mia sezione di amministrazione ho un ckeditor che genera il contenuto del frontend.Codeigniter global_xss_filtering

Tutto ciò che viene digitato e inserito all'interno dell'editor funziona correttamente, le immagini vengono visualizzate in modo piacevole, html funziona. Tutti tranne flash. Ogni volta che passo alla modalità html e incollo un pezzo di codice di youtube, questo viene salvato e il codice è visibile sulla prima pagina invece di mostrare un film di YouTube.

Se si imposta $config['global_xss_filtering'] = FALSE; il codice di youtube è passato come dovrebbe. Questo perché 'object', 'embed' ecc sono contrassegnati come "cattivi" da CI e quindi sfuggiti.

Come posso ignorare il filtro xss per questo metodo con un controller?

risposta

8

Spegnerlo per impostazione predefinita, quindi abilitarlo per le aree che ne hanno davvero bisogno.

Per esempio, l'ho spento per tutti i miei controller, quindi attivare per commenti, pagine, ecc

Una cosa che puoi fare è creare un MY_Input (o MY_Security in CI 2) come quello in PyroCMS e sovrascrivere il metodo xss_clean con una copia esatta, meno l'oggetto | embed | parte della regex.

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

E 'un inferno di un lungo giro, ma funziona.

Forse potremmo creare un'opzione di configurazione che potrebbe essere creata elencando gli elementi non validi per 2.0?

0

semplice effettuare le seguenti operazioni sui punti di vista durante la visualizzazione del codice oggetto incorporato come da YouTube ed ecc:

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

Il filtraggio globale XSS è solo fuggendo (o conversione) alcuni "pericolosi" tag HTML come <html>

soluzione semplice:

  1. Set $config['global_xss_filtering'] = TRUE;
  2. Run y i nostri dati POST tramite HTMLPurifier per rimuovere eventuali brutti tag <script> o javascript.
  3. Nella pagina in cui si ricevono le forme di dati POST utilizzano html_entity_decode() a disfare ciò che il filtro XSS ha fatto.

    //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. Poi subito eseguirlo tramite htmlentities()

    $content = htmlentities($content); 
    
  5. Store come un Blob nel database MySQL

  6. Quando si desidera visualizzare le informazioni per l'utente per la modifica run html_entity_decode()

Ecco come id it. Se qualcuno sa di un grosso difetto in quello che ho fatto, per favore dimmelo. Sembra che stia funzionando bene per me. Non ho avuto errori imprevisti.

+1

Stai dando a un utente malintenzionato un percorso facile per incorporare XSS. Tutto ciò che deve fare è codificare in HTML l'attacco. Ignorerà tutti i filtri XSS, quindi sarà riconvertito all'attacco da html_entity_decode. –

+0

In quale altro modo dovrei permettere alle persone di usare l'HTML in una textarea? Lo eseguo tramite HTMLPurifier, non è abbastanza? – zechdc

+0

Anche questo sta eliminando gli attributi di stile inline, se uso qualsiasi –

0

Nel CodeIgniter 2.0 la cosa migliore da fare è quello di ignorare il xss_clean sulla libreria CI nucleo, utilizzando MY_Security.php mettere questo su application/cartella principale poi utilizza /application/config.php

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

ecco il 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

il mio caso era che volevo global_xss_filtering essere attiva per impostazione predefinita, ma a volte mi serviva il $ _POST (per prima cosa puoi farlo con qualsiasi php array globale, ad es. $ _GET ...) Dati da crudo come inviare dal browser, quindi la mia soluzione era quella di:

  1. aperta index.php nella cartella principale del progetto
  2. aggiunta la seguente riga di codice $ unsanitized_post = $ _POST; dopo $ application_folder = 'applicazione'; (linea # 92)
  3. allora ogni volta che avevo bisogno di grezzo $ _POST vorrei fare le seguenti operazioni:

    globale $ unsanitized_post;

    print_r ($ unsanitized_post);