2012-04-15 187 views
3

我使用CodeIgniter并在编辑窗体上从数据库中拉入数据。有时这些数据包含撇号,&符号等。CodeIgniter窗体帮助文本输入字段导致html解析

我该如何获取CI才能解析并将其更改为HTML版本,以便最终用户可以对其进行编辑。

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

enter image description here

这里的数据是如何看在表中的截图,记下我只能从最右侧一列拉。不是第4列: enter image description here

正如你可以告诉数据不被存储为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 

感谢

+0

我不太清楚你是如何生成表单元素,但我想你有一个'prep_for_form'过滤器运行?在任何情况下,你最好的选择可能是在数据被使用后对数据使用'html_entity_decode'(http://www.php.net/manual/en/function.html-entity-decode.php)或类似的解码函数从数据库中检索,但编辑器正在呈现之前。 – rjz 2012-04-15 03:39:01

+0

我们可以看到您的实际代码吗? *您如何输出表单输入? – 2012-04-15 04:26:10

+0

@rjz我想你的意思是htmlspecialchars_decode()? – Philip 2012-04-15 06:00:40

回答

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()或任何其他form helper functions用于显示输入时,value将为您正确转义。例如:

echo form_input('myinput', '</div>"someJunkInput"<?php'); // Good to go 
+0

感谢一百万,我应该更彻底地阅读文档..我试着记住给你一个赏金赏金。 – gorelative 2012-04-15 05:50:47

+1

谢谢,但不要担心,只是传播知识:) – 2012-04-15 05:51:35

+0

我绝对会,再次感谢。 – gorelative 2012-04-15 05:53:36

1

笨处理魔术在post变量中自动引用并确保post变量不带任何额外的内容凶多吉少。

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

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

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

<input value="<?php=htmlspecialchars($val)?>" type="button"> 
+0

我已编辑该问题以显示代码。 – gorelative 2012-04-15 05:36:52

+0

您的渲染数据方面的解决方案没有工作..添加:''值'\t => set_value('',htmlspecialchars($ points ['pointFields'] ['companyname'] - > uf_fieldvalue)),'不工作。 – gorelative 2012-04-15 05:43:11

+0

你可以直接在视图中直接回显这个$ points ['pointFields'] ['companyname'] - > uf_fieldvalue,并检查&是否存在使用视图源。 – 2012-04-15 05:59:50

0

笨自动将$ _ POST通过用htmlspecialchars()当您使用SET_VALUE()阵列。如果你看看form_helper.php中的set_value()函数,你会看到所需的值通过form_prep()传递,它在所需的字段上执行htmlspecialchars()。

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

<?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 */ 
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, 
)) 

相同的文本输入将工作。

0

从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 

允许你设置的输入形式或textarea的价值。您必须通过函数的第一个参数提供字段名称。第二个(可选)参数允许您为表单设置默认值。第三个(可选)参数允许您关闭该值的HTML转义,以防需要将此函数与form_input()结合使用并避免双重转义。

通过第三个参数设置为false,可以防止报价的转换象下面这样:

.... 
'value' => set_value('control_name',$control[0]['control_name'],false), 
    .... 
0

使用此代码:

$test = 'hello "B"'; 
set_value('test', $test, false)