Turinio saugos strategija

Turinio saugos strategija (CSP) šiuo metu palaikoma modeliu pagrįstoje Power Apps per du organizacijos objekto atributus, kurie valdo, ar siunčiama CSP antraštė ir kiek joje yra. Šis nustatymas yra aplinkos lygiu, o tai reiškia, kad įjungus jis bus taikomas visoms aplinkos programoms.

Pastaba

CSP šiuo metu palaikomas tik modeliu pagrįstose programose. Drobės programos palaikymas pasieks viešąją peržiūrą 2022 m. vasarą.

  • IsContentSecurityPolicyEnabled valdo, ar turinio saugos strategijos antraštė siunčiama pagrindiniame programos puslapyje (pagrindinis.aspx). Pagal numatytuosius nustatymus antraštė nustatyta kaip script-src * 'unsafe-inline' 'unsafe-eval'; worker-src 'self' blob:; style-src * 'unsafe-inline'; font-src * data:; frame-ancestors 'self';. Kiekvienas šios antraštės reikšmės komponentas valdo turtą, kurį galima atsisiųsti, ir yra išsamiau aprašytas "Mozilla" kūrėjų tinkle (MDN):
  • ContentSecurityPolicyConfiguration valdo kadrų protėvių dalies vertę (kaip matyti iš aukščiau, ji nustatyta kaip "self", jei ContentSecurityPolicyConfiguration nenustatyta). Šį parametrą vaizduoja JSON objektas, turintis tokią struktūrą : { "Frame-Ancestor": { "sources": [ { "source": "foo" }, { "source": "bar" } ] } }. Tai virstųscript-src * 'unsafe-inline' 'unsafe-eval'; worker-src 'self' blob:; style-src * 'unsafe-inline'; font-src * data:; frame-ancestors 'foo' 'bar';
    • (Iš MDN) HTTP turinio- saugos strategijos (CSP) kadrų protėvių direktyvoje nurodyti galiojantys tėvai, kurie gali įdėti puslapį naudodami <frame>, <iframe>, <object>, <embed> arba <applet>.

CSP konfigūravimas

Šiuo metu nėra vartotojo sąsajos šiems atributams redaguoti, tačiau ateityje planuojame juos Power Platform atskleisti administravimo centre. Tuo tarpu galite naudoti toliau pateiktą scenarijų, kad įjungtumėte ir atnaujintumėte kadrų protėvių atributą. Pirmiausia svarbu įjungti kūrėjo / bandymo aplinkoje, nes tai įgalinus, gali būti pradėtas blokuoti turto atsisiuntimą, jei politika pažeidžiama. Ateityje planuojame palaikyti "tik ataskaitos režimą", kad būtų galima lengviau padidinti gamybą.

CSP įgalinimas

Veiksmai:

  • Atidarykite naršyklės kūrėjo įrankius naudodami modeliu pagrįstą programą kaip vartotoją, turintį organizacijos objekto naujinimo teises (sistemos administratorius yra geras pasirinkimas).
  • Įklijuokite ir vykdykite toliau pateiktą scenarijų į konsolę.
  • Norėdami tiesiog įjungti CSP, perduokite numatytąją konfigūraciją - enableFrameAncestors(["'self'"])
  • Kaip pavyzdį, kaip įgalinti papildomą kilmę įterpti programą - enableFrameAncestors(["*.powerapps.com", "'self'", "abcxyz"])
async function enableFrameAncestors(sources) {
     if (!Array.isArray(sources) || sources.some(s => typeof s !== 'string')) {
        throw new Error('sources must be a string array');
    }

    const orgResponse = await fetch('/api/data/v9.1/organizations');
    if (!orgResponse.ok) throw new Error('Failed to retrieve org info');
    const orgs = await orgResponse.json();
    const { organizationid, contentsecuritypolicyconfiguration, iscontentsecuritypolicyenabled } = orgs.value[0];

    console.log(`Organization Id: ${organizationid}`);
    console.log(`CSP Enabled?: ${iscontentsecuritypolicyenabled}`);
    console.log(`CSP Config: ${contentsecuritypolicyconfiguration}`);

    const orgProperty = prop => `/api/data/v9.1/organizations(${organizationid})/${prop}`;

    console.log('Updating CSP configuration...')
    const config = {
        'Frame-Ancestor': {
            sources: sources.map(source => ({ source })),
        },
    };
    const cspConfigResponse = await fetch(orgProperty('contentsecuritypolicyconfiguration'), {
        method: 'PUT',
        headers: { 'Content-Type': 'application/json' },
        body: JSON.stringify({
            value: JSON.stringify(config),
        }),
    });

    if (!cspConfigResponse.ok) {
        throw new Error('Failed to update csp configuration');
    }
    console.log('Successfully updated CSP configuration!')

    if (iscontentsecuritypolicyenabled) {
        console.log('CSP is already enabled! Skipping update.')
        return;
    }

    console.log('Enabling CSP...')
    const cspEnableResponse = await fetch(orgProperty('iscontentsecuritypolicyenabled'), {
        method: 'PUT',
        headers: { 'Content-Type': 'application/json' },
        body: JSON.stringify({
            value: true,
        }),
    });

    if (!cspEnableResponse.ok) {
        throw new Error('Failed to enable csp');
    }
    console.log('Successfully enabled CSP!')
}

CSP išjungimas

Veiksmai:

  • Atidarykite naršyklės kūrėjo įrankius naudodami modeliu pagrįstą programą kaip vartotoją, turintį organizacijos objekto naujinimo teises (sistemos administratorius yra geras pasirinkimas).
  • Įklijuokite ir vykdykite toliau pateiktą scenarijų į konsolę.
  • Norėdami išjungti CSP, įklijuokite į konsolę: disableCSP()
async function disableCSP() {
    const orgResponse = await fetch('/api/data/v9.1/organizations');
    if (!orgResponse.ok) throw new Error('Failed to retrieve org info');
    const orgs = await orgResponse.json();
    const { organizationid, iscontentsecuritypolicyenabled } = orgs.value[0];

    console.log(`Organization Id: ${organizationid}`);
    console.log(`CSP Enabled?: ${iscontentsecuritypolicyenabled}`);

    const orgProperty = prop => `/api/data/v9.1/organizations(${organizationid})/${prop}`;

    if (!iscontentsecuritypolicyenabled) {
        console.log('CSP is already disabled! Skipping update.')
        return;
    }

    console.log('Disabling CSP...')
    const cspEnableResponse = await fetch(orgProperty('iscontentsecuritypolicyenabled'), {
        method: 'PUT',
        headers: { 'Content-Type': 'application/json' },
        body: JSON.stringify({
            value: false,
        }),
    });

    if (!cspEnableResponse.ok) {
        throw new Error('Failed to disable csp');
    }
    console.log('Successfully disabled CSP!')
}

Pastaba

Ar galite mums pranešti apie dokumentacijos kalbos nuostatas? Atlikite trumpą apklausą. (atkreipkite dėmesį, kad ši apklausa yra anglų kalba)

Apklausą atliksite per maždaug septynias minutes. Asmeniniai duomenys nėra renkami (privatumo nuostatos).