获取被截断的Query_String-Apache access.log具有完整的字符串,error.log显示截断符号QUERY_STRING值

时间:2019-07-07 03:10:19

标签: php apache cgi truncated

用户将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从前端到后端的不匹配还是其他原因引起的?

0 个答案:

没有答案