Client e Server in Python per test conteggio sistema Designa

Come programmatore freelance lavoro spesso per diversi ambienti e con diverse tecnologie, il mondo dei parcheggi è però il mondo nel quale lavoro più spesso e col quale interagisco spesso.

Ho scritto diversi programmi per gestire pagamenti con Carte di Credito, sistemi di riconoscimento targhe e sistemi di interfacciamento di sistemi guida traffico (cartellonistica). Proprio in previsione di aggiornare un vecchio progetto ormai obsoleto ho realizzato un rapido e semplice script in Python per fare alcuni test funzionali.

Lo script è questo:

Il programma si mette in ascolto sulla porta UDP indicata, salva la stringa ricevuta e la scompone nei suo valori. Non spiegherò nel dettaglio la stringa poiché esula dallo scopo di questo articolo che vorrei fosse inteso come generico sull’utilizzo di uno script client e uno server, potete però desumerla dai vari print nel codice. Vediamo i dettagli.

La sintassi della riga di comando è la seguente:

NOTA: lo script può essere compilato con py2exe (io ho usato Python 2.7), se lo usate dentro un IDE come PyCharm usate la sola riga di comando nella relativa casella Run -> Edit Configuration -> Script parameters.

Vediamo nel dettaglio. Il parametro -f chiede un nome di file dove salvare la stringa UDP ricevuta, per esempio log.txt. Con -udp e con -porta potete specificare rispettivamente l’IP UDP e la porta. Nel caso usiate il prossimo script che simula il lato server, cioè l’apparecchiatura Designa, potete mantenere i valori che ho messo io come esempio, cioè il localhost 127.0.0.1 e la porta 2103. Nel file sender.py li vedete come costanti.

Questo è il codice per simulare la trasmissione UDP della stringa del conteggio Designa.

NOTA: da PyCharm potete avviare entrambi gli script insieme, se invece lanciate i file compilati aprite due differenti finestre DOS come da immagine:

test udpA questo punto avete le basi per un semplice script di test per comunicazioni client/server.

 

 

Livelli di ordinamento con MySQL

Non sono un esperto in SQL e trovo alcune volte difficoltà con la sintassi, soprattutto se concatenata o con diversi livelli di controllo. Per un sito realizzato ultimamente ho dovuto visualizzare una serie di dati ordinandoli per data di scadenza. Fin qui nessun problema se non per il fatto che sono dati di tre periodi temporali differenti da visualizzare in modo diverso.

keep-calm-and-mysql-on

Descrizione della visualizzazione

Il primo dato da presentare deve essere un periodo temporale in essere, cioè deve essere in corso quindi la data attuale deve essere compresa tra la data di partenza e la data di scadenza. Il secondo dato deve essere prossimamente quindi sia la data di partenza che la data di scadenza devono essere superiori alla data attuale. Infine, i dati scaduti cioè quei dati che hanno data di scadenza inferiore alla data attuale.

Possibili soluzioni

La prima query funzionante è stata la seguente:

Possiamo vedere come i dati siano correttamente elaborati, ogni WHEN fa il controllo voluto ordinando i risultati. La cosa si complica però se a uno di questi risultati dobbiamo dare un ordine inverso.

Variante

Se si vuole però ordinare i dati scaduti dal più recente al più vecchio allora si è dovuto riscrivere la query in un altro modo:

Qui ogni caso è elaborato separatamente.

Inviare eMail da Localhost con PHP

Uno dei primi settaggi fondamentali di PHP quando si lavora in locale è sicuramente la possibilità di inviare email dal proprio PC di lavoro. Per i programmatori alle prime armi o per chi ha questa necessità di inviare posta elettronica per test e prove perché magari ha installato qualche CMS può sembrare complicato, in realtà è più semplice di quello che sembra.

Per prima cosa individuiamo il file php.ini, che generalmente sta nella cartella /bin di Apache oppure nella stessa cartella di Windows, oppure ancora nella cartella /usr/local/lib su Unix. Questo perché la sua posizione cambia in base al web server installato (WAMP, XAMP, MAMP, Installazione manuale di Apache, ecc.). Se non lo trovate fate una semplice ricerca da Windows.

Aprite il file con un editor di testo e localizzate le righe che vedete in figura. Cambiate la voce SMTP inserendo il nome del vostro provider ISP (p.e. smtp.alice.it oppure smtp.tiscali.it) e mettete il vostro email nella voce sendmail_from.

Fate molta attenzione a non modificare altre voci se non sapete esattamente cosa state facendo. Ricordate inoltre di riavviare Apache dopo ogni modifica.

Nel caso vogliate usare un account Google potete utilizzare queste impostazioni:

Potete impostare la modifica di php.ini anche da PHP direttamente:

Spero vi possa aiutare…

MySQL: migrare dati da un DB ad un altro con adattamento

Dovendo realizzare una nuova versione di un importante sito di aste per beneficenza mi sono ritrovato a dover recuperare i dati degli utenti e delle associazioni ONLUS presenti nel database in uso reinserendoli nel database realizzato da me. Ovviamente, non si è trattato di copiare le vecchie tabelle nel nuovo database, sarebbe stato troppo semplice e questo articolo sarebbe stato pressoché inutile. Quello che invece ho dovuto realizzare sono stati una serie di script, in SQL e PHP, per recuperare questi dati. Un’occasione per rispolverare il mio SQL arrugginito.

Tabelle di partenza:

Partiamo dall’inizio. Il database di partenza, parliamo di MySQL, come detto, prevedeva una tabella principale contenente sia dati utenti sia associazioni e due tabelle secondarie con ulteriori dati sempre in comune discriminati dal numero ID di una delle due tabelle e da un numero di riferimento. In soldoni, spero di essere abbastanza chiaro, una delle due tabelle secondarie indicava il contenuto dei valori aggiuntivi nell’altra tabella secondaria. Sicuramente una soluzione ricavata dall’adattamento di un software ed un database non realizzato per questo scopo. Nella mia nuova versione volevo rendere la struttura del database un po’ più professionale e funzionale ma più semplice, con solo due diverse tabelle, una per gli utenti e una per le associazioni.

Tabelle di destinazione:

Ovviamente non posso pubblicare un dump per ovvi motivi di privacy.

Per complicare un po’ le cose, i campi da una tabella all’altra non sono ovviamente gli stessi, anzi, alcuni non servono più mentre ce ne sono dei nuovi. Inoltre le password erano codificate in Base64, una forma di codifica reversibile assolutamente non adatta a questo scopo. Insomma, vediamo cosa ho fatto…

Allora, per prima cosa recuperiamo i dati in comune prima per gli utenti e poi per le associazioni. Uno script SQL opportunamente modificato per le due situazioni, utenti e associazioni, permetterà di recuperare questi dati. Fortunatamente come discriminante tra i dati utenti e quelli delle associazioni vi è il campo della data di nascita, vuoto per associazioni e pieno per gli utenti:

Cambiando i nomi della tabella (nel codice vedete lo script per le “associazioni”) e dei campi si può usare lo stesso script  per travasare un ulteriore serie di dati in una seconda tabella, quella degli utenti. In questo modo abbiamo recuperato una serie di dati da una tabella del vecchio database a due tabelle del nuovo database.

Fin qui nessuna apparente difficoltà, adesso però dobbiamo recuperare le informazioni dalle due tabelle secondarie e qui la cosa si complica leggermente. Come dicevo, una tabella riporta una serie di valori di riferimento mentre nella seconda tabella secondaria vi sono questi valori, il tutto legato dagli ID.

Ecco quindi lo script che confronta il numero ID delle informazioni già recuperate con quello di una delle tabelle e recupera poi la relativa informazione:

Anche in questo caso, cambiando il nomi delle tabelle possiamo recuperare sia i dati utente che i dati associazioni.

A questo punto cambiamo le password da Base64 a MD5(salt+password), pertanto devo rimettere in chiaro le password e ricodificarle:

Ovviamente, per essere sicuro del risultato ho voluto fare qualche test prima ancora di utilizzare in modo definitivo i dati migrati. Ecco quindi un paio di script scritti apposta per la password.

Il primo script rimette la password originale:

Questo secondo script invece confronta una delle password con la nuova codifica per verificare se la conversione è riuscita:

Ecco quindi la cronaca di una giornata di lavoro passata solo a recuperare dati. Una libidine.

 

Phishing Poste Italiane, analisi di un tentativo coreano

Ho già parlato in un precedente articolo di un tentativo di phishing, questa volta analizziamo quello che ho ricevuto da un sito coreano.

La mail si spacciava come proveniente dalle Poste Italiane (poveretti, gli fischieranno le orecchie?). Le Poste sono una delle aziende più colpite da questo genere di truffe. Ecco il testo:

Dall’ ultima indagine e emerso che il fenomeno di pishing e in forte crescita, pertanto stiamo facendo controlli casuali sui conti dei nostri clienti ed il tuo conto e stato contrassegnato per la verifica manuale.

Nel attaccamento sottostante trovera la pagina di verifica che dovra compilare. Trattandosi di una misura di sicurezza la preghiamo di procedere entro e non oltre i 3 giorni lavorativi.

Avvia Procedura Di Verifica

Luana P. – Servizio clienti
Poste Italiane S.p.A. © 2012

Subito possiamo vedere i classici termini sbagliati che rendono il testo abbastanza grottesco, è addirittura sbagliata la stessa parola phishing in inglese. Comunque, allegato al mail c’era il file “login-cliente.html” contenente una pagina abbastanza simile a quelle del sito ufficiale delle Poste. Potete vederne una immagine nello screen-shot.

Phishing Poste Italiane

Fin qui è film già visto, vediamo invece se riusciamo a capire come funziona. Per prima cosa analizziamo il codice HTML (per sicurezza non aprite mai allegati sospetti con estensione .html o simili, salvateli ed apriteli con un editor). Scorrendo fino al punto dove il codice invia i dati del form cliccando sul pulsante Accedi troviamo la seguente riga:

Come possiamo notare, l’action del form invia i dati al link http://ddangfarm.com/php2root/postepay.php. Se prendiamo e scriviamo nel browser il solo dominio si aprirà un sito coreano (http://ddangfarm.com/).

Possiamo però fare di più, provare a scoprire chi c’è dietro. Basta semplicemente collegarsi con uno dei tanti siti Whois e digitare il dominio. Ecco a chi è intestato il sito coreano:

Come possiamo notare il sito scade il 31/01/2014, quindi di email ne arriveranno altre.

Ovviamente, anche se io affronto la cosa in modo divertito voi non sottovalutate mai i possibili danni derivanti da questo genere di truffe, controllate sempre bene i link e le comunicazioni. Se non siete certi al 100% del contenuto della posta elettronica chiamate telefonicamente il mittente e fatevi confermare la richiesta. Difficilmente banche, enti ed istituti chiedono di digitare i vostri dati per conferma.

Ho segnalato il tutto alla Polizia Postale ma come ben sappiamo nessuno risponde quindi si spera vengano presi provvedimenti.

 

Il video del mio intervento al Codemotion 2012

Codemotion ha pubblicato il video del mio talk. Grazie Codemotion, è stata una esperienza molto importante.

[youtube]http://www.youtube.com/watch?v=tMBKQgWqIKA&feature=BFa&list=LLPDx6YAJBki0-5H7v7qGgQg[/youtube]

A questo link potete trovare anche le slide che ho utilizzato:

http://presentz.org/codemotion12/creare_linguaggio_gabriele_guizzardi

 

-

Codemotion, Roma 23+24.03.2012

Ci siamo ragazzi, il mio talk sulla progettazione di un linguaggio di programmazione è stato accettato. In realtà penso che entrambi i talk proposti siano piaciuti perché in un primo momento era stata accettato il primo talk (come era stato progettato il sistema di prenotazione auto per una grande azienda italiana) poi, probabilmente non potendo esporre due talk, è stato preferito il secondo. Sono molto contento, significa che nonostante il poco tempo a disposizione sono ancora in grado di generare codice e idee interessanti per la comunità.

http://www.codemotion.it/talk/creare-un-proprio-linguaggio-di-programmazione-il-web-e-applicazioni-desktop

Appuntamento quindi al 23 e 24 aprile ma soprattutto alle 11:30 del 24…. :D

Codemotion Roma 2012

Codemotion Roma 2012

Immagini dei profili nella chat di Facebook

Quando ho visto questa funzionalità della chat di Facebook mi sono reso conto che probabilmente abbiamo toccato il fondo in fatto di features inutili. E’ possibile, solo nella chat, far apparire come icona l’immagine di un qualsiasi profilo. Facciamo un esempio pratico, il mio profilo è raggiungibile a questo link:

http://www.facebook.com/guizzardigabriele

Se nella chat di Facebook scriviamo solo il mio nome e cognome tra doppie parentesi quadre verrà visualizzata la mia immagine del profilo cioè il cubo glider:

[[guizzardigabriele]]

La cosa funziona anche mettendo l’ID se non vi compare un nome specifico.

 

Ping range di IP di una LAN in PHP con fsockopen

Volendo realizzare al volo un codice per controllare se gli Host di una rete LAN fossero online, in previsione di scriverlo poi per un programma client, ho buttato giù questo piccolo script in PHP. Questo sistema di controllo, col quale ho perso pochissimo tempo per implementarlo, permette di effettuare un Ping senza il classico utilizzo del comando Ping richiamato da exec o senza usare comandi shell tipo:

Che produce output caotico e non immediatamente comprensibile poiché riporta anche tutte le risposte del comando Ping.

L’utilizzo di questo script permette invece di avere un elenco chiaro degli IP raggiungibili e di quelli non raggiungibili:


L’output generato infatti è questo:

E’ chiaro che in base alla risposta positiva o negativa potete aggiungere tutto il codice che ritenete opportuno per evidenziare ulteriormente l’output a video (suoni, colori, ecc.).

POSIX Regex deprecate da PHP 5.3

Molti script utilizzano le funzioni Regex come “ereg()” per la validazione degli email, per il controllo dello stato di un paramentro o altri input utente. Dalla versione 5.3.0 queste funzioni devono essere sostituite dalle PCRE Regex:

http://it2.php.net/manual/en/reference.pcre.pattern.posix.php

Ovviamente non mi soffermo su quanto già affrontato da PHP.net ma su come sostituire queste funzioni con le nuove, cosa che ho dovuto fare in parecchio codice scritto negli anni passati.

Prendiamo per esempio una funziona come questa:

La riga con la funzione “eregi” produce un errore di “funzione deprecabile”. La soluzione è abbastanza semplice, basta sostituire la funzione con “preg_match” e aggiungere uno slash a inizio del primo parametro e un /i alla fine dello stesso. Questo perché “eregi()” è case sensitive e il “/i” indica proprio la ricerca case sensitive.

Nel caso la funzione fosse stata per esempio un semplice “ereg()” allora basta racchiudere il primo parametro tra due slash, senza la “i”.

 

Inviare email con credenziali in VB.NET 2008

Il seguente codice l’ho usato in una applicazione scritta per un Server Windows 2008, niente di eccezzionale ma magari potrà aiutare qualcuno. Illustra l’invio di un mail con allegato un file a due indirizzi differenti, un destinatario e uno per conoscenza, verso un server SMTP che necessita di credenziali cioè di ID e Password.

Per richiamare la funzione potete usare questo comando:

Ricordate di avere la porta 25 aperta, se la porta non fosse la 25 potete impostarla con SmtpClient.Port che nel codice sopra diventerebbe client.Port.

Attacco dizionario e forza bruta di hash MD5 in Python

Dopo il piccolo successo ottenuto dallo script che effettuava tutte le combinazioni possibili del codice ASCII per ritrovare il corrispondente testo in chiaro di un hash MD5 (vedi articolo http://www.guizzardi.net/?p=209), articolo che un sito di pseuso-hacker mi ha pure copiato, mha! , ho voluto fare la stessa cosa in Python 2.6 (con piccole modifiche si adatta anche alla versione 3.x).

In questa versione ho inserito la possibilità di eseguire prima un attacco dizionario e solo in un successivo tempo, se il primo non porta risultati, quello a forza bruta. L’attacco dizionario si basa sull’uso di un file di testo contenente l’elenco delle password più comuni (il file è disponibile liberamente in rete e potete integrarlo con nuove password).

Il Python si presta a questo genere di script poiché è molto versatile e facile da strutturare. Ovviamente ci sono online altri script di questo genere, per esempio alcuni interrogano i database online di parole già codificate ed evitano così di usare l’attacco a forza bruta, molto dispendioso in termini di tempo. Inoltre, nel mio codice non ho preso in considerazione il multi-threaded, cosa che invece sarebbe fondamentale per velocizzare i calcoli. Si potrebbe per esempio creare diversi thread assegnando a ciascuno solo un range di calcoli, per far questo Python mette a disposizione:

Il programma è molto semplice, basta leggerlo per capire come funziona. E’ diviso in due parti, la prima parte nella funzione “Main” cerca nel file di testo il corrispondente testo in chiaro dell’hash passato, la seconda parte è la funzione “Combinazioni” che crea tutte le combinazioni dei caratteri ASCII (lo vedete chiaramente nella stringa), ne calcola l’MD5 e lo compara con quello da trovare.

Come sempre il codice lo trovate nella sezione Download.

Ho trovato un fisherman

Oggi mi è arrivata questa simpatica mail con mittente “Verifid by Visa”:

Gentile Cliente,

Abbiamo rilevato attivita irregolari sul tuo Verified by Visa / MasterSecure Code Internet banking sul conto 03/01/2011.
Per la tua protezione, e necessario verificare questo attivita prima di poter continuare a utilizzare il conto.
Si prega di scaricare il documento allegato alla presente e-mail a rivedere le attivita del proprio account.
Rivedremo l’attivita sul tuo conto con voi e alla verifica, e ci consentira di eliminare le restrizioni imposte alle il tuo account.
Se scegliete di ignorare la nostra richiesta, ci lasciano scelta ma di sospendere temporaly tuo account.

Se scegli di ignorare la nostra richiesta, ci lasciano scelta di sospendere temporaneamente il tuo account.

Ti chiediamo di consentire almeno 72 ore per il caso di essere indagato e si consiglia di verificare il tuo conto in quel momento.

Con i migliori saluti,
Responsabile della comunicazione del Cliente
© Copyright Verifid By Visa 2011 – Tutti i diritti riservati

A parte la palese ridicola traduzione che evidenzia il tentativo di fishing strampalato di qualcuno che non sa l’italiano ed utilizza sistemi di traduzione automatico la parte più interessante è l’allegato in formato HTML, al mail era infatti associato il file “Verifid By Visa & MasterCard Secure Code.html” contenente un form da compilare che rimandava a questo indirizzo Internet:

http://69.84.150.184

Ed ecco la parte divertente, provate ad andare a questo IP e scoprirete cosa nasconde il nostro pescatore pasticcione. Io non credevo ai miei occhi, cliccate sulla voce “Serial Numbers” e mettete la lettera “a” nella casella di ricerca in basso, poi cliccate su search. Provate differenti lettere oppure digitate “ac” per far apparire altri programmi ancora.

Ovviamente potete visitare anche le altre parti del menù.

Ora, cosa ci insegna tutto questo? Per prima cosa è facile credere di essere grandi hacker o truffatori come questa persona mentre invece si dimostra solo di essere dei poveri furbetti di quartiere e nenache tanto bravi, inoltre, scopriamo come sia semplice verificare se le comunicazioni in arrivo nascondano in realtà possibili frodi o altro. Mi raccomando quindi, non cliccate su tutto ciò che vedete.

Per vostro diletto riporto di seguito l’immagine del form:

fisherman pasticcione

e il relativo codice HTML:

Semplice funzione XOR in C++

Non ci crederete ma non ho trovato in rete una piccola funzione per calcolare lo XOR di una stringa che prendesse la stessa dalla riga di comando come parametro. Ne ho trovate tante che partono dalla stringa già inglobata nel codice del programma oppure che realizzano lo XOR di un file ma dalla riga di comando no. Fa niente, eccola qui.

Spesso, il risultato del calcolo dello XOR non riporta caratteri visibili pertanto ho aggiunto la scrittura della codifica in un file di testo. Questo permette di vedere il risultato di una elaborazione, cosa che potrebbe risultare difficile solo con la riga di comando.

Test della funzione Mail in PHP

Vi è mai capitato che la configurazione del server dove è ospitato il proprio sito web sia accidentalmente modificata dal provider oppure che per ragioni tecniche, spostando il sito da un server ad un altro non tutto torna a funzionare perfettamente? A me è capitato, specialmente per l’invio della posta tramite script. Mi sono scritto allora un semplicissimo programmino in PHP per effettuare dei test.

Niente di che o robe troppo difficili, come vedete è uno script che fa giusto il minimo indispensabile per dimostrare al provider che la funzione mail non … funziona!