Get Query_String Truncated - Apache access.log содержит полную строку, error.log показывает значение усеченного символа QUERY_STRING - PullRequest
1 голос
/ 07 июля 2019

Пользователи вставляют более 100 отдельных числовых строк в текстовое поле для отправки на запрос.Интерфейсный веб-сервер - это сервер Ubuntu 18.04 LTS с Apache 2.4.29 и Php 7.2.19.После отправки данные передаются через строку запроса Post (не совсем идеально) на внутренний веб-сервер под управлением Apache 2.0.63. Внутренний сервер Apache имеет C-код CGI, который использует данные для запросов.

Внешний сервер Apache раньше был физической машиной, на которой работали Ubuntu 7.1, PHP 5.2 и Apache 2.2.Теперь это полностью перестроенная система на VMware ESXi 6.7.Бэкэнд-сервер остался без изменений.

Проблема в том, что эта ужасно длинная строка запроса раньше размещалась полностью без усечения.В новой системе внешнего интерфейса оно усекается до 790 символов.

Что может вызвать это усечение?

Wireshark на отправляющем сервере Apache показывает полную неусеченную строку.Журнал доступа на принимающем сервере Apache показывает полную не усеченную строку.Однако в журнале ошибок на принимающем сервере Apache показано:

Значение усеченного символа QUERY_STRING: за ним следует полная строка, за исключением того, что имеется СИМВОЛ ТРУБЫ |сразу после 790 символов.Почему это так?

В код CGI внутреннего сервера были введены операторы печати, чтобы показать строку, а в результате была усеченная строка длиной 790 символов.Я установил LimitRequestLine и LimitRequestFieldSize в apache2.conf на отправляющем и принимающем серверах Apache на 8190. Php Max_Post_size установлен на 1024M в php.ini.

Это код 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);

Кодированная строка усекается до 790 символов, как видно из программы CGI после каждого сообщения.Будет ли это связано с изменением версий Apache, версий PHP, несоответствием Apache с внешнего интерфейса на внутренний или что-то еще?

...