我在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));
它有效。但是这个项目很大,而且有很多表格领域。我很失望地知道这是实现这一目标的唯一途径。
答案 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("'", """), $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's survey report" />
<input type="text" name="title" value="XYZ's survey report" />
<input type="text" name="title" value="XYZ'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;
答案 2 :(得分:0)
我认为这是因为set_value()
函数(如果你在将数据插入数据库时使用它)