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