PHP生成XML,在文档末尾获取额外内容

PHP生成XML,在文档末尾获取额外内容,php,xml,Php,Xml,在尝试使用PHP生成一个简单的XML文档时,我发现了一个似乎有效的示例,我是如何得到这个错误的: 此页面包含以下错误: 第1列第5行错误:文档末尾的额外内容 下面是第一个错误之前的页面呈现 以下是我的PHP代码: $xml = new SimpleXMLElement("<xml/>"); $form_data = array( "name" => $_POST['name'], "email" => $_POST['email'], "messa

在尝试使用PHP生成一个简单的XML文档时,我发现了一个似乎有效的示例,我是如何得到这个错误的:

此页面包含以下错误:

第1列第5行错误:文档末尾的额外内容 下面是第一个错误之前的页面呈现

以下是我的PHP代码:

$xml = new SimpleXMLElement("<xml/>");
$form_data = array(
    "name" => $_POST['name'],
    "email" => $_POST['email'],
    "message" => $_POST['message'],
    "reg" => $_POST['reg'],
    "image" => $image_location
);

$xml->addChild('uploaded',serialize($_POST));
$xml->addChild('imageerror',"imageerror");

header('Content-type: text/xml');
print($xml->asXML());
$xml=newsimplexmlement(“”);
$form_data=数组(
“name”=>$\u POST['name'],
“email”=>$\u POST['email'],
“message”=>$\u POST['message'],
“reg”=>$\u POST['reg'],
“图像”=>$image\u位置
);
$xml->addChild('upload',序列化($_POST));
$xml->addChild('imageerror','imageerror');
标题('Content-type:text/xml');
打印($xml->asXML());
这是我查看我的页面源时得到的结果:

<?xml version="1.0"?>
<xml><uploaded>a:0:{}</uploaded><imageerror>imageerror</imageerror></xml>

<!-- Hosting24 Analytics Code -->
<script type="text/javascript" src="http://stats.hosting24.com/count.php"></script>
<!-- End Of Analytics Code -->

a:0:{}图像错误

因此,它似乎确实正确地生成了XML,但是web主机添加了一些垃圾,这就是导致错误的原因吗?如果是这样的话,那么改变web主机是阻止错误发生的唯一方法吗

这里的主机提供商真丢脸。对于遇到相同问题的其他人,
die()
将停止执行,因此不会从hosting24添加分析代码。

有3种方法可用于此操作:

1) 他们的CPanel中总是有一个链接,它会禁用代码中的分析代码。大多数时候,文件的链接都是
您的web\u主机\u url/analytics.php
。但总是认为,这样做,你会否认他们的政策,他们最终会删除你的帐户,它会导致丢失你的数据。 2) 可以在php脚本末尾使用
exit
命令

3) 在您的
public\u html
文件夹中创建
.htaccess
,并添加以下内容 代码:

<FilesMatch "\.(php)$">
php_value auto_append_file none
</FilesMatch> 

php_值自动_追加_文件无
.php
替换为任何不需要分析的文件类型

这在很大程度上取决于如何添加分析代码。您可以尝试禁用.htaccess中的
php\u auto\u append
指令,或者通过主机提供的任何控制面板检查php.ini值。如果您通常使用分析代码,并且上述操作正常,请将XML/JSON文件放在单独的文件夹中,确保virtualHost的Apache AllowOverride指令包含
FileInfo
(或者设置为
All
),并将XML/JSON生成文件与
.htaccess
一起放在该文件夹中

php_value   "auto_append_file"      None
可以说,这些是实现这一目标的“官方/优雅”方式。如果这还不够的话,建议你和主人一起开票

考虑到发送分析代码将破坏所有类型的JSON/XML服务,可以肯定的是,是一种简单的禁用方法。它可能涉及将文件放在一个特定的文件夹中(即,上面的解决方法实际上已经存在),或者给它一个特定的名称服务器端,或者其他一些东西——但是应该有一种方法

也就是说,如果其他内容都不起作用,您可以尝试让客户端浏览器忽略额外的内容:

$actualContent = $xml->asXML();
Header('Content-Type: text/xml');
Header('Content-Length: ' . strlen($actualContent));
Header('Connection: close');
die($actualContent);
如果上面的头完整地到达客户机(主机也可能弄乱它们…),连接将断开,只考虑第一个“有价值”字节这是一种黑客行为,因为它依赖于未记录/未测试的行为

另一个类似的攻击涉及发送一个多部分头,第一部分在发送
$actualContent
后结束,然后是一个未处理的MIME类型。任何需要XML的客户机都将提取第一部分并忽略其余部分。这也是不干净的行为,因为变速箱将缺少端块


出于同样的原因,在打印结果后,在注释
中结束XML,尝试添加
die()
。是的,谢谢,我没有想到这一点。请加上它作为答案。愚蠢的网络主机弄乱了我的代码!谢谢,但我接受了另一个答案,因为我认为它给出了更广泛的答案。