CodeIgniter-désactiver le filtrage XSS sur une base post

j'essaye de mettre en place un CMS à l'arrière d'un site mais chaque fois que post data y a un <a href=... les post data sont supprimés.

j'ai $config['global_xss_filtering'] = TRUE; dans la configuration

ma question Existe-t-il un moyen de désactiver le filtrage xss pour un article?

p.ex.

$this->input->post('content', true); - allume, mais comment l'éteindre?

merci à tous.

PVS

24
demandé sur Usman 2010-09-24 19:17:39

7 réponses

si vous voulez modifier le comportement par défaut de la méthode post() , vous pouvez étendre la bibliothèque d'entrée du noyau, ou si vous êtes paresseux, vous pouvez simplement modifier la ligne 278 (ou alors) de la bibliothèque D'Entrée pour lire:

/**
* Fetch an item from the POST array
*
* @access   public
* @param    string
* @param    bool
* @return   string
*/
function post($index = '', $xss_clean = TRUE)
{
    return $this->_fetch_from_array($_POST, $index, $xss_clean);
}

la seule différence ici est que j'ai changé la variable $xss_clean en TRUE au lieu de FALSE . Maintenant, vous pouvez désactiver le filtrage global XSS et filtrer automatiquement les entrées sauf si vous spécifiez false comme second paramètre dans votre appel à la méthode post() de la bibliothèque D'entrée. Une seule méthode en bas est la méthode get() , et vous pouvez changer cela de la même manière.

cependant, si j'étais vous, Je ne ferais que prolonger la bibliothèque native, parce qu'il y a de fortes chances que vous l'ayez oublié au moment où vous mettez à jour CodeIgniter, et puis vous vous demanderez soudainement pourquoi vous vous faites attaquer par XSS. Cela ressemblerait à ceci:

class MY_Input extends CI_Input {

    function My_Input()
    {
        parent::CI_Input();
    }

    function post($index = '', $xss_clean = TRUE)
    {
        return parent::post($index, $xss_clean);
    }
}

vous pouvez en savoir plus sur extension des bibliothèques ici:

http://codeigniter.com/user_guide/general/creating_libraries.html

27
répondu treeface 2011-03-08 14:39:29

si vous voulez garder global xss_clean activé et outrepasser sur seulement certains cas, vous pouvez étendre la bibliothèque D'Entrée pour garder un clone de $_POST pour fournir des données brutes quand demandé:

<?php if (!defined('BASEPATH')) exit('No direct access allowed.');
class MY_Input extends CI_Input {

public function __construct() {
    $this->_POST_RAW = $_POST; //clone raw post data 
    parent::__construct(); 
}

public function post($index = null, $xss_clean = TRUE) { 
    if(!$xss_clean){ //if asked for raw post data -eg. post('key', false)-, return raw data. Use with caution.
        return $this->_POST_RAW[$index];
    }
    return parent::post($index, $xss_clean); 
    }
}
?>

de cette façon, vous pouvez utiliser $this->input->post('mydata', FALSE) pour récupérer des données brutes non nettoyées même si xss_clean est activé globalement.

6
répondu user2966084 2013-11-07 18:40:03

j'ai défini

global $mypost;
$mypost=$_POST;

dans l'index.php de ma racine cms

puis n'importe où je peux la variable globale comme

global $mypost;

$var=isset($mypost["field"])? $mypost["field"]:"";

chaque fois que j'ai besoin de poste sans filtre.

a travaillé pour moi en espérant que ça aide.

1
répondu muhammad 2013-02-10 09:39:37

dans mon cas, la solution de treeface ne fonctionne pas, mais j'ai trouvé un autre moyen. J'ai fait MY_Input avec _sanitise_globals () et j'ai ajouté si la construction est en place où est le nettoyage des données post.

// Clean $_POST Data
if (is_array($_POST) AND count($_POST) > 0) {
    foreach ($_POST as $key => $val) {
        if($this->_clean_input_keys($key) != 'my_none_sanitize_field')
        $_POST[$this->_clean_input_keys($key)] = $this->_clean_input_data($val);
    }
}
1
répondu Tomek 2013-10-28 21:36:59

Oui, l'extension à la saisie avec le remplacement de la méthode post a été très utile, tout comme le lecteur astucieux qui a remarqué qu'il devrait être parent retour::post($index, $xss_clean). J'ai eu des erreurs et je n'ai pas pensé à cette erreur évidente. Il fixe et je suis parti.

nous l'utilisons pour échapper aux données post pour une utilisation dans les instructions sql. Bien que les méthodes db de CI soient agréables, nous avons quelques grandes instructions sql qui sont plus faciles à coder à la main.

0
répondu Zac Imboden 2011-02-18 00:07:30

travailler avec CI 2.2 je pense que la solution de treeface laissera input->get(), input->cookie() etc n'étant pas xss_cleaned. (nous utilisons obtenir dans oauth, demandes, etc). Le changement global de configuration les empêche d'être échappés par le constructeur et la classe core utilise toujours xss_clean par défaut pour FALSE sur ces méthodes...

j'ai essentiellement mis en œuvre la même solution à travers plus de méthodes.

class MY_Input extends CI_Input {

    /* fixes to allow xss_clean to be disabled on a per field basis
    * [ e.g. tinymce html content with style / class / event attributes ]
    * initial ref : http://stackoverflow.com/questions/3788476/codeigniter-disable-xss-filtering-on-a-post-basis
    * this is based on CI 2.2
    * the above (stackoverflow) solution only updates the post method - which means all the rest ( get, get_post, cookie, server, request_headers, get_request_header)
    * NB : we need GET to allow oauth type activities !
    *
    *   1 - change the global config to xss_clean = false [ otherwise the constructor will 'xss_clean' everything before we have a chance to say no ! ]
    *   2 - make all of methods that take the xss_clean parameter use TRUE as default value
    *   3 - we can now pass the second parameter in as FALSE if we do not want to xss_clean
    */

    function get($index = '', $xss_clean = TRUE)
    {
        return parent::get($index, $xss_clean);
    }

    function post($index = '', $xss_clean = TRUE)
    {
        return parent::post($index, $xss_clean);
    }

    function get_post($index = '', $xss_clean = TRUE)
    {
        return parent::get($index, $xss_clean);
    }

    function cookie($index = '', $xss_clean = TRUE)
    {
        return parent::cookie($index, $xss_clean);
    }

    function server($index = '', $xss_clean = TRUE)
    {
        return parent::server($index, $xss_clean);
    }

    function request_headers($xss_clean = TRUE)
    {
        return parent::request_headers($xss_clean);
    }

    function get_request_header($index, $xss_clean = TRUE)
    {
        return parent::get_request_header($index, $xss_clean);
    }

}

j'espère que cela peut aider quelqu'un

0
répondu pugelarouge 2015-03-31 11:00:05

vous pouvez l'éteindre Temporairement

$this - >config - >set_item ('global_xss_filtering', false);

$c = $this->entrée->post('contenu'); puis de nouveau sous tension..

$this - >config - >set_item ('global_xss_filtering', true);

-4
répondu Johnny Tops 2010-09-24 17:50:46