Politika skriptů
Vlastní skripty jsou ve výchozím stavu vypnuté a povoluje je správce tenantu.
Proč jsou skripty opt-in
Vlastní skript (onFormLoad, onBeforeSave a funkce volané z pravidel a tlačítek) je JavaScript, který běží v prohlížeči každého uživatele formuláře s jeho oprávněními a není izolovaný. Kdo smí měnit konfiguraci formuláře, mohl by tedy spustit libovolný kód v cizích relacích. Proto skripty nefungují, dokud je správce tenantu výslovně nepovolí.
Výrazy zůstávají bezpečné bez povolení. Vzorce v akci pravidla setExpression a v akcích tlačítek počítá vlastní parser, který nepoužívá eval ani new Function a nemá přístup k window, fetch ani ničemu mimo hodnoty polí. Výrazy, pravidla a tlačítka proto fungují i při vypnuté politice. Viz Výrazy a funkce.
Politika a její hodnoty
Politika je tenantová Storage Entity v tenantovém App Catalogu. Primární klíč je FormCraft365_ScriptsPolicy (hodnoty allow / deny). Čte se i starší klíč SpfxFormCustomizer_ScriptPolicy (hodnoty enabled / disabled), ale jen když nový klíč v tenantu vůbec není. Nový klíč má vždy přednost: deny v novém klíči vypne skripty i při enabled ve starém.
| Hodnota | Výsledek |
|---|---|
allow nebo enabled (na velikosti písmen a okolních mezerách nezáleží) | Skripty jsou povolené. |
deny, disabled, jakákoli jiná hodnota (i překlep jako off nebo no) | Skripty jsou vypnuté. |
| Hodnota chybí (ani jeden klíč) | Skripty jsou vypnuté (výchozí stav, opt-in). |
| Chyba při čtení | Skripty jsou vypnuté (fail closed). |
Povolení skriptů je vždy výslovné rozhodnutí správce. Tenant, který politiku nikdy nenastavil, má skripty vypnuté.
Zapnutí a vypnutí
V návrháři
- V návrháři otevřete Zabezpečení a sekci Vlastní skripty.
- Přepínač Povolit vlastní skripty pro celý tenant vidí a může použít jen ten, kdo smí zapisovat do tenantového App Catalogu (správa webu katalogu). Ostatní vidí jen stav a příkaz, který předají správci.
- Změnu potvrďte v dialogu s upozorněním na riziko (Potvrdit změnu). Zapíše se hodnota
allownebodenydo klíčeFormCraft365_ScriptsPolicy. - Zobrazí se hláška „Změna se projeví po opětovném načtení formuláře (nejpozději do 15 minut)“.
PowerShellem
Connect-PnPOnline -Url "https://<tenant>.sharepoint.com/sites/appcatalog" -Interactive
# Povolit
Set-PnPStorageEntity -Key FormCraft365_ScriptsPolicy -Value allow -Scope Tenant
# Zakázat (přebíjí i starší klíč)
Set-PnPStorageEntity -Key FormCraft365_ScriptsPolicy -Value deny -Scope Tenant
# Návrat do výchozího stavu (vypnuto): odstranit oba klíče
Remove-PnPStorageEntity -Key FormCraft365_ScriptsPolicy
Remove-PnPStorageEntity -Key SpfxFormCustomizer_ScriptPolicy
Návrhář u správce bez práv zapisovat do App Catalogu nabízí k předání příkazy pro allow i deny.
Cache 15 minut
Prohlížeč si výsledek posledního úspěšného čtení pamatuje 15 minut (localStorage, klíč _fc_scrpol_<tenantId>). Změna se proto může u uživatelů projevit až po 15 minutách. Okamžitě ji uvidíte po odstranění klíčů _fc_scrpol_* z localStorage a načtení stránky znovu. Chyba čtení cache dobu neprodlužuje: při chybě jsou skripty vypnuté.
Chování při vypnutí
- Žádný skript se nespustí ani nezkompiluje. Jediná brána je funkce
runScriptv rendereru, která politiku kontroluje uonFormLoad,onBeforeSavei volání funkcí. - Pravidla a vzorce fungují dál. Vlastní tlačítka se vykreslí a provedou své neskriptové akce (
setValue,setFieldValue,setExpression, odeslání). AkcecallFunctionse přeskočí. - Správci formuláře vidí ve formuláři informační pruh „Vlastní skripty jsou na tomto tenantu vypnuté…“. Běžní uživatelé nevidí nic.
- Existující skripty jde v návrháři pořád smazat (přidávání a úpravy jsou zamčené), takže konfiguraci lze vyčistit a upozornění zmizí.
onBeforeSavese při vypnutých skriptech neprovádí a uložení se neblokuje (správce na to dostane upozornění). Pro blokování uložení použijte pravidla s akcíblockSave.- V ladicím režimu se přeskočení zapíše do konzole jako
[FC debug] script skipped: tenant policy disabled (…). Viz Ladicí režim.
Rizika po zapnutí
Politika platí pro celý tenant a všechny formuláře. Skript spuštěný ve formuláři může číst a měnit data v relaci uživatele, který formulář otevřel. Zapněte ji až poté, co ověříte, že konfiguraci formulářů smějí měnit jen důvěryhodní návrháři (viz Oprávnění: zamčené úložiště a role „vlastníci webu“).
- Izolovaný běh skriptů (sandbox) zatím není součástí produktu.
- Skripty se kompilují dynamicky. Přísná CSP prohlížeče nebo tenantu může spuštění zablokovat (
unsafe-eval), viz níže. - Při úvaze o zapnutí pro jediný formulář zvažte, zda stejný výsledek nezvládnou pravidla a výrazy, které politiku nepotřebují.
Akceptované riziko: App Catalog site collection
Storage Entity se čte přes /_api/web/GetStorageEntity. Ten může vrátit hodnotu z App Catalogu site collection dříve než tenantovou. Správce site collection s vlastním App Catalogem tak může skripty povolit jen pro svůj web. Totéž platí pro čtení licenčního klíče. Tenantový katalog se záměrně nečte přímo, protože ho běžní uživatelé číst nemohou. Je to přijaté riziko: nepoužívejte App Catalogy site collection tam, kde by to bylo nepřijatelné.
Chyby CSP a unsafe-eval
Je-li politika zapnutá, ale skript se nespustí a ve formuláři (nebo v konzoli) se objeví hláška, použijte tabulku:
| Hláška | Příčina |
|---|---|
| Bezpečnostní politika (CSP) tenanta nebo prohlížeče blokuje dynamické spouštění skriptů (unsafe-eval). | Prostředí zakazuje new Function. Skripty zde fungovat nebudou, použijte pravidla a výrazy. |
| Chyba při kompilaci skriptu (neplatná syntaxe). | Chyba v kódu skriptu. Opravte ji v editoru skriptů v návrháři. |
| Chyba skriptu: … | Výjimka za běhu skriptu. Podrobnosti vypíše ladicí režim. |
Postup při potížích: Řešení problémů, skripty nefungují. Psaní skriptů popisuje Skripty.