codeigniter中的HTML编码

时间:2009-11-06 03:57:01

标签: php codeigniter

我在Codeigniter的输入库中遇到了html编码问题。

我有一个用于在项目管理员端编辑新闻的表单。这是新闻标题的HTML代码:
     echo form_input('title',($title) ? $title : $this->input->post('title'));

当加载编辑页面时,我正在获取新闻标题并将其分配给$ title。编辑后,如果发生任何验证错误,表格将再次显示在标题文件中的已发布值。上面的代码是为了这个而写的。

现在出现问题,假设管理员输入标题为 XYZ的调查报告,并提交。然后,如果某个其他字段发生验证错误,则在加载表单时,标题字段显示为

XYZ's survey report

我认为在Input类中,发布的值是html编码的。所以我的要求是,如果发生验证错误,我必须在表单中显示之前对该值进行html解码。我已经尝试过

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

它有效。但是这个项目很大,而且有很多表格领域。我很失望地知道这是实现这一目标的唯一途径。

3 个答案:

答案 0 :(得分:1)

XSS过滤不会影响显示的输入字段值。

我看到两个选项:

1)您可以手动创建INPUT元素:
<input type="text" name="title" value="<?php echo ($title) ? $title : $this->input->post('title'); ?>" />

2)您可以修改CodeIgniter源代码(不推荐 - 稍后可能会造成严重破坏)。

PS:这是CodeIgniter在显示form_input值时使用的函数(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;
}

如您所见,该功能正在使用htmlspecialchars和其他技巧。

UPDATE- CodeIgniter exqample:

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

答案 1 :(得分:0)

如果全局启用XSS过滤,输入类将自动编码。检查您的application / config / config.php文件以确保它已关闭:

$config['global_xss_filtering'] = FALSE;

http://codeigniter.com/user_guide/libraries/input.html

答案 2 :(得分:0)

我认为这是因为set_value()函数(如果你在将数据插入数据库时​​使用它)