CKFinder e ASPNET: come proteggere i contenuti da link diretti sulle risorse statiche
Scenario:
un’applicazione ASPNET è ospitata da IIS 6. Stiamo utilizzando il file manager CKFinder (http://ckfinder.com/) in una pagina ad accesso riservato.
In base all’utente collegato CKFinder mostra alcune cartelle e ne nasconde altre. Le cartelle sono delle cartelle fisiche sul server (diciamo che abbiano un percorso “<ROOT Applicazione>/ckfinderFolders/”) e contengono dei contenuti statici (file di immagini, documenti pdf/word/excel etc.).
La cartella radice che contiene queste risorse (nell’esempio è “~/ckfinderFolders/”) è stata opportunamente resa inaccessibile a chiunque tramite il provider di autorizzazioni di aspnet, con il seguente codice nel web.config:
<location path="ckfinderFolders" allowOverride="false"> <system.web> <authorization> <deny users="*" /> <deny users="?" /> </authorization> </system.web> </location>
Problema:
CKFinder espone nel menu contestuale dei file, la funzione “Vedi”, che per default apre una finestra del browser all’indirizzo della risorsa (per esempio il file jpg di un’immagine).
Se questo indirizzo viene immesso direttamente nel browser, il file viene raggiunto anche senza aver eseguito l’autenticazione, questo perché le risorse statiche non vengono gestite dal processo aspnet (aspnet_isapi), ma da IIS, che non controlla l’autenticazione.
Il nostro obiettivo è:
1. proteggere le risorse statiche in ckfinderFolders (e sue sottocartelle) con l’autenticazione di aspnet;
2. disabilitare la voce “Vedi” nel menu contestuale di CKFinder.
1. Proteggere le risorse statiche in IIS con l’autenticazione di aspnet
Per il punto 1 la soluzione è quella di configurare l’applicazione in IIS 6 in modo che ogni richiesta sia vagliata da aspnet_isapi (e dunque dal suo modulo di autorizzazione). Questo si ottiene sfruttando una impostazione di IIS 6 che riguarda il wildcard application maps.
Nella console di amministrazione di IIS, nella maschera delle proprietà della directory virtuale del sito (tasto destro sul nodo del sito, voce “proprietà”), nella scheda “virtual directory” aprire la finestra di configurazione; qui nella parte bassa della scheda “mappings” si trova un’area con i “wildcard application maps”. Per raggiungere il nostro obiettivo bisognerà creare una nuova mappatura, indicando ad IIS di far gestire ogni richiesta ad aspnet_isapi. Con un click sul pulsante “insert…” si apre una nuova finestra, in cui andrà inserito il percorso ad aspnet_isapi (lo si può trovare facilmente guardando nella parte alta della maschera precedente la voce “executable path” corrispondente alla “extension” .aspx).
NOTA BENE: bisogna assolutamente togliere la spunta “verify that file exists”, in caso contrario alcune risorse necessarie al funzionamento delle pagine aspx non verranno mai inviate ai client, rendendo le pagine inutilizzabili.
A questo punto il problema di protezione dei contenuti statici è risolto (se richiede un’immagine in un percorso sottoposto ad autenticazione, aspnet risponde con il modulo di login e la risorsa risulta effettivamente irraggiungibile), ma ci resta un problema di usabilità dell’applicazione. Infatti il nostro utente che guarda CKFinder, continua a vedere nel contextMenu dei file, la voce “Vedi”, che lo porta inesorabilmente a una finestra del browser che gli chiede una nuova autenticazione (comunque impossibile, visto che nessun utente può mai accedere al percorso richiesto!).
Il nostro desiderio è disabilitare la voce del menu contestuale, in modo che l’utente non sia più tratto in inganno.
2. Disabilitare le voci del menu contestuale di CKFinder
Ho scartabellato a lungo: documentazione di CKFinder (lato aspnet e javascript), google in tutte le salse. Ho anche analizzato (abbastanza) a lungo il codice di CKFinder, senza purtroppo trovare risposta alla questione.
Alla fine ho trovato il post Circumventing ACL: “View” context menu item unsafe sul forum di CKFinder dove l’utente piqueweb proponeva la discussione del mio identico problema (risolto fino a un certo punto esattamente come ho appena finito di raccontare).
Ma la questione di come disabilitare la voce di menu “Vedi” non trova risposta neanche lì… pare non sia previsto nella versione corrente del software.
…ma una soluzione lato UI è invece a portata di mano, per fortuna.
Chi fosse curioso verifichi per esempio con FireBug per FireFox: le voci del menu contestuale di CKFinder sono degli <span> di classe “cke_menuitem” in un <iframe> annidato in un <div> invisibile (creato da codice js quando si fa click destro su un file la prima volta).
Il <div> di cui sopra è l’ultimo tag prima della chiusura del <body> più interno nell’<iframe> di CKFinder.
Le voci di menu contengono degli <a> che a seconda dell’item hanno una classe specifica. Il view file ha la classe cke_button_viewFile.
Bè, la soluzione è lì. Basta aggiungere questa regola di stile al file uipanel.css (nella cartella con l’installazione di ckfinder si trova in skins/kama/ o in generale skins/<nome_skin>/):
.cke_button_viewFile{
visibility:hidden;
position:absolute;
}
