Проверка MD5-подписей защищенных ссылок ONLYOFFICE Docs
Обзор
ONLYOFFICE Docs использует защищенные ссылки с MD5-подписями, чтобы защитить доступ к кэшированным файлам. Такие ссылки содержат параметры md5 и expires, генерируются внутри сервиса CoAuthoring и проверяются с помощью NGINX.
Чтобы проверить или воспроизвести эти MD5-хэши (например, для реализации собственного прокси или уровня безопасности), следуйте приведенным ниже инструкциям.
Генерация MD5-подписи
MD5-подпись вычисляется по следующей формуле:
md5 = BASE64URL(MD5(<expires><uri><secret>))
Где:
<expires>— числовое значение параметра запросаexpiresв URL-адресе;<uri>— полный путь запроса (без домена и строки запроса), начинающийся с/cache/files/...;<secret>— общий секрет, используемый ONLYOFFICE Docs; обычно задается с помощью переменной окруженияSECURE_LINK_SECRETили в файлах конфигурации.
Чтобы сгенерировать хэш, выполните следующие действия:
-
Объедините
<expires>,<uri>и<secret>в одну строку. -
Вычислите двоичный MD5-хэш (например,
md5($string, true)в PHP). -
Закодируйте его в Base64.
-
Преобразуйте строку Base64 в формат, безопасный для URL:
- замените
+на-; - замените
/на_; - удалите завершающие символы
=.
- замените
Настройка секрета защищенных ссылок
Секрет, используемый для генерации подписи защищенной ссылки, можно задать тремя способами:
Во всех трех способах настройки должно использоваться одно и то же значение секрета. Если секрет в файле local.json отличается от секрета в файле ds.conf, проверка ссылок завершится ошибкой. Это частая проблема после обновлений — убедитесь, что значения совпадают.
-
Переменная окружения (только для Docker)
Задайте переменную окружения при запуске контейнера:
SECURE_LINK_SECRET=your_secret_here -
Файл конфигурации local.json
Задайте параметр storage.fs.secretString в файле
local.json, который находится по следующему пути:- Для Windows —
%ProgramFiles%\ONLYOFFICE\DocumentServer\config\local.json - Для Linux —
/etc/onlyoffice/documentserver/local.json - Для Docker —
/etc/onlyoffice/documentserver/local.json(внутри Docker-контейнера)
{"storage": {"fs": {"secretString": "your_secret_here"}}} - Для Windows —
-
Файл конфигурации NGINX
Задайте параметр
$secure_link_secretв файлеds.conf, который находится по следующему пути:- Для Windows —
%ProgramFiles%\ONLYOFFICE\DocumentServer\nginx\conf\ds.conf - Для Linux —
/etc/onlyoffice/documentserver/nginx/ds.conf - Для Docker —
/etc/onlyoffice/documentserver/nginx/ds.conf(внутри Docker-контейнера)
secure_link_md5 "$secure_link_expires$uri$secure_link_secret";secure_link $arg_md5,$arg_expires; - Для Windows —
Пример
Рассмотрим следующий пример:
https://example.com/cache/files/data/31.172.71.235__172.18.0.2new.docx1749812378403_5169/output.docx/output.docx?md5=NS2_divLHhVBHdvvU9vbwA&expires=1749813362
Шаг 1. Извлеките параметры
Извлеките из URL-адреса следующие параметры:
expires: "1749813362";uri: "/cache/files/data/31.172.71.235__172.18.0.2new.docx1749812378403_5169/output.docx/output.docx";secret: "eNk2pNcaoWYTkpR7YWxe".
Шаг 2. Проверьте MD5 с помощью PHP
В следующем примере на PHP показано, как сгенерировать и проверить MD5-подпись:
<?php
$expires = "1749813362";
$uri = "/cache/files/data/31.172.71.235__172.18.0.2new.docx1749812378403_5169/output.docx/output.docx";
$secure_link_secret = "eNk2pNcaoWYTkpR7YWxe";
// Form the string:<expires><uri><secure_link_secret>
$string_to_hash = $expires . $uri . $secure_link_secret;
// Calculate MD5 hash
$md5_hash = md5($string_to_hash, true);
// Encode to Base64 (URL-safe)
$base64_hash = str_replace(
['+', '/', '='],
['-', '_', ''],
base64_encode($md5_hash)
);
// Output the result
echo "String to hash: " . $string_to_hash . "\n";
echo "Generated MD5 hash: " . $base64_hash . "\n";
echo "Expected MD5 hash: NS2_divLHhVBHdvvU9vbwA\n";
?>
Шаг 3. Сравните подписи
Функция вычисляет следующую MD5-подпись:
NS2_divLHhVBHdvvU9vbwA
Она совпадает с параметром md5 в URL-адресе. Следовательно, запрос действителен и может быть подтвержден.
Известные проблемы
- Всегда используйте URI, а не полный URL-адрес.
- Убедитесь, что ваш секрет совпадает с указанным в конфигурации.
- Не используйте для хэширования параметр
urlExpires. Этот параметр задается в файлеdefault.json(а не вlocal.json) и управляет настройкой срока действия ссылок, а не значением, используемым в формуле MD5. Всегда используйте фактическое значениеexpiresиз строки запроса URL-адреса. - Убедитесь, что кодировка Base64 безопасна для URL.