当字符串包含 & 符号时,在值末尾添加额外的分号
我正在使用 Codeginiter,并且在使用 & 符号时看到字符串末尾添加了一个分号。见下文。顺便说一句,我正在将值存储到 MySQL 数据库中。
在将值插入数据库之前,我正在使用 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;"
I'm using Codeginiter and I'm seeing a semicolon added to the end of my string when using an ampersand sign. See below. BTW, I'm storing the value into a MySQL DB.
I am using htmlspecialchars
before I insert the value into the DB.
$this->form_validation->set_rules('item_name','description','trim|required|min_length[3]|xss_clean');
This works:
$string = "you & I";
// Displays "you & i"
This appends a semicolon in DB:
$string = "you&i";
// Displays "you&i;"
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
您正在使用 CI 的
xss_clean
“功能”,但该功能刚刚被破坏。如果您在某处应用了xss_clean
,请不要指望您的数据会保留下来。相反,禁用它,一切都会好起来的。
然后适当过滤您的数据。 CodeIgniter 文档中实际使用 xss_clean 的建议只是误导性的。小心。
You're making use of the
xss_clean
"feature" of CI which is just broken. Don't expect your data to survive if you applyxss_clean
somewhere.Instead, disable it and things should be fine.
Then filter your data appropriately. The suggestion to actually use
xss_clean
is just misleading in the CodeIgniter documentation. Take care.我认为这是因为
&i
被解释为实体。我建议您将所有 html 特殊字符(如&
、<
、>
等)转换为各自的 html 实体。在 php 中,您可以使用 htmlspecialchars 和 htmlentities 函数。I think this is because the
&i
is interpreted as entity. I suggest you to convert all the html special chars (as&
,<
,>
and so on) with their respective htmlentities. In php you can do this using htmlspecialchars and htmlentities functions.在将数据保存到数据库之前,POST 数据已经被污染。
顺便说一句,我也在使用 CI 框架。
示例,客户端发布数据
Cow&Gate/英国牛栏
使用普通形式的 post 方法,你会在 PHP 服务器端得到什么?
你会得到
Cow&Gate;/英国牛栏
奇怪的是,添加了分号
如果您使用 XML(或 ajax 或 jquery)发布数据,则可以在将数据发布到服务器之前使用 javascript 中的
encodeURIComponent
方法对数据进行编码,然后您将不需要在 PHP 服务器端做任何额外的工作。像这样:
$.post('http-server-API', {"field":encodeURIComponent('Cow&Gate/英国牛栏')})
检查 PHP 服务器端的 $_POST 参数(无分号)将被添加)
Before you to save data into database, the POST data has already been contaminated.
By the way I am using the CI framework too.
Example, Client Side post data
Cow&Gate/英国牛栏
using normal form post method, and what you would get in PHP Server Side?
You would get
Cow&Gate;/英国牛栏
Oddly, a semicolon has been added
If you are posting data with XML(or ajax or jquery), you can use the
encodeURIComponent
method in javascript to encode the data before you post it to server, and you would't need to do any extra work at the PHP Server Side.Like this:
$.post('http-server-API', {"field": encodeURIComponent('Cow&Gate/英国牛栏')})
Check the $_POST params in PHP Server Side (no semicolon would been added)