为什么 $_POST 从字符串中删除 HTML 标签?
Why $_POST is removing HTML tags from string?
我正在 PHP 5.6 使用 Fat Free Framework(如果它重要的话)并且有一个奇怪的问题。我像这样向服务器发送表单数据:
function submitForm(form)
{
var fd = new FormData();
var file_data = isImageIncluded ? $('input[type="file"]')[0].files : [];
for (var i = 0; i < file_data.length; i++) {
fd.append("file_" + i, file_data[i]);
}
var other_data = $(form).serializeArray();
$.each(other_data, function(key, input) {
fd.append(input.name, input.value);
});
sendData(url, fd, form);
}
function sendData(url, data, form)
{
$.ajax({
type: 'POST',
url: url,
data: data,
contentType: false,
processData: false,
success: function(data) {
console.log(data);
}
}
});
}
所以当我调试上面的代码时,我看到数据从所见即所得发送,带有 html 标签,例如 <b></b>
.
问题出在PHP这边。方法如下:
public function editRelease()
{
var_dump($_POST['description']);exit;
}
并且无法获取描述以显示字符串中的 html 标记。有人知道发生了什么事吗?
编辑
这是我的 headers 来自 Chrome 的屏幕截图。我标记了我所指的 object 。如图所示,html 标签将发送到服务器,所以我不确定为什么它没有显示在 $_POST 数组中。
编辑 2
这是我得到的响应的屏幕截图,对应于上面 headers 的屏幕截图:
有人见过吗?
对于那些想知道的人,我发现在我的 Fat Free Framework 变体中,称为 F3 Boilerplate,有一段代码剥离了标签。在它的 app.php 里面,我发现
// clean ALL incoming user input by default
$request = array();
foreach (array('GET', 'POST', 'PUT', 'PATCH', 'DELETE', 'COOKIE') as $var) {
$input = $f3->get($var);
if (is_array($input) && count($input)) {
$cleaned = array();
foreach ($input as $k => $v) {
$k = strtolower(trim($f3->clean($k)));
$v = $f3->clean($v);
if (empty($v)) {
continue;
}
$cleaned[$k] = $v;
$request[$k] = $v;
}
ksort($cleaned);
$f3->set($var, $cleaned);
}
}
它使用 $f3->clean()
从所有传入输入中删除标签,因此我不得不将其修改为白名单标签,如文档 http://fatfreeframework.com/base#clean.
中所述
我正在 PHP 5.6 使用 Fat Free Framework(如果它重要的话)并且有一个奇怪的问题。我像这样向服务器发送表单数据:
function submitForm(form)
{
var fd = new FormData();
var file_data = isImageIncluded ? $('input[type="file"]')[0].files : [];
for (var i = 0; i < file_data.length; i++) {
fd.append("file_" + i, file_data[i]);
}
var other_data = $(form).serializeArray();
$.each(other_data, function(key, input) {
fd.append(input.name, input.value);
});
sendData(url, fd, form);
}
function sendData(url, data, form)
{
$.ajax({
type: 'POST',
url: url,
data: data,
contentType: false,
processData: false,
success: function(data) {
console.log(data);
}
}
});
}
所以当我调试上面的代码时,我看到数据从所见即所得发送,带有 html 标签,例如 <b></b>
.
问题出在PHP这边。方法如下:
public function editRelease()
{
var_dump($_POST['description']);exit;
}
并且无法获取描述以显示字符串中的 html 标记。有人知道发生了什么事吗?
编辑
这是我的 headers 来自 Chrome 的屏幕截图。我标记了我所指的 object 。如图所示,html 标签将发送到服务器,所以我不确定为什么它没有显示在 $_POST 数组中。
编辑 2
这是我得到的响应的屏幕截图,对应于上面 headers 的屏幕截图:
有人见过吗?
对于那些想知道的人,我发现在我的 Fat Free Framework 变体中,称为 F3 Boilerplate,有一段代码剥离了标签。在它的 app.php 里面,我发现
// clean ALL incoming user input by default
$request = array();
foreach (array('GET', 'POST', 'PUT', 'PATCH', 'DELETE', 'COOKIE') as $var) {
$input = $f3->get($var);
if (is_array($input) && count($input)) {
$cleaned = array();
foreach ($input as $k => $v) {
$k = strtolower(trim($f3->clean($k)));
$v = $f3->clean($v);
if (empty($v)) {
continue;
}
$cleaned[$k] = $v;
$request[$k] = $v;
}
ksort($cleaned);
$f3->set($var, $cleaned);
}
}
它使用 $f3->clean()
从所有传入输入中删除标签,因此我不得不将其修改为白名单标签,如文档 http://fatfreeframework.com/base#clean.