【问题标题】:HTML encoding in codeiginitercodeigniter 中的 HTML 编码
【发布时间】:2009-11-06 03:57:01
【问题描述】:

我在 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));

它有效。但是这个项目很大,有很多表单域。如果知道这是实现这一目标的唯一方法,我会很失望。

【问题讨论】:

  • 输入类不会自动进行任何编码,除非您自己对其进行编码。我刚试过。你能发布你是如何处理 $_POST/$this->input->post() 的吗?
  • 你是对的索普。我也查过了。当我们一起使用 Form_validation 和 form_helper 时会发生这种情况。非常感谢。你让我正确地测试它。

标签: php codeigniter


【解决方案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 和其他技巧。

更新 - CodeIgniter 示例:

// 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)输入类不会像我说的那样改变发布的值。即使您也启用了 XSS 过滤,也不会发生任何事情。 2)实际上它是在我通过 Form_validation 类传递数据时发生的。 3)虽然表单验证对发布的数据进行编码,但您仍然可以通过手动创建您提到的表单元素来使其正确。 4)但如果您使用表单辅助函数,则会出现问题(在通过表单验证类传递发布的数据之后)。非常感谢朋友...
【解决方案2】:

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

$config['global_xss_filtering'] = FALSE;

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 2018-07-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-08
      • 2012-11-04
      • 2012-10-08
      • 2010-12-24
      • 1970-01-01
      相关资源
      最近更新 更多