Sicherheitsrichtlinie für Inhalte

Inhaltssicherheitsrichtlinie (CSP) wird derzeit in modellgesteuerten Power Apps über zwei Organisationsentitätsattribute unterstützt, die steuern, ob der CSP-Header gesendet wird, und gewissermaßen, was er enthält. Diese Einstellung befindet sich auf Umgebungsebene, d.h. sie wird auf alle Apps in der Umgebung angewendet, sobald sie aktiviert ist.

Hinweis

Die CSP wird aktuell nur in modellgesteuerten Apps unterstützt. Die Unterstützung von Canvas-Apps steht auf der Roadmap und wird bis Juni 2022 aktiviert.

  • IsContentSecurityPolicyEnabled steuert, ob der Inhaltssicherheitsrichtlinien-Header auf der Basis-App-Seite (main.aspx) gesendet wird. Der Header ist standardmäßig festgelegt auf script-src * 'unsafe-inline' 'unsafe-eval'; worker-src 'self' blob:; style-src * 'unsafe-inline'; font-src * data:; frame-ancestors 'self';. Jede Komponente dieses Header-Werts steuert die Objekte, die heruntergeladen werden können, und wird im Mozilla Developer Network (MDN) ausführlicher beschrieben:
  • ContentSecurityPolicyConfiguration steuert den Wert des frame-ancestors-Teils (wie oben zu sehen, wird er auf „self“ gesetzt, wenn ContentSecurityPolicyConfiguration nicht gesetzt ist). Diese Einstellung wird durch ein JSON-Objekt mit der folgenden Struktur dargestellt – { "Frame-Ancestor": { "sources": [ { "source": "foo" }, { "source": "bar" } ] } }. Dies würde übersetzt werden in script-src * 'unsafe-inline' 'unsafe-eval'; worker-src 'self' blob:; style-src * 'unsafe-inline'; font-src * data:; frame-ancestors 'foo' 'bar';
    • (Von MDN) Die frame-ancestors-Direktive von HTTP Content-Security-Policy (CSP) gibt gültige übergeordnete Elemente an, die eine Seite mit <frame>, <iframe>, <object>, <embed> oder <applet> einbetten können.

CSP konfigurieren

Derzeit gibt es keine Benutzeroberfläche zum Bearbeiten dieser Attribute, aber wir planen, diese im Power Platform Admin Center in der Zukunft verfügbar zu machen. In der Zwischenzeit können Sie das folgende Skript verwenden, um das frame-ancestors-Attribut zu aktivieren und zu aktualisieren. Es ist wichtig, zuerst in einer Entwicklungs-/Testumgebung zu aktivieren, da die Aktivierung dieser Funktion das Herunterladen von Objekten blockieren könnte, wenn gegen die Richtlinie verstoßen wird. Wir planen, in Zukunft einen „Nur-Bericht-Modus“ zu unterstützen, um einen einfacheren Produktionsstart zu ermöglichen.

Aktivieren von CSP

Schritte:

  • Öffnen Sie Browser-Entwicklertools, während Sie die modellgesteuerte App als Benutzer mit Aktualisierungsberechtigungen für Organisationsentitäten verwenden (Systemadministrator ist eine gute Option).
  • Fügen Sie das folgende Skript in die Konsole ein, und führen Sie es aus.
  • Um CSP einfach zu aktivieren, übergeben Sie die Standardkonfiguration – enableFrameAncestors(["'self'"])
  • Als Beispiel für die Aktivierung zusätzlicher Ursprünge zum Einbetten der App – 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!')
}

Deaktivieren von CSP

Schritte:

  • Öffnen Sie Browser-Entwicklertools, während Sie die modellgesteuerte App als Benutzer mit Aktualisierungsberechtigungen für Organisationsentitäten verwenden (Systemadministrator ist eine gute Option).
  • Fügen Sie das folgende Skript in die Konsole ein, und führen Sie es aus.
  • Um CSP zu deaktivieren, fügen Sie in die Konsole ein: 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!')
}

Hinweis

Können Sie uns Ihre Präferenzen für die Dokumentationssprache mitteilen? Nehmen Sie an einer kurzen Umfrage teil. (Beachten Sie, dass diese Umfrage auf Englisch ist.)

Die Umfrage dauert etwa sieben Minuten. Es werden keine personenbezogenen Daten erhoben. (Datenschutzbestimmungen).