BLZ-Updater: Versionsformat vor URL-Interpolation strikt pruefen
Die von der npm-Registry gelieferte "latest"-Version wird in die jsDelivr- CDN-URL interpoliert. Nun nur noch rein numerisches semver (^\d.\d.\d$) zugelassen, damit eine manipulierte Registry-Antwort (../, Slashes, Query) den Pfad nicht verbiegen kann. Host bleibt ohnehin fix. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -204,10 +204,19 @@ async function fetchJson(url: string): Promise<any> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Erlaubtes Versionsformat (semver-Kern, rein numerisch). Die Version wird in
|
||||||
|
// die CDN-URL interpoliert – ohne strikte Prüfung könnte eine manipulierte
|
||||||
|
// Registry-Antwort (`../`, Slashes, Query-Zeichen) den Pfad verbiegen. Der Host
|
||||||
|
// bleibt zwar fix (CDN_BASE), aber wir lassen nur `1.2.3` zu.
|
||||||
|
const VERSION_RE = /^\d{1,6}\.\d{1,6}\.\d{1,6}$/;
|
||||||
|
|
||||||
/** Ermittelt die neueste verfügbare Paket-Version (npm dist-tag latest). */
|
/** Ermittelt die neueste verfügbare Paket-Version (npm dist-tag latest). */
|
||||||
export async function fetchLatestVersion(): Promise<string> {
|
export async function fetchLatestVersion(): Promise<string> {
|
||||||
const manifest = await fetchJson(`${REGISTRY_BASE}/${PACKAGE}/latest`);
|
const manifest = await fetchJson(`${REGISTRY_BASE}/${PACKAGE}/latest`);
|
||||||
if (!manifest || typeof manifest.version !== 'string') throw new Error('Registry lieferte keine Version');
|
if (!manifest || typeof manifest.version !== 'string') throw new Error('Registry lieferte keine Version');
|
||||||
|
if (!VERSION_RE.test(manifest.version)) {
|
||||||
|
throw new Error(`Unerwartetes Versionsformat: ${manifest.version}`);
|
||||||
|
}
|
||||||
return manifest.version;
|
return manifest.version;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user