2011-10-22 84 views
2

我正在使用Codeginiter,并在使用“&”符号时看到在我的字符串末尾添加了分号。见下文。顺便说一句,我将这个值存储到MySQL DB中。当字符串包含“&”符号时值超过分号

在将值插入数据库之前,我正在使用htmlspecialchars

$this->form_validation->set_rules('item_name','description','trim|required|min_length[3]|xss_clean');  

这工作:

$string = "you & I"; 
// Displays "you & i" 

这在DB追加一个分号:

$string = "you&i"; 
// Displays "you&i;" 
+0

HTML转成属于输出逻辑。 (尽管安全性高于对不起,过早地执行它本身并不是错误的,但这不是推荐的方法,尽管这里的问题只是过度的实现。) – mario

回答

4

您正在使用CI的xss_clean“功能”,该功能刚刚坏掉了。如果您在某处应用xss_clean,请不要期望您的数据能够存活。

取而代之,禁用它,事情应该没问题。

然后适当地过滤您的数据。实际使用xss_clean的建议在CodeIgniter文档中只是误导。保重。

+0

哇,那样做了。我删除了'xss_clean',它工作。我应该使用其他的东西吗? – luckytaxi

+0

你问的事实是一个明确的信号,你不知道你实际做了什么。如果您想要安全地编写应用程序,则必须先了解输入,输出和编码的基础知识。那么你能做什么呢?适当地过滤,即通过知识,而不是猜测。 – hakre

+0

我的意思是如果有另一个内建CI函数。我将使用一些标准的PHP函数进行过滤。 – luckytaxi

1

我想这是因为&i被解释为实体。我建议你将所有的html特殊字符(如&,<,>等)与它们各自的htmlentities进行转换。在PHP中,您可以使用htmlspecialcharshtmlentities函数来执行此操作。

+0

那么用“htmlentities”来代替? – luckytaxi

+0

是的,因为我建议在我的(更新)的答案;) –

+0

更多参考:http://codeigniter.com/forums/viewthread/84137/#429628 –

0

在将数据保存到数据库之前,POST数据已被污染。

顺便说一下,我也使用CI框架。

例如,客户端侧柱使用数据正常形态POST方法
Cow&Gate/英国牛栏
,你会得到在PHP服务器端是什么?

你会得到
Cow&Gate;/英国牛栏
奇怪的是,一个分号已添加

如果您发布使用XML(或AJAX或jQuery的)的数据,你可以使用encodeURIComponent方法在JavaScript中之前对数据进行编码你把它发布到服务器上,你不需要在PHP服务器端做任何额外的工作。

像这样: $.post('http-server-API', {"field": encodeURIComponent('Cow&Gate/英国牛栏')})

入住PHP服务器端的$ _​​ POST PARAMS(将未加分号)
enter image description here

相关问题