2010-10-10 12 views
7

W moim konfiguracji codeigniter mam $config['global_xss_filtering'] = TRUE;. W mojej sekcji administracyjnej mam cedenta, który generuje zawartość frontendu.Codeigniter global_xss_filtering

Wszystko, co jest wpisane i umieszczone w edytorze działa dobrze, obrazy są wyświetlane ładnie, działa HTML. Wszystkie oprócz flash. Ilekroć przełączam się w tryb HTML i wklejam kawałek kodu youtube, jest on chroniony i kod jest widoczny na stronie głównej, zamiast pokazywać film youtube.

Jeśli ustawię $config['global_xss_filtering'] = FALSE;, kod youtube zostanie przekazany tak, jak powinien. Dzieje się tak dlatego, że "obiekt", "osadzanie" itd. Są oznaczone jako "niegrzeczne" przez CI i w ten sposób uniknięte.

Jak mogę pominąć filtrowanie xss dla tej metody kontrolera?

Odpowiedz

8

Wyłączyć domyślnie, a następnie włączyć go w miejscach, które naprawdę go potrzebują.

Na przykład, mam to wyłączone dla wszystkich moich kontrolerów, a następnie włączyć go za komentarze, stron itp

Jedną rzeczą, jaką można zrobić, to stworzyć MY_Input (lub MY_Security w CI 2), jak ten w PyroCMS i zastąpić metodę xss_clean dokładną kopią, minus obiekt | embed | część regex.

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

To cholernie długi odwrót, ale to działa.

Być może moglibyśmy stworzyć opcję konfiguracji, która mogłaby zostać utworzona z wyszczególnieniem złych elementów dla wersji 2.0?

0

Proste wykonaj następujące czynności w widokach podczas wyświetlania osadzonego kodu wynikowego jak z YouTube i etc:

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

Światowy filtrowania XSS ucieka tylko (lub konwersji) niektóre „niebezpieczne” tagi html jak <html>

Proste Obejście:

  1. Set $config['global_xss_filtering'] = TRUE;
  2. Run y nasze dane POST poprzez HTMLPurifier, aby usunąć nieprzyjemne tagi <script> lub javascript.
  3. Na stronie gdzie można otrzymać formularze POST Użyj danych html_entity_decode() cofnąć filtrowanie XSS co zrobił.

    //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. Wtedy natychmiast uruchomić go poprzez htmlentities()

    $content = htmlentities($content); 
    
  5. Store jako Blob w bazie danych MySQL

  6. Gdy chcesz wyświetlić informacji użytkownikowi na edycję biegu html_entity_decode()

Tak właśnie zrobiłem id to. Jeśli ktoś wie o poważnej wadzie tego, co zrobiłem, proszę powiedz mi. Wydaje się, że działa dobrze dla mnie. Nie wystąpiły żadne nieoczekiwane błędy.

+1

Dajesz atakującemu łatwą drogę do osadzenia XSS. Wszystko, co musi zrobić, to zakodować kod HTML atakiem. Obejmie wszystkie filtry XSS, a następnie zostanie przekonwertowany z powrotem do ataku html_entity_decode. –

+0

Jak inaczej powinienem zezwolić ludziom na używanie HTML w obszarze tekstowym? Uruchomiłem to przez HTMLPurifier, czy to nie wystarczy? – zechdc

+0

To także usuwa atrybuty stylu śródliniowego, jeśli używam dowolnego –

0

W CodeIgniter 2.0 najlepszą rzeczą do zrobienia jest, aby zastąpić xss_clean na rdzeniu biblioteki CI, korzystając MY_Security.php umieścić to na wniosek/folderu rdzeń następnie używając /application/config.php

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

tutaj 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

Mój przypadek był, że chciałem global_xss_filtering być domyślnie włączona, ale czasami potrzebne $ _POST (pst możesz to zrobić do dowolnej globalnej tablicy php np. $ _GET ...) dane są surowe jak wysłać z poziomu przeglądarki, więc moje rozwiązanie było:

  1. otwarty index.php w folderze głównym projektu
  2. dodany następujący wiersz kod $ unsanitized_post = $ _POST; po $ application_folder = 'application'; (linia nr 92)
  3. wtedy, gdy potrzebowałem surowy $ _POST chciałbym wykonać następujące czynności:

    globalna $ unsanitized_post;

    print_r ($ unsanitized_post);