2010-10-10 5 views
7

Dans ma configuration codeigniter j'ai $config['global_xss_filtering'] = TRUE;. Dans ma section admin, j'ai un ckeditor qui génère le contenu du frontend.Codeigniter global_xss_filtering

Tout ce qui est tapé et placé à l'intérieur de l'éditeur fonctionne bien, les images sont bien affichées, html fonctionne. Tous sauf flash. Chaque fois que je passe en mode html et collez un morceau de code youtube, il est échappé et le code est visible sur la page d'accueil au lieu de montrer un film youtube.

Si je règle $config['global_xss_filtering'] = FALSE; le code youtube est passé comme il se doit. C'est parce que 'object', 'embed' etc sont marqués comme "vilains" par CI et donc échappés. Comment puis-je contourner le filtrage xss pour cette méthode à un seul contrôleur?

Répondre

8

Désactivez-le par défaut, puis activez-le pour les endroits qui en ont vraiment besoin.

Par exemple, je l'ai mis hors tension pour tous mes contrôleurs, puis activer pour commentaires, pages, etc.

Une chose que vous pouvez faire est de créer un MY_Input (ou MY_Security dans CI 2) comme celui dans PyroCMS et surcharger la méthode xss_clean avec une copie exacte, moins l'objet | embed | une partie de l'expression rationnelle.

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

Il est un enfer d'un long chemin, mais il fonctionne.

Peut-être que nous pourrions créer une option de configuration pourrait être créé en listant les mauvais éléments pour 2.0?

0

Simple procédez comme suit sur les vues lors de l'affichage du code d'objet incorporé comme de YouTube et etc:

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

Le filtrage global XSS est seulement Évasion (ou conversion) certaines balises HTML « dangereuses » comme <html>

Solution simple:

  1. Set $config['global_xss_filtering'] = TRUE;
  2. Run y nos données POST à ​​travers HTMLPurifier pour enlever toutes les balises <script> ou javascript méchant.
  3. Sur la page où vous recevez les formulaires POST données utilisent html_entity_decode() pour annuler ce filtrage XSS fait.

    //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. Ensuite, exécutez immédiatement par htmlentities()

    $content = htmlentities($content); 
    
  5. magasin comme Blob dans la base de données MySQL

  6. Lorsque vous souhaitez afficher les informations à l'utilisateur pour l'édition run html_entity_decode()

Voici comment je l'id. Si quelqu'un connaît un défaut majeur dans ce que j'ai fait, dites-moi s'il vous plaît. Cela semble fonctionner correctement pour moi. N'a pas eu d'erreurs inattendues.

+1

Vous offrez à un attaquant un moyen facile d'intégrer XSS. Tout ce qu'il a à faire est HTML-encoder l'attaque. Il contournera tous les filtres XSS, puis sera reconverti en attaque par html_entity_decode. –

+0

De quelle autre manière devrais-je permettre aux gens d'utiliser HTML dans une zone de texte? Je l'utilise via HTMLPurifier, n'est-ce pas suffisant? – zechdc

+0

Cela supprime également les attributs de style en ligne, si j'utilise –

0

Dans CodeIgniter 2.0 la meilleure chose à faire est de passer outre la xss_clean sur la bibliothèque de CI de base, en utilisant MY_Security.php mettre ce dossier sur demande/noyau puis utilise /application/config.php

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

est ici le 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

Mon cas était que je voulais global_xss_filtering être par défaut, mais parfois je avais besoin $ _POST (pst vous pouvez le faire à n'importe quel tableau php mondial, par exemple. $ _GET ...) que les données soient brutes qu'envoyer à partir du navigateur, donc ma solution a consisté à:

  1. ouvert index.php dans le dossier racine du projet
  2. ajouté la ligne suivante de code $ unsanitized_post = $ _POST; après $ application_folder = 'application'; (ligne n ° 92)
  3. alors chaque fois que je besoin de la brute $ _POST je faire ce qui suit:

    unsanitized_post global $;

    print_r ($ unsanitized_post);