5

我正在使用 CodeIgniter 并在编辑表单上从数据库中提取数据。有时,此数据包含撇号、& 符号等。

我怎样才能让 CI 不解析它并将其更改为 HTML 版本,以便最终用户可以编辑它。!

这是编辑表单的图像,此文本字段具有从数据库中提取的数据并填充到输入文本字段中。如下图所示,数据不包含任何特殊字符。

在此处输入图像描述

这是表格中数据外观的屏幕截图,注意我只是从最右边的列中提取。不是第 4 列: 在此处输入图像描述

正如您所知道的那样,数据并未存储为转换后的 html,但 CI 仍在转换它。

以下是上述文本字段的片段:

<?php    
/**
 * Form Field attribute settings
 * @author Mike DeVita
 */
$companyname = array(
    'name'  => 'companyname',
    'placeholder' => 'Enter Your Companies Name',
    'id'    => 'companyname',
    'value' => set_value('', $points['pointFields']['companyname']->uf_fieldvalue),
    'maxlength' => 80,
    'size'  => 30
);
            <div class="_100">
                <p><?php echo form_label('Company Name', $companyname['id']); ?><?php echo form_input($companyname); ?></p>
                <?php echo form_error($companyname['id']); ?>
            </div>

这是插入数据库的片段:

function addUserFieldHtml($compiledHtml){
    foreach ($compiledHtml as $cHK => $cHV){
        $data = array (
            'pointid' => $cHV['pointId'],
            'timestamp' => time(),
            'html' => $cHV['html'],
            'fieldid' => $cHV['fieldId'],
            'fieldvalue' => $cHV['fieldValue']
        );
        $this->db->insert('userfields', $data);

    }
}#end addUserFieldHtml() function

谢谢

4

6 回答 6

3

问题在这里:

$companyname = array(
    'value' => set_value('', $points['pointFields']['companyname']->uf_fieldvalue),
);

set_value()将一些字符转换为实体,并且只能在原始 HTML 中使用 - 不能传递给任何表单辅助函数,如下所示:

<input name="email" value="<?php echo set_value('email'); ?>">

这将调用form_prep()转义输入字符串的函数,如下所示:

<input name="username" value="<?php echo form_prep($row->username); ?>">

因此,只需将您的配置更改为value

$companyname = array(
    'value' => $points['pointFields']['companyname']->uf_fieldvalue,
);

...并且当与form_input()或任何其他用于显示输入的表单辅助函数value一起使用时,将为您正确转义。例如:

echo form_input('myinput', '</div>"someJunkInput"<?php'); // Good to go
于 2012-04-15T05:45:49.603 回答
1

CodeIgniter 在 post 变量中自动处理魔术引号,并确保 post 变量不带有任何额外的斜杠。

因此,您必须确保在使用 simple_query() 或 query() 运行查询之前通过 addlashes() 传递数据。这可确保您的查询正常且不受 sql 注入的影响。在插入数据库之前不要使用 htmlspecialchars() 或 htmlentities()。那是错误的做法。

但是,如果您使用 $this->db->insert(); 或 $this->db->update() 您不需要在发布数据上应用 addlashes() 。

现在在渲染数据之前,在视图中使用 htmlspecialchars()。这将为您提供针对 XSS 攻击的保护。

<input value="<?php=htmlspecialchars($val)?>" type="button">
于 2012-04-15T04:25:17.663 回答
1

我这样使用它:

$tavall = html_entity_decode($task->description, ENT_QUOTES, 'UTF-8');

然后在表单输入中(在我的情况下为 textarea):

form_textarea(array(
    'name'          => 'task_description',
    'id'            => 'task_description',
    'value'         => set_value('task_description', $tavall), // 
    'rows'          => 10,
    'cols'          => 40,
))

文本输入也一样。

于 2013-03-20T11:16:45.350 回答
1

来自 CodeIgnitor 3.0 文档:

set_value($field[, $default = ''[, $html_escape = TRUE]])
Parameters: 
$field (string) – Field name
$default (string) – Default value
$html_escape (bool) – Whether to turn off HTML escaping of the value
Returns:    
Field value

Return type:    
string

允许您设置输入表单或文本区域的值。您必须通过函数的第一个参数提供字段名称。第二个(可选)参数允许您为表单设置默认值。第三个(可选)参数允许您关闭值的 HTML 转义,以防您需要结合使用此功能,即 form_input() 并避免双重转义。

通过将第三个参数设置为 false,您可以防止转换引号,如下所示:

  ....
 'value' => set_value('control_name',$control[0]['control_name'],false),
  ....
于 2015-11-07T10:42:23.463 回答
0

当您使用 set_value() 时,CodeIgniter 会自动通过 htmlspecialchars() 传递 $_POST 数组。如果您查看 form_helper.php 中的 set_value() 函数,您会看到所需的值是通过 form_prep() 传递的,它在所需字段上执行 htmlspecialchars()。

为了避免这种情况,您需要扩展 form_helper 添加第三个可选参数来跳过 form_prep() 执行。只需将以下代码复制到 MY_form_helper.php 并将其复制到 application/helpers/

<?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed');

/**
 * Form Value
 *
 * Grabs a value from the POST array for the specified field so you can
 * re-populate an input field or textarea.  If Form Validation
 * is active it retrieves the info from the validation class
 * NEW: Added a third parameter prep to skip htmlspecialchars escaping
 *
 * @access  public
 * @param   string
 * @return  mixed
 */
if ( ! function_exists('set_value'))
{
    function set_value($field = '', $default = '', $prep = true)
    {
        if (FALSE === ($OBJ =& _get_validation_object()))
        {
            if ( ! isset($_POST[$field]))
            {
                return $default;
            }

            return $prep ? form_prep($_POST[$field], $field) : $_POST[$field];
        }

        return $prep ? form_prep($OBJ->set_value($field, $default), $field) : $OBJ->set_value($field, $default);
    }
}


/* End of file MY_form_helper.php */
/* Location: ./application/helpers/MY_form_helper.php */
于 2012-10-18T23:17:09.390 回答
0

使用此代码:

$test = 'hello "B"';
set_value('test', $test, false)
于 2017-02-16T17:00:57.573 回答