Visualizzazione dei risultati da 1 a 8 su 8
  1. #1
    Utente di HTML.it
    Registrato dal
    Jun 2007
    Messaggi
    27

    AccessController e FilePermission

    Salve a tutti, sto sbattendo la testa sul controllo dei permessi tramite accesscontroller filepermission e il file java.policy, ho letto diversi articoli e ho modificato il file java.policy con il policytool di java. Controllo poi i permessi con queste righe di codice:

    FilePermission perm = new FilePermission("C:\\Users\Mirko\\Desktop\\ProvaCla ssLoader\\*", "write");
    AccessController.checkPermission(perm);

    ho notato che esistono 2 java.policy uno sta nel percorso jre di java l'altro nel percorso jdk, ma facendo diverse prove ho notato che solo le modifiche al policy della jre portano ad output diversi, modificando quello del jdk invece mi da sempre "accesscontrollerException access denied" (anche se su internet ho letto che fosse questo quello da modificare).
    Quindi una prima domanda è quale dei due file devo usare e perchè?

    Poi togliendo il permesso di write dal java.policy della jre e quindi con "access denied" per il write eseguendo le righe:

    FileOutputStream prova = new FileOutputStream("prova.txt");
    PrintStream scrivi = new PrintStream(prova);
    scrivi.print("bau");


    Crea il file e lo scrive, nonostante come detto prima il controllo dei permessi dicesse access denied.
    Mi sapreste chiarire questo dilemma?
    Vi ringrazio anticipatamente

  2. #2
    Utente di HTML.it L'avatar di Alex'87
    Registrato dal
    Aug 2001
    residenza
    Verona
    Messaggi
    5,802
    Tu da qualche parte dici alla jvm che lanci di usare il tuo file di policy? Perché se non dici nulla va a usare quello di sistema...
    SpringSource Certified Spring Professional | Pivotal Certified Enterprise Integration Specialist
    Di questo libro e degli altri (blog personale di recensioni libri) | ​NO M.P. TECNICI

  3. #3
    Utente di HTML.it
    Registrato dal
    Jun 2007
    Messaggi
    27
    Quote Originariamente inviata da Alex'87 Visualizza il messaggio
    Tu da qualche parte dici alla jvm che lanci di usare il tuo file di policy? Perché se non dici nulla va a usare quello di sistema...
    Ciao Alex grazie per l'interessamento! Allora, io non ho specificato nulla, infatti come tu ben dici usa quello di sistema che io penso sia quello nel percorso "C:\Program Files\Java\jre7\lib\security" (che infatti modificando mi consente di avere output diversi in termini di accesscontrollerException). In caso come faccio a stabilire io quale java.policy utilizzare? (Nelle impostazioni di progetto cercando con parola chiave "policy" non mi da nessun risultato).

    Poi per la mia seconda domanda, ammesso che sia quello corretto il file di policy da modificare, perchè quando vado a scrivere su file l'operazione riesce nonostante l'AccessController mi da "access denied" in scrittura?

  4. #4
    Utente di HTML.it L'avatar di Alex'87
    Registrato dal
    Aug 2001
    residenza
    Verona
    Messaggi
    5,802
    Per usare uno specifico file di policy devi indicarlo all'avvio della JVM.

    Ad esempio, se tu lanci il tuo programma con

    java com.pippo.ClasseConMain

    dovrai fare
    java -Djava.security.policy=/custom/path/to/file/myfile.policy com.pippo.ClasseConMain

    Per l'altro problema, posta il tuo file di policy che vediamo cosa c'è ^^
    SpringSource Certified Spring Professional | Pivotal Certified Enterprise Integration Specialist
    Di questo libro e degli altri (blog personale di recensioni libri) | ​NO M.P. TECNICI

  5. #5
    Utente di HTML.it
    Registrato dal
    Jun 2007
    Messaggi
    27
    Quote Originariamente inviata da Alex'87 Visualizza il messaggio
    Per usare uno specifico file di policy devi indicarlo all'avvio della JVM.

    Ad esempio, se tu lanci il tuo programma con

    java com.pippo.ClasseConMain

    dovrai fare
    java -Djava.security.policy=/custom/path/to/file/myfile.policy com.pippo.ClasseConMain

    Per l'altro problema, posta il tuo file di policy che vediamo cosa c'è ^^
    Quello in caso compilassi a riga di comando, io sto utilizzando eclipse quindi fa tutto luI, dove dovrei inserire il riferimento al file di policy?

    Comunque il file di policy è questo: (è il contenuto standard)

    /* AUTOMATICALLY GENERATED ON Sat Feb 08 12:04:48 CET 2014*/
    /* DO NOT EDIT */


    grant codeBase "file:/C:/Program%20Files/Java/jre7/lib/ext/*" {
    permission java.security.AllPermission;
    };


    grant codeBase "file:/C:/Windows/Sun/Java/lib/ext/*" {
    permission java.security.AllPermission;
    };


    grant {
    permission java.lang.RuntimePermission "stopThread";
    permission java.net.SocketPermission "localhost:0", "listen";
    permission java.net.SocketPermission "localhost:1099", "listen";
    permission java.util.PropertyPermission "java.version", "read";
    permission java.util.PropertyPermission "java.vendor", "read";
    permission java.util.PropertyPermission "java.vendor.url", "read";
    permission java.util.PropertyPermission "java.class.version", "read";
    permission java.util.PropertyPermission "os.name", "read";
    permission java.util.PropertyPermission "os.version", "read";
    permission java.util.PropertyPermission "os.arch", "read";
    permission java.util.PropertyPermission "file.separator", "read";
    permission java.util.PropertyPermission "path.separator", "read";
    permission java.util.PropertyPermission "line.separator", "read";
    permission java.util.PropertyPermission "java.specification.version", "read";
    permission java.util.PropertyPermission "java.specification.vendor", "read";
    permission java.util.PropertyPermission "java.specification.name", "read";
    permission java.util.PropertyPermission "java.vm.specification.version", "read";
    permission java.util.PropertyPermission "java.vm.specification.vendor", "read";
    permission java.util.PropertyPermission "java.vm.specification.name", "read";
    permission java.util.PropertyPermission "java.vm.version", "read";
    permission java.util.PropertyPermission "java.vm.vendor", "read";
    permission java.util.PropertyPermission "java.vm.name", "read";
    };



    Con questo file di policy FilePermission/AccessController mi danno "access denied" per esempio per la scrittura su file, però in realtà con il codice che ho scritto prima (FileOutputStream) riesce a scrivere su file.

    Aggiungendo questa grant


    grant codeBase "file:/C:/Users/Mirko/Desktop/ProvaClassLoader/bin/" {
    permission java.io.FilePermission "<<ALL FILES>>", "write";
    };

    il FilePermission/AccessController non mi da più access denied per write e riesce a scrivere su file.

    Il problema è nel primo caso, dove non c'è questa grant ed anche dando access denied riesce a scrivere su file.

  6. #6
    Utente di HTML.it
    Registrato dal
    Jun 2007
    Messaggi
    27
    Alex, ho risolto con un'esacamotage:

    try{
    FilePermission perm = new FilePermission("C:\\Users\\Mirko\\Desktop\\ProvaCl assLoader\\*", "write");
    AccessController.checkPermission(perm);


    FileOutputStream prova = new FileOutputStream("prova.txt");
    PrintStream scrivi = new PrintStream(prova);
    scrivi.print("cazz");
    System.out.print("File scritto");


    } catch (Exception e ) {
    System.out.println("Permesso vietato");
    }

    Ovvero ho inserito l'accessController nello stesso blocco dell'operazione di write, adesso se tolgo il permesso di write dal policy mi lancia l'exception e tutto va regolarmente. E' possibile che il file di policy e controllo di permessi vada eseguito in questo modo? Se metto le istruzioni di write all'esterno del blocco di controllo l'operazione viene eseguita normalmente anche se nel file policy è negata...

    P.S. questo meccanismo secondo me (per logica) non è corretto, poichè i metodi devono premettere prima delle loro azioni il controllo dell'accesso, ovvero si devono auto-controllare!! Invece da ignaro, penso che il controllo delle azioni debba essere fatto in automatico al tentativo di esecuzione dell'azione da parte di una determinata classe, possibilmente anche scaricata dalla rete, di cui magari non conosciamo il contenuto e non sappiamo se le varie azioni vengano precedute da un controllo esplicito da parte dell'AccessController.
    Ultima modifica di MRK89; 10-02-2014 a 11:15

  7. #7
    Utente di HTML.it
    Registrato dal
    Jun 2007
    Messaggi
    27
    Nessuno saprebbe spiegarmi come funziona l'associazione tra le classi e il policy file, e se il controllo della politica deve essere scritto nel codice tramite l'accesscontroller oppure viene eseguito automaticamente a runtime dal sistema?!?

  8. #8
    Utente di HTML.it
    Registrato dal
    Jun 2007
    Messaggi
    27
    Aggiornamento:
    ho messo la stringa "-Djava.security.manager -Djava.security.policy=myjava.policy" come argomento da passare alla VM nella fase di RUN, e così le politiche funzionano a runtime come pensavo dovesse essere, senza dover andare esplicitamente a fare un controllo con l'AccessController.
    Ma a questo punto una domanda mi sorge spontanea... una generica applicazione java proveniente dall'esterno non è soggetta a nessun controllo di politica?!? (se io per le mie applicazioni specifico esplicitamente che deve applicare security manager)
    O meglio, dov'è settato il controllo del security nella JVM per una qualsiasi applicazione?!? E' impensabile che non ci sia un controllo del genere!

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.