首页 > 解决方案 > 获取 Query_String 被截断 - Apache access.log 具有完整字符串,error.log 显示截断符号 QUERY_STRING 值

问题描述

用户将 100 多个单独的数字字符串粘贴到文本框中以提交查询。前端 Web 服务器是 Ubuntu 18.04 LTS 服务器,带有 Apache 2.4.29 和 Php 7.2.19。提交后,数据通过 Post 查询字符串(一点也不理想)传送到运行 Apache 2.0.63 的后端 Web 服务器。后端 Apache 服务器具有 C 代码 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 从前端到后端的不匹配还是其他原因?

标签: phpapachecgitruncated

解决方案


推荐阅读