[Weekly Issue] Rimuovere i commenti da SubText

Tornato dalle vacanze, mi sono trovato una spiacevole sorpresa. Non so come, non so quando, non so nemmeno perchè, ma mi sono trovato qualcosa come 4000 ping/trackback di spam. 

Ancora non so se la risposta sia disabilitare totalmente ping/trackback o abilitare la moderazione (cosa che tra parentesi nemmeno so se funziona per i trackback), ma la cosa piu urgente da fare ora come ora è eliminare queste quintalate di feedback non desiderati.

Una rapida scorsa all'interfaccia amministrativa di SubText mi fa capire che volendoli cancellare uno per uno (a pagina, 10 alla volta) con tanto di mille mila messaggi di conferma, sarei diventato vecchio in fretta. Do anche una guardata alle metablog api, ma noto che non ci sono metodi che mi permettono di cancellare i feedback. Ho anche cercato in giro post o accrocchi che ne parlassero, ma non ne ho trovato (possibile che sia stato l'unico ad avere questo problema?? :P) Se ci sono, me li sono persi, nel caso fatemelo sapere per favore :)

Comunque, ho messo in atto la Soluzione Estrema, cioè ho buttato via un paio d'ore a costruire una windows form che servisse allo scopo.
Probabilmente è la soluzione più stupida del mondo, e non discuto che ce ne siano miliardi di altre, ma guardando come funziona il motore e cercando in giro non ho trovato spunti migliori. Se qualcuno ce li ha, me lo faccia sapere che posso pensare di tenerlo come referenza futura:)

La mia ricetta è stata:

- Un componente web browser
- Una regexp che controlli l'html
- Una discreta conoscenza degli oggetti mshtml.* (che, l'ho probabilmente già detto e lo ripeto, sono scritti col c**o)

Non sapendo ovviamente nulla di nessuno dei tre punti, quello che è venuto fuori è una ciofeca (:P) ma piu o meno fa il suo lavoro.

Blog cleaner in action

Praticamente, funziona così:

- Si digita l'indirizzo della pagina che si vuole ripulire e si schissa "GO" (l'ho fatto per pagina perchè ho notato che il 99% dei feedback erano concentrati su una decina di post, probabilmente quelli meglio indicizzati in google)
- Ci si ricorda di fare login nella pagina amministrativa, altrimenti non viene fuori il link per rimuovere il commento
- Una volta fatto login, si rischiaccia "go" e si refresha la pagina per evitare la cache (tasto destro/refresh, altrimenti molte volte il webbrowser non si refresha bene)
- Una volta che si vedono tutti i millemila commenti con il remove comment, si schissa il pulsantone "Check feedbacks to purge". Apparirà la finestra che si vede in immagine, con la lista di tutti i commentii.
- Schiacciando "cancel" si torna indietro. Schiacciano "purge unchecked feedback", si cancellano TUTTI i feedback TRANNE quelli selezionati. Quindi attenzione di ricordarsi di selezionare i feedback che si vuole mantenere.

A questo punto il programma torna indietro e, con un pò di magia nera ed un sacco di porcate, si prende gli oggetti link che ha precedentemente salvato e simula tutti i "click" (è purtroppo l'unico modo che ho trovato). L'accrocchio è lento come la morte, perchè purtroppo non sono riuscito ad intercettare l'evento di loading alle fine del click (UpdatePanel e oggetto WebBrowser a quanto pare non quagliano molto), quindi ho fatto la solenne porcata di aspettare 3 secondi per ogni click. Ne consegue che ci metterà sempre 3 secondi a feedback, che in caso di 4000 link come me possono voler dire parecchie ore, ma almeno lo fa in background mentre io sto facendo altro :) Oltretutto ogni volta devo riparsare il documento pre ripopolare la collezione di link, perchè l'update panel cambia rimuovendo il link cancellato, ma l'oggetto webbrowser non se ne accorge (e non lancia nessun evento.. grrrrr) e quindi non posso utilizzare i link vecchi tenuti in memoria.

Il codice fa sicuramente schifo ed è quanto di piu lontano di quello che può essere scritto bene, ma serviva solo per questo particolare problema, ed ora sono felice possessore di un blog piu pulito. Se volete utilizzarlo perchè avete il mio stesso problema, ed utilizzate SubText, vi allego il codice. Tenete comunque conto di questi punti importantissimi:

1: è assolutamente pensato per lavorare sul MIO blog con la MIA skin. Visto l'utilizzo intenso di interazione con il DOM della pagina, non è ASSOLUTAMENTE assicurato che funzioni anche sul vostro. anzi, è quasi sicuro che si pianti :)
In particolare, io gioco con il parent del link "remove comment" per popolare la lista dei feedback in maniera corretta. Sulla mia skin precedente, il div giusto era SOTTO il link removecomment, quindi prendevo l'ultimo children del parent, mentre nella skin attuale (che già che c'ero ho cambiato, la vecchia aveva stufato!) il div corretto è il secondo, mentre il remove comment è l'ultimo!
2: è assolutamente fornito "AS-IS", e non mi prendo nessuna responsabilità nel caso vogliate usarlo/testarlo/whatever.
3: Che nessun mi venga a dire che questo-o-quello si poteva fare meglio/diversamente/whatever che me ne frega :D L'unica cosa che mi interessa è se c'era qualche modo più diretto per interagire con il blog e cancellare tutto senza dover per forza simulare tutti i click (e se c'è un modo per far capire all'oggetto WebBrowser che il caricamento di un UpdatePanel è finito!)
4: Chiaramente ci sono molti (tanti) problemi, il più noioso che ho trovato è che l'updatepanel "scazza" dopo qualche minuto di attività, probabilmente per una perdita di credenziali, ma non sempre. Quindi, ogni tanto lancerà fuori un errore di tipo Sys.Web.Timeout exception o qualcosa di simile. Si chiude, si riapre, e si ricomincia :P
5: Ricordatevi sempre di selezionare i feedback che si vogliono mantenere! E' pensato per un post riempito di trackback inutili, quindi l'azione di default che fa è rimuoverli tutti a meno che non li si selezioni!

Trovate il codice qui (stavolta lo allego altrimenti, com'era successo per la stored di pulizia dei campi da Sql Injection, me la chiedete in trentamila e poi finisce che a qualcuno non arriva).

Edi: come mi ha giustamente fatto notare simone, è subtext, non .text :D

2 Comments Filed Under [ Weekly Issues ]
[OT] Caldo, Onda Verde, Tangenziale, Fantasia....
Si, lo so, il titolo sempra preso dal primo libro delle Cronache di Narnia... ma ci andava di scriverlo così!

Attenzione: la storia seguente è puro frutto di fantasia. Non provate a replicare quanto scritto in questo post. Ogni riferimento a fatti realmente accaduti o persone realmente esistite è puramente causale. La grande somiglianza tra i luoghi ed i tempi raccontati e la vita reale dell'autore è un puro esercizio di stile dell'autore stesso.
One Comment Filed Under [ Off Topic ]
[Weekly Issue] L'inizio di una serie?

Sono ormai un paio di mesi che non riesco ad aggiornare i miei Daily Issue.

Il motivo è presto detto: il lavoro massacrante mi ha costretto e levarmi di peso da tutte le attività community, per evitare di soccombere. Ho preso decisamente troppi impegni per questa fine di anno, tra cui due libri (uno in pubblicazione, il secondo in gestazione.. lunga :P) e una serie di team da formare e far crescere... troppe responsabilità e orari sballati mi hanno portato a dover rinunciare a qualcosa. Assodato che non rinuncio alla palestra ne al minimo di vita sociale che mi rimane, la scelta è dovuta per forza di cose cadere sulla community.

Tornato dalle vacanze, ovviamente tempo di rinnovo e cambiamenti, le varie decisioni che ho pensato e ragionato lontano dalla tecnologia (prima vacanza in assoluto senza nessun tipo di connessione ad internet e cellulare lavorativo spento... due settimane totalmente sconnesso era un'esperienza che non assaporavo da tempo!) mi hanno portato a riconsiderare un pò i rapporti di forza e di impegno nei miei vari progetti.  Iniziando con un minore tempo lavorativo (11 ore al giorno ogni giorno, weekend inclusi, sono troppe, per chiunque) che mi libera giustamente delle ore per il resto, tra cui anche la community.

In soldoni, cercherò di tornare a scrivere dei miei problemi o, meglio, delle mie soluzioni, ma piu raramente: un impegno di ogni giorno è difficile da attendere e, come tante cose, quando si inizia a mancare una volta si tende a mancare un tot. Scrivere invece una/due volte a settimana, è una cosa piu gestibile, pianficabile, posso farla nel week end tranquillamente e mi porta ad essere piu sereno ... vedremo come andrà quest'avventura :) Nel frattempo, buon rientro e buon lavoro a tutti!

Add Comment Filed Under [ Weekly Issues ]
[Daily Issue] 1 2 3 stella...

Non è esattamente uno Issue.... però per me si!

Mi è arrivato il portatile nuovo... un XPS M1330 supercarrozzato che userò per gli spostamenti e/o tutte le occasioni in cui non posso e non voglio portarmi dietro il mio "mulo" (inteso come 17 pollici da 5kg, non come noto programma di file sharing :P).

Ieri contento come una pasqua ho aperto la confezione e questo è quello che mi sono trovato davanti

Tanto, chi voleva fare le virgolette?? :P

(Comunque la Dell si è offerta di rispedirmelo intero per venerdi. Io purtroppo non ci sono, ho rimandato a Lunedi. L'assistenza, per fortuna, sembra funzionare anche in casi sfigati come questo!)

5 Comments Filed Under [ Weekly Issues ]
MVP Again, anche quest'anno!

Questo periodo è a dir poco frenetico, tanti progetti che devono essere chiusi prima dell'estate, clienti ansiosni per il caldo, PC che rallentano, progetti personali che slittano, email che si affollano senza risposta.... malgrado questo, ho avuto pochi minuti fa la gioia di vedermi riconfermato l'MVP Award! Che dire, un grazie sincero ad Ale (si si, me la ricordo la survey :P), a Microsoft che continua a credere in me, ed a tutti i miei compagni MVP!  :)

4 Comments Filed Under [ Other .NET ]
[Daily Issue] Sql Injection, ASP classic, e la storia

Mi ricollego a questo post di Massimiliano riguardo gli ultimi attacchi di Sql Injection che stanno subendo un pò tutti.

Ricercando su goggle per 'www.bigadnet.com', vedrete subito una quantità di siti impressionante, tutti purtroppo sviluppati con il vecchio ASP 3.0. Molti, sempre purtroppo, riguardano siti istituzionali che fortunatamente sono stati già messi a posto, per ora. Se si conta che bigadnet è solo uno dei domini che si occupano di mandare in giro certe schifezze... a questo indirizzo trovate una lista aggiornata di altri domini.

Il meccanismo di injection è piuttosto semplice anche se raffinato: si concentrano sugli id numerici, quindi tutte le funzioni di controllo che siamo abituati ad avere sul vecchio ASP, se ne vanno a donne di facili costumi. Anche qualsiasi tag stripping, ovviamente, non funziona, visto che la stringa è encodata come ha dimostrato Massimiliano. Inoltre, l'attacco si scatena sulle querystring, che molti sviluppatori (sigh) sono abituati a considerare "sicure" (eh, tanto chi mai si metterà a giocare con le querystring?? eh? eh... :P).

Praticamente, al web server arriva una richiesta di questo genere:

pagina.asp?IdNumerico=888;DECLARE%20@S%20VARCHAR(4000);SET%20@S=CAST([..CUT della mappazza])--

Come ho detto prima, ne controllo apici ne tag stripping ci mettono a posto, quindi tutta la mappazza arriva bella diretta sul nostro db.
Gli attacchi sono di due tipi, uno che come ha mostrato massimiliano si "limita" a cambiare tutti i campi di un certo tipo aggiungendo la famosa stringa, e l'altro che oltre a questo crea un paio di tabelle temporanee e fa il dump del filesystem del SQL su tabella, che poi restituisce in output.

Il secondo problema si può facilmente risolvere configurando in maniera coerente gli accessi al database (niente sa, niente dbowner, niente di niente :D).
Per il primo problema, invece, l'unica soluzione reale è utilizzare stored procedures con parameters: una soluzione che nel 1999/2000 utilizzavano in due e che ora è un must-have.
Purtroppo riscrivere un intero sito utilizzando stored procedures può non essere semplicissimo, soprattutto in caso di ecommerce o applicativi complessi.
In questi casi una soluzione possibile è controllare ogni imput utilizzando regular expression (tipo regEx.Pattern = "[^0-9a-zA-Z]" per filtrare qualsiasi cosa non sia un numero o una lettera) o una lista di "bad words", inserendo per esempio "CAST", "VARCHAR", etc. Purtroppo, si corre il rischio di filtrare anche contenuti corretti, soprattutto in caso di CMS... li bisogna controllare di volta in volta il singolo caso, rimboccarsi le maniche e... convincere il cliente a migrare il sito del 1999 in ASP.NET!!!!! :D

P.S.: Si, ho scritto tutto questo perchè il piu vecchio applicativo residente sui miei server è stato ovviamente attaccato! Se qualcuno avesse dei problemi a ripulire il DB, mi sono fatto una consolle application che con sprezzo di select si occupa di girarsi tutti i campi e rimettere a posto le cose. Se a qualcuno serve, mi contatti: ovviamente non mi prendo responsabilità :P

5 Comments Filed Under [ Weekly Issues ]
[Semi - OT] Cartella esattoriale Dott.ssa Rocchi

In questi giorni tanti cari a noi liberi professionisti, quando si avvicina il giorno in cui tutti i nostri sudati guadagni custoditi gelosamente per un anno vengono giustamente restituisti allo stato (tono sarcastico smorzato), può succedere di ricevere delle strane email della suddetta Dott.ssa Rocchi che, soffiando sulle fiamme, ci avvisa in perfetto burocratese incomprensibile che qualcosa non è stato pagato e che rischiamo una sanzione.

Io in questi giorni sono stressato e impegnato fino all'inverosimile, e per 4 nanosecondi ho pensato a qualche nuova imprecazione da lanciare pensando "e ora che cosa mi sono dimenticato di pagare??"... poi 1 ulteriore nanosecondo dopo ho pensato che non esiste che lo stato mi avvisi tramite email di un mancato pagamento, e oltretututto che questa fantomatica notizia mi è arrivata sulla meno ufficiale delle mie 5 caselle di posta, quella in cui ho le iscrizioni alle mailing list! Facendo due piu due, apro il file .zip allegato giusto per provare OneCare, che giustamente blippa e mi segnala uno splendido Downloader...

Questo giusto per dire che magari persone piu distratte e piu incasinate di me potrebbero cliccare e pensare solo dopo ad un eventuale incongruenza ... nel caso, magari, se vi arriva, vi ricorderete di questo post e ci penserete due volte! :)

I dettagli del virus li trovate qui.

One Comment Filed Under [ Off Topic ]
[Daily Issue] Cambiare/rimuovere l'intestazione delle form in un Setup Project

Sono un paio di giorni che sto "impazzendo" con la scarsa maneggevolezza dei setup project.

Odio fare progetti di setup generalmente e quando li faccio sono sempre molto semplici.
Se devo andare un tantino oltre, mi scontro sempre con le evidenti limitazioni di "semplicità" del setup project di Visual Studio.

Stendendo un velo pietoso sui maneggi per cercare di dare un aspetto grafico alla cosa, dopo aver semplicemente cambiato la banner image, mi sono scontrato col fatto che il titolo dato di default ai vari tipi di form faceva a pugni con l'immagine messa come banner...

La soluzione piu ovvia è levare la scritta... peccato che in User Interface Design non ci sia una proprietà che permette di farlo.... stupito e scioccato da una cosa così strana, imboccato da un consiglio di Corrado ("perchè non provi ad usare Orca?" che per chi non lo sapesse è un msi editor), mi sono messo a "ravanare" nell'MSI finchè alla voce Control non ho trovato, ordinando per "type" tutta la serie di "BannerText". E' bastato brasare tutti per ottenere il risultato atteso... certo, se dovessi ricompilare dovrei rifare tutto...

E mi sorge la domanda.. ma era veramente così complesso esporre la proprietà come pubblica? :D

Add Comment Filed Under [ Weekly Issues ]