2010-09-24 4 views
24

Ich versuche, ein CMS auf der Rückseite einer Website einrichten, aber immer wenn Post-Daten <a href=... in es die Post-Daten wird verschrottet.Codeigniter - Deaktivieren XSS-Filterung auf einer Post-Basis

Ich habe $config['global_xss_filtering'] = TRUE; in Config

Meine Frage ein Weg xss Filterung für ein Element der Sperrung wird?

z.B.

$this->input->post('content', true); - schaltet es ein, aber wie schaltet man es aus?

Danke an alle.

PVS

+0

thanks man 2 Stunden this.I verbringen musste Problem während base64 Bilder durch Filterung ckeditor.XSS Speichern falsch war, aber es ist wahr in der Konfigurationsdatei von meinem Kollegen eingestellt – mokNathal

+0

überprüfen Sie diesen Blog http://tekina.info/xss-filtering-ckeditor/ –

Antwort

27

Wenn Sie das Standardverhalten des post() Methode ändern möchten, können Sie die Kerneingangs Bibliothek, verlängern oder, wenn Sie faul sind, können Sie einfach Linie 278 ändern (oder so) der Eingangs Bibliothek zu lesen:

/** 
* 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); 
} 

hier der einzige Unterschied ist, dass ich die $ xss_clean Variable TRUE statt FALSE geändert haben. Jetzt können Sie die globale XSS-Filterung deaktivieren und Eingaben automatisch filtern, es sei denn, Sie geben false als zweiten Parameter in Ihrem Aufruf der Methode der Input-Bibliothek an. Nur eine Methode ist die get() Methode, und Sie können das auf die gleiche Weise ändern.

Wenn ich jedoch Sie wäre, würde ich einfach die native Bibliothek erweitern, denn es besteht eine gute Chance, dass Sie dies bei der Aktualisierung von CodeIgniter vergessen haben, und dann werden Sie sich plötzlich fragen, warum Sie Re XSS angegriffen bekommen. Das würde wie folgt aussehen:

class MY_Input extends CI_Input { 

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

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

Sie hier mehr über Bibliotheken erstreckt lernen können:

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

+0

Danke für Ihre Hilfe. Ich bin diesen Weg gegangen. –

+0

Nice Hack. Ich denke, es sollte return parent :: post ($ index, $ xss_clean); jedoch sein. – g33kz0r

+2

Ein besserer Link zum Lesen dieser Erweiterung ist der 'Extending Core Class' Teil dieser Seite http://codeigniter.com/user_guide/general/core_classes.html – gacrux

-4

Sie es vorübergehend ausschalten kann

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

$ c = $ this-> Eingabe-> Post ('Inhalt'); und dann wieder einschalten.

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

+0

OP, würde mich interessieren, ob das funktioniert.Aufgrund meines Verständnisses des XSS-Filterschemas von CI glaube ich, dass dies nicht den gewünschten Effekt hätte. Ich glaube, dass CI seine XSS-Filterung der gesamten Variablen $ _POST durchführt, wenn der Controller initiiert wird, so dass das Ändern der Konfiguration nach der Tatsache wenig Auswirkungen hätte. Still..es ist einen Versuch wert. – treeface

+0

Hallo, das schien nicht mit meiner CI-Installation zu funktionieren. Danke für die Antwort! –

+0

Sie können dies möglicherweise in einem Hook durchführen, bevor die Filterung abgeschlossen ist. Es gibt mehrere Stufen von Haken zum Handeln. [link] http://codeigniter.com/user_guide/general/hooks.html [/ link] –

0

Ja, die Erweiterung auf Eingabe mit der post-Methode Ersatz war sehr nützlich, wie der schlaue Leser, der bemerkt, dass es return elter :: post ($ index, $ xss_clean) sein sollte. Ich bekam Fehler und dachte nicht über diesen offensichtlichen Fehler nach. Es wurde behoben und ich rannte los.

Wir verwenden es um Post-Daten für die Verwendung in SQL-Anweisungen zu entkommen. Obwohl die db-Methoden von CI nett sind, haben wir einige große SQL-Anweisungen, die einfacher von Hand zu codieren sind.

1

i definiert

global $mypost; 
$mypost=$_POST; 

in index.php meiner Wurzel cms

dann überall kann ich die globale Variable wie

global $mypost; 

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

wenn ich ohne Filter erstellen müssen.

arbeitete für mich hoffe, es hilft.

+0

Aber das ist auch XSS gefiltert. –

1

In meinem Fall funktioniert die Lösung von treeface nicht, aber ich habe einen anderen Weg gefunden. Ich machte MY_Input mit _sanitize_globals() und ich fügte hinzu, wenn Aufbau an Ort, wo Sanitizingpostdaten ist.

// 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); 
    } 
} 
6

Wenn Sie globale xss_clean aktiviert behalten wollen und außer Kraft setzen auf nur bestimmten Fällen können Sie die Eingabe Bibliothek erweitern für die Bereitstellung von Rohdaten einen Klon von $_POST zu halten, wenn Sie gefragt:

<?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); 
    } 
} 
?> 

Auf diese Weise Sie können $this->input->post('mydata', FALSE) verwenden, um nicht bereinigte rohe Postdaten abzurufen, auch wenn xss_clean global aktiviert ist.

0

Arbeiten mit CI 2.2 Ich denke, dass die Lösung von Treaface Eingabe-> Get(), Eingabe-> Cookie() usw. nicht Xss_cleaned sein wird. (Wir verwenden Anfragen in oauth usw.). Die globale Konfigurationsänderung verhindert, dass sie vom Konstruktor mit Escapezeichen versehen werden, und die Kernklasse setzt für diese Methoden immer noch den Standardwert xss_clean auf FALSE ...

Ich habe im Grunde dieselbe Lösung für mehrere Methoden implementiert.

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); 
    } 

} 

Hoffnung dies jemand eine Hilfe ist