Validacija MD5 potpisa za sigurne linkove u ONLYOFFICE Docs
Pregled
ONLYOFFICE Docs koristi sigurne linkove sa MD5 potpisima kako bi zaštitio pristup keširanim fajlovima. Ovi linkovi sadrže parametre md5 i expires i generišu se interno od strane CoAuthoring servisa i validiraju putem NGINX-a.
Da biste validirali ili reprodukovali ove MD5 hešove (npr. za implementaciju sopstvenog proxy-ja ili sigurnosnog sloja), pratite uputstva ispod.
Generisanje MD5 potpisa
MD5 potpis se računa koristeći sledeću formulu:
md5 = BASE64URL(MD5(<expires><uri><secret>))
Gde je:
<expires>numerička vrednost izexpiresparametra u URL-u;<uri>puna putanja zahteva (bez domena ili niza upita), počevši od/cache/files/...;<secret>zajednička tajna koju koristi ONLYOFFICE Docs, obično postavljena putemSECURE_LINK_SECRETpromenljive okruženja ili u konfiguracionim fajlovima.
Da biste generisali heš, pratite ove korake:
-
Konkatenirajte
<expires>,<uri>i<secret>u jedan string. -
Izračunajte binarni MD5 (npr.
md5($string, true)u PHP-u). -
Enkodujte ga koristeći Base64.
-
Pretvorite Base64 string u URL-bezbedan format tako što ćete:
- zameniti
+sa-; - zameniti
/sa_; - ukloniti završne
=.
- zameniti
Konfigurisanje tajne za siguran link
Tajna koja se koristi za generisanje potpisa sigurnog linka može se postaviti na tri načina:
Sve tri metode konfiguracije moraju koristiti istu vrednost tajne. Ako se tajna u local.json razlikuje od one u ds.conf, validacija linka će propasti. Ovo je čest problem nakon ažuriranja — uverite se da su vrednosti usklađene.
-
Promenljiva okruženja (samo za Docker)
Postavite promenljivu okruženja prilikom pokretanja kontejnera:
SECURE_LINK_SECRET=your_secret_here -
Konfiguracioni fajl local.json
Postavite storage.fs.secretString parametar u
local.jsonfajlu, koji se može pronaći na sledećoj putanji:- Za Windows -
%ProgramFiles%\ONLYOFFICE\DocumentServer\config\local.json - Za Linux -
/etc/onlyoffice/documentserver/local.json - Za Docker -
/etc/onlyoffice/documentserver/local.json(unutar Docker kontejnera)
{"storage": {"fs": {"secretString": "your_secret_here"}}} - Za Windows -
-
NGINX konfiguracioni fajl
Postavite
$secure_link_secretparametar uds.conffajlu, koji se može pronaći na sledećoj putanji:- Za Windows -
%ProgramFiles%\ONLYOFFICE\DocumentServer\nginx\conf\ds.conf - Za Linux -
/etc/onlyoffice/documentserver/nginx/ds.conf - Za Docker -
/etc/onlyoffice/documentserver/nginx/ds.conf(unutar Docker kontejnera)
secure_link_md5 "$secure_link_expires$uri$secure_link_secret";secure_link $arg_md5,$arg_expires; - Za Windows -
Primer
Razmotrimo sledeći primer:
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
Korak 1. Ekstrakcija parametara
Izvucite sledeće parametre iz URL-a:
expires: "1749813362";uri: "/cache/files/data/31.172.71.235__172.18.0.2new.docx1749812378403_5169/output.docx/output.docx";secret: "eNk2pNcaoWYTkpR7YWxe".
Korak 2. Validacija MD5 koristeći PHP
Sledeći PHP primer pokazuje kako generisati i validirati MD5 potpis:
<?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";
// Formirajte string:<expires><uri><secure_link_secret>
$string_to_hash = $expires . $uri . $secure_link_secret;
// Izračunajte MD5 heš
$md5_hash = md5($string_to_hash, true);
// Enkodujte u Base64 (URL-bezbedan)
$base64_hash = str_replace(
['+', '/', '='],
['-', '_', ''],
base64_encode($md5_hash)
);
// Ispis rezultata
echo "String to hash: " . $string_to_hash . "\n";
echo "Generated MD5 hash: " . $base64_hash . "\n";
echo "Expected MD5 hash: NS2_divLHhVBHdvvU9vbwA\n";
?>
Korak 3. Poređenje potpisa
Funkcija izračunava sledeći MD5 potpis:
NS2_divLHhVBHdvvU9vbwA
Ovaj potpis odgovara md5 parametru u URL-u. Stoga, zahtev je validan i može biti potvrđen.
Poznati problemi
- Uvek koristite URI, a ne ceo URL.
- Uverite se da vaša tajna odgovara konfiguraciji.
- Nemojte koristiti
urlExpiresparametar za heširanje. Ovaj parametar je definisan udefault.json(ne ulocal.json) i kontroliše konfiguraciju trajanja linka, a ne vrednost korišćenu u MD5 formuli. Uvek koristite stvarnuexpiresvrednost iz niza upita URL-a. - Osigurajte da je Base64 enkodiranje URL-bezbedno.