在 xml 中以编程方式转义符号似乎不起作用。有效载荷切断
Escaping ampersand programatically in xml does not seem to work. Payload cuts off
我有一个 arduino 开发板,我试图从中 post xml 数据到服务器。我在 xml 中遇到 & 问题,所以我首先使用浏览器进行了测试。我创建了一个 html 表单,提交数据,在服务器上捕获 headers,并尝试在板上复制它。
html表格.
<form id= "pData" action="#" method="post" >
<textarea name="postData" ></textarea>
<input type='submit' value=' Go '/>
</form>
正在从 php 服务器捕获数据
if(isset($_POST['postData'])){
$input_headers="";
$file = 'xmlErrors.txt';
foreach ($_SERVER as $name => $value) {
$input_headers.= "$name: $value\n";
}
$settings=$input_headers."\r\n".$_POST['postData'];
file_put_contents($file,$settings, FILE_APPEND );
}
这就是我从董事会发送的方式。我在串行监视器上打印数据以确保它看起来不错。
String request = "POST /test.php HTTP/1.1\r\nHost: example.com\r\nAccept-Encoding: gzip, deflate \r\nCache-Control:max-age=0\r\nUser-Agent:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.149 Safari/537.36\r\nAccept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9\r\nAccept-Language:en-US,en;q=0.9,pl;q=0.8\r\nReferer:example.com\r\nContent-Type: application/x-www-form-urlencoded\r\n";
String payload = "<?xml version='1.0' encoding='UTF-8'?><response>a=1&b=2</response>";
//Serial.print("length: ");Serial.println(payload.length());
request += "Content-Length:" + String(payload.length() + 15) + "\r\nConnection: Close\r\n\r\postData=" + payload;
client.print(request);
当我从浏览器测试它时,数据被正确捕获。但是当我从董事会发送它时,它在
处被切断
<?xml version='1.0' encoding='UTF-8'?><response>a=1
我尝试像
那样改变数据负载
<?xml version='1.0' encoding='UTF-8'?><response>a=1&b=2</response>
无论我尝试什么,它都会被切断。我几乎匹配了董事会对我有意义的每个 http header,但仍然无济于事。如果没有 &,我会从板上获取服务器上的全部数据,所以我相信板上的其余代码正在完成它的工作。
有什么线索吗?
对于那些最终陷入问题这一角落的人,情况如下。
Web 浏览器正在使用
提交数据
CONTENT_TYPE: application/x-www-form-urlencoded
这意味着 & 变成了 %26,这就是它通过的方式。在板上,虽然 header 存在,但 & 未进行 urlencoded,而是 xml 转义。将 & 更改为 %26 将使您完成 $_POST 部分。获取数据后,您必须 xml 使用 &
转义 & 以使其通过 xml 解析。
感谢 Wireshark :)
我有一个 arduino 开发板,我试图从中 post xml 数据到服务器。我在 xml 中遇到 & 问题,所以我首先使用浏览器进行了测试。我创建了一个 html 表单,提交数据,在服务器上捕获 headers,并尝试在板上复制它。
html表格.
<form id= "pData" action="#" method="post" >
<textarea name="postData" ></textarea>
<input type='submit' value=' Go '/>
</form>
正在从 php 服务器捕获数据
if(isset($_POST['postData'])){
$input_headers="";
$file = 'xmlErrors.txt';
foreach ($_SERVER as $name => $value) {
$input_headers.= "$name: $value\n";
}
$settings=$input_headers."\r\n".$_POST['postData'];
file_put_contents($file,$settings, FILE_APPEND );
}
这就是我从董事会发送的方式。我在串行监视器上打印数据以确保它看起来不错。
String request = "POST /test.php HTTP/1.1\r\nHost: example.com\r\nAccept-Encoding: gzip, deflate \r\nCache-Control:max-age=0\r\nUser-Agent:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.149 Safari/537.36\r\nAccept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9\r\nAccept-Language:en-US,en;q=0.9,pl;q=0.8\r\nReferer:example.com\r\nContent-Type: application/x-www-form-urlencoded\r\n";
String payload = "<?xml version='1.0' encoding='UTF-8'?><response>a=1&b=2</response>";
//Serial.print("length: ");Serial.println(payload.length());
request += "Content-Length:" + String(payload.length() + 15) + "\r\nConnection: Close\r\n\r\postData=" + payload;
client.print(request);
当我从浏览器测试它时,数据被正确捕获。但是当我从董事会发送它时,它在
处被切断<?xml version='1.0' encoding='UTF-8'?><response>a=1
我尝试像
那样改变数据负载<?xml version='1.0' encoding='UTF-8'?><response>a=1&b=2</response>
无论我尝试什么,它都会被切断。我几乎匹配了董事会对我有意义的每个 http header,但仍然无济于事。如果没有 &,我会从板上获取服务器上的全部数据,所以我相信板上的其余代码正在完成它的工作。
有什么线索吗?
对于那些最终陷入问题这一角落的人,情况如下。
Web 浏览器正在使用
提交数据CONTENT_TYPE: application/x-www-form-urlencoded
这意味着 & 变成了 %26,这就是它通过的方式。在板上,虽然 header 存在,但 & 未进行 urlencoded,而是 xml 转义。将 & 更改为 %26 将使您完成 $_POST 部分。获取数据后,您必须 xml 使用 &
转义 & 以使其通过 xml 解析。
感谢 Wireshark :)