2010-09-24 26 views
24

Estoy tratando de configurar un CMS en la parte posterior de un sitio, pero siempre que los datos de la publicación tengan un <a href=..., los datos de la publicación se descartan.Codeigniter - Deshabilitar el filtrado XSS en una base de publicación

Tengo $config['global_xss_filtering'] = TRUE; en config

Mi pregunta ¿Hay una manera de desactivar el filtrado de XSS para un artículo?

p. Ej.

$this->input->post('content', true); - lo enciende, pero ¿cómo desactivarlo?

Gracias a todos.

PVS

+0

gracias pasan 2 horas para this.I tuvo problema al guardar las imágenes a través del filtrado base64 ckeditor.XSS era falso, pero configurarlo cierto en el archivo de configuración de mi colega – mokNathal

+0

revise este blog http://tekina.info/xss-filtering-ckeditor/ –

Respuesta

27

Si desea cambiar el comportamiento predeterminado del método post(), puede ampliar la biblioteca de entrada principal, o si usted es perezoso que sólo puede cambiar la línea 278 (más o menos) de la biblioteca de entrada para que diga:

/** 
* 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 única diferencia aquí es que he cambiado la variable $ xss_clean a TRUE en lugar de FALSE. Ahora puede desactivar el filtrado XSS global y filtrará las entradas automáticamente a menos que especifique falso como el segundo parámetro en su llamada al método post() de la biblioteca de entrada. Solo un método más abajo es el get(), y puede cambiarlo de la misma manera.

Sin embargo, si yo fuera usted, extendería la biblioteca nativa, porque hay una buena probabilidad de que se haya olvidado de esto cuando actualice CodeIgniter, y entonces de repente se preguntará por qué ' volver a recibir XSS atacado. Que se vería así:

class MY_Input extends CI_Input { 

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

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

Usted puede aprender más acerca de la ampliación bibliotecas aquí:

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

+0

Gracias por su ayuda. Fui por esta ruta. –

+0

Buen truco. Creo que debería ser return parent :: post ($ index, $ xss_clean); sin embargo. – g33kz0r

+2

Un enlace mejor para leer acerca de la extensión es la parte 'Extender clases principales' de esta página http://codeigniter.com/user_guide/general/core_classes.html – gacrux

-4

puedes desactivarla temporalmente

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

$ c = $ this-> input-> post ('content'); luego vuelva a encenderlo ...

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

+0

OP, me interesaría ver si esto funciona.Según mi comprensión del esquema de filtrado XSS de CI, creo que en realidad no tendría el efecto deseado. Creo que CI hace su filtrado XSS de toda la variable $ _POST cuando se inicia el controlador, por lo que cambiar la configuración después del hecho tendría poco efecto. Aún así ... vale la pena intentarlo. – treeface

+0

Hola, esto no parece funcionar con mi instalación de CI. ¡Gracias por responder! –

+0

Es posible que pueda hacer esto en un gancho antes de que se realice el filtrado. Hay varias etapas de ganchos para actuar. [link] http://codeigniter.com/user_guide/general/hooks.html [/ link] –

0

Sí, la extensión a la entrada con el reemplazo del método de publicación fue muy útil, al igual que el lector astuto que advierte que debe devolverse parent :: post ($ index, $ xss_clean). Estaba recibiendo errores y no pensé en ese error obvio. Lo solucioné y estoy fuera de funcionamiento.

Lo estamos usando para escapar de datos de publicaciones para su uso en sentencias sql. Aunque los métodos db de CI son agradables, tenemos algunas sentencias sql grandes que son más fáciles de codificar a mano.

1

i definido

global $mypost; 
$mypost=$_POST; 

en el índice.php cms de mis raíces

entonces algún lugar donde pueda la variable global como

global $mypost; 

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

cada vez que necesito un envío sin filtro.

trabajado para mí espero que ayude.

+0

Pero esto también está filtrado por XSS. –

1

En mi caso, la solución de Treeface no funciona, pero encontré otra forma. Hice MY_Input con _sanitize_globals() y agregué si la construcción en su lugar está desinfectando los datos de la publicación.

// 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

Si desea mantener mundial xss_clean activado y anular sólo en ciertos casos, puede ampliar la biblioteca de entrada para mantener un clon de $_POST para proporcionar datos en bruto cuando se le preguntó:

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

esta manera puede usar $this->input->post('mydata', FALSE) para recuperar datos de publicación sin filtrar, incluso si xss_clean está habilitado globalmente.

0

trabajando con CI 2.2 Creo que la solución de treeface dejará input-> get(), input-> cookie() etc no siendo xss_cleaned. (usamos get in oauth requests, etc.) El cambio de configuración global impide que el constructor los escape y la clase principal todavía tiene xss_clean por defecto en FALSE en estos métodos ...

Básicamente, he implementado la misma solución en más métodos.

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

} 

esperanza esto es de alguna ayuda para alguien

hombre
Cuestiones relacionadas