2009-11-06 5 views
0

J'ai un problème avec le codage html dans la bibliothèque d'entrée de Codeigniter.Codage HTML dans codeiginiter

J'ai un formulaire utilisé pour éditer les Nouvelles du côté admin de mon projet. Voici le code HTML du titre des nouvelles:
echo form_input('title',($title) ? $title : $this->input->post('title'));

Lorsque la page d'édition est chargé, je vais prendre le titre de nouvelles et l'attribuer à l'édition $ title.After, si une erreur de validation se produit, la formulaire sera affiché à nouveau avec la valeur affichée dans le fichier de titre. Le code ci-dessus est écrit dans cet esprit.

Maintenant arrivant à la question, supposons que admin entre le titre rapport d'enquête de XYZ, et soumet. Ensuite, si une erreur de validation se produit pour un autre domaine, lorsque le formulaire est chargé, le champ titre montre

XYZ's survey report

Je pense que dans la classe d'entrée, la valeur est html posté codé. Donc, mon exigence est, si une erreur de validation se produit, je dois html décoder la valeur avant de le montrer dans le form.I ont essayé

echo form_input('title',($title) ? $title : html_entity_decode($this->input->post('title'),ENT_QUOTES)); 

et cela fonctionne. Mais le projet est grand et a tellement de champs de forme. Je serais déçu de savoir que c'est la seule façon d'y parvenir.

+0

La classe d'entrée ne faire un encodage automatique, sauf si vous l'encodez vous-même. Je l'ai juste essayé. Pourriez-vous poster comment vous gérez $ _POST/$ this-> input-> post()? –

+0

Vous avez raison Thorpe.J'ai également vérifié. Cela se produit lorsque nous utilisons ensemble Form_validation et form_helper. Merci beaucoup. Tu m'as fait tester correctement. – Sreejith

Répondre

1

XSS Le filtrage n'affecte pas la valeur du champ d'entrée affiché.

Je vois deux options:

1) Vous pouvez créer manuellement l'élément INPUT:
<input type="text" name="title" value="<?php echo ($title) ? $title : $this->input->post('title'); ?>" />

2) Vous pouvez modifier le code source CodeIgniter (non recommandé - il est susceptible de créer des ravages plus tard sur).

PS: Voici la fonction que CodeIgniter utilise en montrant la valeur de form_input (de form_helper.php):

function form_prep($str = '') 
{ 
    // if the field name is an array we do this recursively 
    if (is_array($str)) 
    { 
     foreach ($str as $key => $val) 
     { 
      $str[$key] = form_prep($val); 
     } 

     return $str; 
    } 

    if ($str === '') 
    { 
     return ''; 
    } 

    $temp = '__TEMP_AMPERSANDS__'; 

    // Replace entities to temporary markers so that 
    // htmlspecialchars won't mess them up 
    $str = preg_replace("/&#(\d+);/", "$temp\\1;", $str); 
    $str = preg_replace("/&(\w+);/", "$temp\\1;", $str); 

    $str = htmlspecialchars($str); 

    // In case htmlspecialchars misses these. 
    $str = str_replace(array("'", '"'), array("&#39;", "&quot;"), $str); 

    // Decode the temp markers back to entities 
    $str = preg_replace("/$temp(\d+);/","&#\\1;",$str); 
    $str = preg_replace("/$temp(\w+);/","&\\1;",$str); 

    return $str; 
} 

Comme vous le voyez, la fonction utilise htmlspecialchars et d'autres trucs.

CodeIgniter exqample MISE À JOUR:

// config.php: $config['global_xss_filtering'] = FALSE; 
echo form_open("test"); 
echo form_input('title', ($this->input->post('title')) ? $this->input->post('title') : $title); 
echo form_input('title', ($this->input->post('title')) ? $this->input->post('title') : $title, FALSE); 
echo form_input('title', ($_POST['title']) ? $_POST['title'] : $title, FALSE); 
echo "<input type=\"text\" name=\"title\" value=\"" . (($title) ? $title : $this->input->post('title')) . "\" />"; 
echo form_submit("btn", "Submit"); 
echo form_close(); 

// output: 
<form action="/test/" method="post"> 
<input type="text" name="title" value="XYZ&#39;s survey report" /> 
<input type="text" name="title" value="XYZ&#39;s survey report" /> 
<input type="text" name="title" value="XYZ&#39;s survey report" /> 
<input type="text" name="title" value="XYZ's survey report" /> 
<input type="submit" name="btn" value="Submit" /> 
</form> 
+0

Merci beaucoup Kristoffer. J'ai fait un test et trouvé beaucoup de choses: 1) La classe d'entrée ne change pas les valeurs affichées comme je l'ai dit. Même si vous avez activé le filtrage XSS, rien ne se passera. 2) En fait, cela se produisait lorsque j'ai transmis les données via la classe Form_validation. 3) Bien que la validation des formulaires code les données publiées, vous pouvez toujours les corriger en créant manuellement les éléments de formulaire comme vous l'avez mentionné. 4) Mais si vous utilisez des fonctions d'assistance de formulaire, le problème se produit (après avoir transmis les données validées via la classe de validation de formulaire). Merci beaucoup mon pote ... – Sreejith

0

Je pense qu'il est à cause de la fonction set_value() (si vous l'utilisez lors de l'insertion des données dans la base de données)