2015-06-25 15 views
5

Non so nemmeno se è quello di cui ho bisogno, ma dopo diversi giorni di questo MSDN Forum post senza risposte ho pensato di dare una possibilità in SO.Come impostare la politica di sicurezza del contenuto in Windows Applicazioni universali

Il mio problema: Ho apps molte finestre 8.1 e Windows Phone 8.1 HTML/Javascript che hanno un po '<script> frase nella <head> di ogni pagina html. Ho iniziato a migrare le mie applicazioni a Windows 10 come una singola applicazione universale di Windows ma ottengo il seguente errore:

CSP14312: Resource violated directive 'script-src ms-appx: data: 'unsafe-eval'' in Host Defined Policy: inline script. Resource will be blocked 

e, naturalmente, nulla viene eseguito ... mi sto perdendo qualcosa?

edit: a Repro basta creare un'applicazione vuota di Windows universale con VS2015 RC e aggiungere

<script> 
    console.log('hello'); 
</script> 

a destra prima del tag head chiude

+0

È possibile fornire una riproduzione minima? Questo dovrebbe funzionare in generale. –

+0

qualcuno può spiegare perché il voto negativo? – sebagomez

risposta

3

Rob ha ragione, per impostazione predefinita non può avere lo script inline in ms-appx: /// protocollo. Questo è il protocollo predefinito per un'applicazione e ha un criterio CSP predefinito che non consente lo script inline.

Se si desidera realmente utilizzare lo script inline, è possibile navigare al contenuto tramite il protocollo ms-appx-web: /// in cui non esiste un criterio CSP predefinito.

L'unica nota è che non si ha accesso ad alcune funzionalità in questo protocollo.

L'unica differenza che ho di là di ciò che ha detto Rob è che molto probabilmente si desidera impostare l'applicazione Content URI Regola (ACUR) come questo

<uap:ApplicationContentUriRules> 
    <uap:Rule Type="include" Match ="ms-appx-web:///" WindowsRuntimeAccess="all"/> 
</uap:ApplicationContentUriRules> 

Per navigare al suo sito web è possibile impostare lo StartPage nel manifest a ms-appx-web: ///default.html

+0

Non è esattamente quello che Rob ha suggerito? Un paio di domande, 1) questo è nuovo di zecca per Win10 giusto? lo scripting inline era OK in Win8.1 2) aggiungendo ciò che hai suggerito di non poter accedere a 'Windows.Storage.ApplicationData.current' è quello previsto? – sebagomez

+0

Mi dispiace, ho aggiornato il mio esempio. È necessario aggiungere WindowsRuntimeAccess = "all" –

+1

Per Windows 8 si è in grado di utilizzare lo script inline, ma non è stato possibile modificare facilmente innerHTML o aggiungere in modo dinamico alcuni tipi di attributi. Abbiamo sentito in modo schiacciante che questo era un problema. Così abbiamo eliminato il precedente modello di sicurezza di SafeHTML e siamo andati con lo standard W3C di CSP. Per il contenuto locale l'unica restrizione non è uno script inline. Abbiamo creato un [modulo NPM] (https://www.npmjs.com/package/noin) che ti aiuterà a rimuovere lo script inline se non vuoi farlo da solo. Oppure puoi semplicemente utilizzare il protocollo web di ms-apps-web: /// –

3

Suppongo che non è il tuo caso d'uso reale, ma nel complesso dipende dallo script specifico se funzionerà nel contesto locale o web. Vedi Features and restrictions by context per una panoramica. Se riesci a inserire lo script in un file JS locale invece di chiamarlo da capo, ti consiglio invece di manipolare i contesti di sicurezza dell'app.

L'esempio console.log funziona se viene eseguito dal pacchetto (come si nota) o se viene eseguito nel contesto Web. Puoi forzare l'esecuzione dell'intera app nel contesto Web modificando la pagina iniziale su ms-appx-web: ///default.html nel manifest.

Tuttavia, poiché l'app è ora nel contesto Web limitato, non avrà accesso a tutto il Runtime di Windows. È possibile aprire che fino aggiungendo quanto segue alla sezione Applicazione nel vostro manifesto:

<uap:ApplicationContentUriRules> 
    <uap:Rule Type="include" Match ="ms-appx-web:///" WindowsRuntimeAccess="allowForWebOnly"/> 
</uap:ApplicationContentUriRules> 

avrete bisogno di aprire il manifesto in un editor di codice, piuttosto che nell'editor manifesta per modificare questa sezione.

Per ulteriori sull'errore di vedere il bordo Console error and status codes documentazione

+0

Ho aggiunto quello che hai suggerito e ha funzionato ma non riesco ad accedere a Windows Runtime :( – sebagomez

1

Sei riuscito a risolvere questo problema?Realizzo app e giochi utilizzando il framework Enyo e ho riscontrato lo stesso problema. Sono stato in grado di risolvere inserendo le linee che ho normale immissione sul tag sul file default.js su questa sezione:

 if (args.detail.previousExecutionState !== activation.ApplicationExecutionState.terminated) { 
      // TODO: This application has been newly launched. Initialize your application here. 
      initializemyapp(); 
      console.log("starting"); 
     } else { 
      // TODO: This application was suspended and then terminated. 
      // To create a smooth user experience, restore application state here so that it looks like the app never stopped running. 
     } 

forse è un po 'tardi, ma spero che questo aiuta.

+0

L'ho risolto risolvendo esattamente quello che hai fatto ... Ho aggiunto il mio script all'interno di un file js e ho appena aggiunto un riferimento a quel file dall'html – sebagomez

Problemi correlati