у меня есть php
веб-приложение, которое позволяет нашим пользователям загружать наш установщик программного обеспечения setup.exe
,
Мы только начали подписывать наш код, как установщик, так и приложения внутри него, и это нормально. Однако, когда я загружаю этот установщик на наш веб-сервер и загружаю его через php
веб приложение, setup.exe
больше не имеет цифровой подписи! Это как если бы оно никогда не было подписано.
Вот что я попробовал:
[right click] -> [properties]
показывает, что setup.exe
не подписан код тем не мение setup.exe
это ожидаемая версия.setup.exe
непосредственно с веб-сервера через cpanel
Файловый менеджер и это нормально — setup.exe
имеет цифровую подпись и ожидаемую версию.setup.exe
с веб-сайта через различные браузеры (Firefox, Edge) приводит к тому же поведению.РЕДАКТИРОВАТЬ
setup.exe
подать в публичную область на сайте и скачать его непосредственно через браузер — работает отлично. Все, что я могу думать, это то, что проблема заключается в том, как PHP передает приложение в браузер.Я думал, что заголовки HTTP или написанная нами функция загрузки PHP могут быть связаны с этой проблемой.
Наш универсальный include.php
Файл имеет следующие заголовки для предотвращения кеширования:
header("Cache-Control: no-cache, must-revalidate"); // HTTP/1.1
header("Expires: Fri, 01 Jan 2016 01:00:00 GMT"); // a date in the past
И это наша функция загрузки:
function DownloadFile($file, $filename) {
// check if file exists and write header info and output file
if (file_exists($file)) {
header('Content-Description: File Transfer');
header('Content-Type: application/x-msdownload');
header('Content-Disposition: attachment; filename="' . $filename . '"');
header('Content-Transfer-Encoding: binary');
header('Expires: 0');
header('Cache-Control: must-revalidate');
header('Pragma: public');
header('Content-Length: ' . filesize($file));
readfile($file);
return true;
}
else {
// file does not exist
return false;
}
}
Что в первую очередь от readfile()
пример на php.net. Здесь есть красные флаги? В чем дело?
Проблема была вызвана тем, как веб-приложение обрабатывает файл после перенаправления заголовка на ту же страницу — сама страница также предоставляет другие данные в качестве содержимого.
После звонка DownloadFile()
остальная часть страницы, включая HTML-содержимое и т. д., была отправлена как часть файла — в результате дополнительные данные повредили цифровую подпись.
Решением было принудительно завершить работу сценария после отправки файла.
$file = $_SERVER['DOCUMENT_ROOT'] . '/../product/release/' . $path;
DownloadFile($file, "ProductInstaller.exe");
exit; // prevent the rest of the page from being sent as part of the file
Других решений пока нет …