CKFinder e ASPNET: come proteggere i contenuti da link diretti sulle risorse statiche

22 settembre 2010 patapum Nessun commento

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;
}
Share

BUG Sql2005: via le parentesi nei vincoli Check

12 luglio 2010 MarcoB Nessun commento

Se si tenta di creare o modificare un vincolo CHECK utilizzando Microsoft Sql Server Management Studio 2005 attenzione alle parentesi!

Lo strumento visuale elimina tutte le parentesi dell’espressione booleana, lasciando solo quelle esterne. Nessun problema per espressioni semplici, ma nel caso di logica più complessa o di alterazione della precedenza degli operatori sono guai. Ad esempio l’espressione:

(A AND B) OR (C AND D)
[Vero se A e B sono veri oppure se C e D sono veri]

verrebbe trasformata in

(A AND B OR C AND D)
[Vero se A è vero oppure se B o C sono veri o se D è vero]

con conseguente disastro.

In tal caso si risolve utilizzando la creazione del vincolo tramite script, come ad esempio:

ALTER TABLE [NomeTabella] WITH CHECK
ADD CONSTRAINT [CK_NomeVincolo] CHECK  ((A AND B) OR (C AND D))

Approfondendo ulteriormente si osserva che la colpa del bug non sembra tanto dello strumento visuale, quanto dello strumento che legge la definizione del vincolo dal database. Se si seleziona il vincolo nell’esploratore oggetti e si lancia il comando “Crea script per vincolo…” si ottiene uno script con lo stesso problema: parentesi scomparse!

Share

Report con MS Reporting Services facilmente adattabili a clienti diversi

8 luglio 2010 MarcoB Nessun commento

Scenario: stiamo lavorando ad un’applicazione .NET che verrà installata presso numerosi clienti e dobbiamo dotarla di stampe e reportistica che abbiano una struttura comune e aggiornabile, uguale per tutti i clienti. Allo stesso tempo ogni report dovrà essere facilmente personalizzato con colori, testi e loghi per adattarlo ad uno specifico cliente. Quando rilasceremo una nuova versione di tale report non vorremo perdere le personalizzazioni.

Utilizzo un progetto Visual Studio di Business Intelligence per i report (estensione rptproj), con le definizioni dei report nei file rdl.

Una tecnica semplice consiste nel portare all’esterno del report ogni elemento da modificare: un’immagine, un testo con il nome del cliente, ma anche un valore booleano con il quale possiamo dire al motore di rendering del report che un elemento deve essere nascosto o apparire. In pratica si può passare al report qualsiasi valore che possa entrare in un’espressione di Reporting Services.

Per passare tali valori differentemente da un’istallazione ad un’altra ho utilizzato una stored procedure che potremmo chiamare “Impostazioni”, con all’interno una select semplice, come la seguente:

SELECT 'Puntoit Servizi Informatici' as Nome, --nome del cliente
 'Via Stefanardo da Vimercate 19, 20128 Milano' As Indirizzo,
 '#1c3a70' as Colore1, --per titolo e elementi evidenziati
 'DarkGray' as Colore2, --per nome e indirizzo e ulteriori elementi evidenziati
 CAST(1 as bit) as Logo --1 visualizza, 0 nasconde il logo in alto a dx

Si crea un set di dati nel report che vada a leggerla, impiegando i campi in espressioni del report. Come si vede, non solo testo, ma anche colori e bit per visualizzare o meno il logo.

Per le immagini, ad esempio il logo, il lavoro è leggermente diverso. Si posiziona nel report un controllo immagine che punta ad un’immagine esterna con proporzioni definite, ad es. 3 di larghezza x 1 di altezza, con un nome fisso (“logo3x1.jpg”). Si crea un’immagine con un logo neutro, salvandola nella cartella del progetto Visual Studio dove risiede anche il file di definizione del report rdl.

L’ultima nota riguarda i colori. Anch’essi li ho personalizzati passandoli tramite la stored procedure.

E ora mettiamo tutto insieme. Una volta pubblicato il report si dovrà creare o modificare la stored procedure che genera i dati parametrizzati ed eventualmente sostituire l’immagine generica “logo3x1.jpg” con una con lo stesso nome contenente il logo del cliente. Il gioco è fatto. Se domani pubblicheremo una nuova definizione del report, con ad esempio una colonna in più in una tabella, lo potremmo fare per tutti i clienti, che vedranno la colonna in più e manterranno logo, colori, e testi personalizzati.

Ma attenzione ad un fastidioso limite del motore di rendering. Non è possibile inserire dati provenienti dall’esterno nella testata e nel piede del report. Se devono essere messi lì la cosa più semplice è creare parametri nella definizione del report e passarli tramite la query string che lancia il rendering.

Share

KooBoo CMS, promette davvero bene!

3 giugno 2010 MarcoB Nessun commento

Mi sono imbattuto recentemente in un nuovo CMS scritto in ASP.NET che promette davvero bene: il suo nome è KooBoo.

E’ relativamente giovane, un progetto nato nel 2008 e per questo ancora acerbo su alcuni aspetti, ma con un’architettura di prim’ordine! Utilizza il pattern MVC sfruttando le funzionalità introdotte con Microsoft .NET Framework 3.5 SP1 e lo fa davvero bene. Così almeno sembra.

L’ho installato in 15 minuti e ho iniziato subito a muovermi nella sua interfaccia di amministrazione, abbastanza intuitiva e soprattutto densa di funzioni.

Per chi è curioso segnalo il sito del progetto (per altro con licenza AGPL) ed il sito su codeplex.

Se qualcuno lo ha già utilizzato non esiti a contattarmi.

Share
Categorie:cms Tag: , ,

Spostare (o migrare) l’intero blog di Splinder

19 maggio 2010 MarcoB 2 commenti

Nel post precedente ho spiegato come ottenere la lista dei post di un blog su Splinder, magari in Excel. Da questa lista ho ottenuto l’elenco dei codici dei post. Ognuno ha un codice univoco che viene utilizzato nell’URL per visualizzare il singolo post, del tipo http://<nomeblog>.splinder.com/post/123456789.

Utilizzando tale URL ho scritto un programmino in C# che, dato un elenco di codici dei post, chiamasse la pagina relativa e ne catturasse la parte “interessante”, cioè post e commenti, scartando testata, spalle e piede della pagina. Ho anche inserito un temporizzatore tra una chiamata e l’altra, per non causare una raffica di chiamate a Splinder che potessero essere interpretate come DOS.

Ottenuta la porzione di HTML contenente il post l’ho elaborata con una raffica di sostituzioni utilizzando le espressioni regolari per ottenere un file XML pulito contenente l’intero blog. Questa è la parte più impegnativa, perché togliere o sostituire i tag HTML senza corrompere i dati è un’operazione da condurre con molta cautela.

Sono a caccia di idee per migliorare questa fase di pulizia.

Il prossimo passaggio sarà l’importazione verso Blogger. Ma questa si preannuncia una strada in discesa, con le API di Google e la loro documentazione.

Share

Esportare la lista dei post da Splinder

7 maggio 2010 MarcoB Nessun commento

Splinder non brilla per le funzioni che espone ai gestori dei suoi blog.

Di recente mi è capitato di dover esportare l’elenco dei post per analizzare quali avessero il maggior numero di commenti.

Sono riuscito a portarli in excel in questo modo. Mi sono loggato, sono andato nella sezione Blog / Organizza / Post, dove appare un elenco dei post, massimo 20 alla volta. Se il blog contiene più di n post, dove n è il numero di post da visualizzare, appare in fondo alla lista il selettore per cambiare pagina. Passandoci sopra con il mouse, pulsante destro in Firefox, si copia l’indirizzo e lo si incolla in una nuova scheda del browser (ad es. http://www.splinder.com/myblog/edit/manage/<numero>/5?&limit=5). Sostituendo “5?&limit=5″ con “0?&limit=x”, dove x è il numero totale dei post del blog, si ottiene un elenco totale dei post.

Se poi questo url modificato lo si copia nello strumento query web di Excel e si sceglie di importare la sola tabella contenente l’elenco dei post si ottiene in Excel l’elenco dei nostri post, con autore, data, titolo (troncato), incipit e numero di commenti.

Per ora è tutto, ma presto dovrò occuparmi di esportare da Splinder l’intero contentuto di un blog. Ne riparleremo.

Share