Codeigniter – Disabilita il filtraggio XSS su base post

Sto provando a configurare un CMS sul retro di un sito ma ogni volta che i dati del post hanno un <a href=https://stackoverflow.com/questions/3788476/codeigniter-disable-xss-filtering-on-a-post-basis/... in esso i dati del post vengono scartati.

Ho $config['global_xss_filtering'] = TRUE; in config

La mia domanda è un modo per distriggersre il filtro xss per un elemento?

per esempio

$this->input->post('content', true); – lo accende, ma come spegnerlo?

Grazie a tutti.

PVS

Se si desidera modificare il comportamento predefinito del metodo post() , è ansible estendere la libreria di input principale oppure, se si è pigri, è sufficiente modificare la riga 278 (o così) della libreria di input per leggere:

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

L’unica differenza qui è che ho cambiato la variabile $ xss_clean su TRUE invece di FALSE . Ora è ansible distriggersre il filtro XSS globale e filtrerà automaticamente gli input a meno che non si specifichi falso come secondo parametro nella chiamata al metodo post() della libreria Input. Un solo metodo down è il metodo get() , e puoi cambiarlo allo stesso modo.

Tuttavia, se fossi in te, estenderò semplicemente la libreria nativa, perché ci sono buone probabilità che ti dimenticheresti al momento dell’aggiornamento di CodeIgniter, e poi all’improvviso ti starai chiedendo perché stai ricevendo XSS . Sarebbe come questo:

 class MY_Input extends CI_Input { function My_Input() { parent::CI_Input(); } function post($index = '', $xss_clean = TRUE) { return parent::post($index, $xss_clean); } } 

Puoi saperne di più sull’estensione delle librerie qui:

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

Se si desidera mantenere xss_clean globale abilitato e sovrascritto solo su alcuni casi, è ansible estendere la libreria di input per mantenere un clone di $_POST per fornire dati non $_POST quando viene richiesto:

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

In questo modo puoi usare $this->input->post('mydata', FALSE) per recuperare i dati post non disinfettati, anche se xss_clean è abilitato globalmente.

ho definito

 global $mypost; $mypost=$_POST; 

in index.php del mio cms radice

quindi ovunque posso la variabile globale come

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

ogni volta che ho bisogno di post senza filtro.

ha funzionato per me spero che aiuti.

Nel mio caso, la soluzione di treeface non funziona, ma ho trovato un altro modo. Ho creato MY_Input con _sanitize_globals () e ho aggiunto se la costruzione è in atto dove sanare i dati dei 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); } } 

Sì, l’estensione a Input con la sostituzione del metodo post è stata molto utile, così come lo è stato il lettore avanzato che ha notato che dovrebbe essere restituito parent :: post ($ index, $ xss_clean). Stavo ricevendo errori e non pensavo a quell’ovvio errore. Risolto il problema e sono fuori servizio.

Lo stiamo utilizzando per evitare i dati dei post da utilizzare nelle istruzioni SQL. Sebbene i metodi db di CI siano belli, abbiamo alcune istruzioni sql di grandi dimensioni che sono più facili da codificare a mano.

lavorando con CI 2.2 penso che la soluzione da treeface lascerà input-> get (), input-> cookie () ecc non essendo xss_cleaned. (utilizziamo le richieste di oauth, ecc.). La modifica della configurazione globale impedisce loro di essere sfuggiti dal costruttore e la class principale ha ancora i valori predefiniti xss_clean su FALSE su questi metodi …

Ho praticamente implementato la stessa soluzione su più metodi.

 class MY_Input extends CI_Input { /* fixes to allow xss_clean to be disabled on a per field basis * [ eg 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); } } 

spero che questo sia di qualche aiuto a qualcuno

puoi spegnerlo temporaneamente

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

$ c = $ this-> input-> post (‘contenuto’); quindi riaccenderlo ..

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