Politică de securitate a conținutului
Politica de securitate a conținutului (CSP) este suportat în prezent în model-driven Power Apps prin două atribute de entitate organizațională care controlează dacă antetul CSP este trimis și, într-o anumită măsură, ce conține. Această setare este la nivel de mediu, ceea ce înseamnă că va fi aplicată tuturor aplicațiilor din mediu odată pornită.
Notă
CSP este în prezent acceptat numai în aplicațiile bazate pe model. Asistența pentru aplicația Canvas va ajunge la previzualizarea publică în vara 2022.
- IsContentSecurityPolicyEnabled controlează dacă antetul Content-Security-Policy este trimis în pagina aplicației de bază (main.aspx). În mod implicit, antetul este setat la
script-src * 'unsafe-inline' 'unsafe-eval'; worker-src 'self' blob:; style-src * 'unsafe-inline'; font-src * data:; frame-ancestors 'self';. Fiecare componentă a acestei valori de antet controlează activele care pot fi descărcate și este descrisă mai detaliat în Mozilla Developer Network (MDN): - ContentSecurityPolicyConfiguration controlează valoarea porțiunii de strămoși cadru (după cum s-a văzut mai sus, este setat la „self” dacă ContentSecurityPolicyConfiguration nu este setat). Această setare este reprezentată de un obiect JSON cu următoarea structură -
{ "Frame-Ancestor": { "sources": [ { "source": "foo" }, { "source": "bar" } ] } }. Acest lucru s-ar traduce înscript-src * 'unsafe-inline' 'unsafe-eval'; worker-src 'self' blob:; style-src * 'unsafe-inline'; font-src * data:; frame-ancestors 'foo' 'bar';- (De la MDN) Directiva HTTP Content-Security-Policy (CSP) cadru-strămoși specifică părinții validi care pot încorpora o pagină folosind
<frame>,<iframe>,<object>,<embed>, sau<applet>.
- (De la MDN) Directiva HTTP Content-Security-Policy (CSP) cadru-strămoși specifică părinții validi care pot încorpora o pagină folosind
Configurarea CSP
În prezent, nu există nicio interfață de utilizare pentru editarea acestor atribute, dar intenționăm să le expunem în Power Platform centru de administrare în viitor. Între timp, puteți folosi scriptul de mai jos pentru a activa și actualiza atributul frame-ancestors. Este important să activați mai întâi într-un mediu de dezvoltare/testare deoarece activarea acestui lucru ar putea începe să blocheze descărcarea activelor dacă politica este încălcată. Intenționăm să sprijinim un „mod doar de raportare” în viitor, pentru a permite o accelerare mai ușoară a producției.
Activarea CSP
Pași:
- Deschideți instrumentele de dezvoltare a browserului în timp ce utilizați aplicația bazată pe model ca utilizator cu privilegii de actualizare a entității organizației (Administratorul de sistem este o opțiune bună).
- Lipiți și executați scriptul de mai jos în consolă.
- Pentru a activa pur și simplu CSP, treceți configurația implicită -
enableFrameAncestors(["'self'"]) - Ca exemplu de activare a originilor suplimentare pentru a încorpora aplicația -
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!')
}
Se dezactivează CSP
Pași:
- Deschideți instrumentele de dezvoltare a browserului în timp ce utilizați aplicația bazată pe model ca utilizator cu privilegii de actualizare a entității organizației (Administratorul de sistem este o opțiune bună).
- Lipiți și executați scriptul de mai jos în consolă.
- Pentru a dezactiva CSP, inserați în consolă:
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!')
}
Notă
Ne puteți spune care preferințele dvs. lingvistice pentru documentație? Răspundeți la un chestionar scurt. (rețineți că acest chestionar este în limba engleză)
Chestionarul va dura aproximativ șapte minute. Nu sunt colectate date personale (angajament de respectare a confidențialității).
Feedback
Trimiteți și vizualizați feedback pentru