用户将100多个单独的数字字符串粘贴到文本框中以提交查询。前端Web服务器是具有Apache 2.4.29和Php 7.2.19的Ubuntu 18.04 LTS服务器。提交后,数据将通过Post查询字符串(完全不理想)传递到运行Apache 2.0.63的后端Web服务器。后端Apache服务器具有C代码CGI,CGI将数据用于查询。
前端Apache服务器曾经是运行Ubuntu 7.1,PHP 5.2和Apache 2.2的物理计算机。现在,它是在VMware ESXi 6.7上完全重建的系统。后端服务器保持不变。
问题在于,这个非常长的查询字符串过去曾被完全发布而没有截断。在新的前端系统上,它被截断为790个字符。
什么可能导致这种截断?
正在发送的Apache服务器上的Wireshark显示完整的未截断的字符串。接收方Apache服务器上的访问日志显示完整的未截断的字符串。但是,接收方Apache服务器上的错误日志显示:
截断符号QUERY_STRING值:后跟完整字符串,除非存在PIPE SYMBOL |在790个字符之后。为什么会这样?
后端服务器的CGI代码已输入打印语句以显示该字符串,而输出的内容是790个字符串被截断。我已经在发送和接收Apache服务器上的apache2.conf中将LimitRequestLine和LimitRequestFieldSize设置为8190。在php.ini中,PHP Max_Post_size设置为1024M。
这是PHP代码:
<?php
header("content-type: application/xml");
if ($_POST) {
$params = "";
$parameter = 0;
foreach ($_POST as $key => $value) {
$parameter++;
switch ($parameter) {
case 1:
$params = $value;
break;
case 2:
$params = $params."?".$key."=".urlencode($value);
break;
default:
$params = $params."&".$key."=".urlencode($value);
break;
}
}
} else {
$params = $_SERVER["QUERY_STRING"];
}
$request = "http://192.168.xxxxxxx/cgi-bin/".$params;
$result = @join (@file($request), "");
$result = str_replace(array("\n", "\r"), "", $result);
echo $result;
?>
这是后端服务器上的C代码。我引用处理该代码的人:
它只是从查询字符串所在的位置获取指针,并将其传递给C代码字符指针。
然后得到它的长度。
不需要在C中设置缓冲区。
因此字符串长度为970。
char *buf;
long buflen;
buf = getenv("QUERY_STRING");
buflen = (long)strlen(buf);
每次发布后,CGI程序都会将编码的字符串截断为790个字符。这是由于Apache版本,PHP版本的更改,Apache从前端到后端的不匹配还是其他原因引起的?