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…

PDF Creator    Invia l'articolo in formato PDF   

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.

 

PDF Creator    Invia l'articolo in formato PDF   

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.

 

PDF    Invia l'articolo in formato PDF   

Il video del mio intervento al Codemotion 2012

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

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

http://presentz.org/codemotion12/creare_linguaggio_gabriele_guizzardi

 

-

Creare PDF    Invia l'articolo in formato PDF   

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

Stampante PDF    Invia l'articolo in formato PDF   

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.

Forget Facebook and play Party Poker!

 

 

PDF Download    Invia l'articolo in formato PDF   

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.).

Free PDF    Invia l'articolo in formato PDF   

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”.

 

PDF Creator    Invia l'articolo in formato PDF   

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.

PDF Creator    Invia l'articolo in formato PDF   

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.

PDF    Invia l'articolo in formato PDF   

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:

Creare PDF    Invia l'articolo in formato PDF   

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.

Stampante PDF    Invia l'articolo in formato PDF   

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!

PDF Download    Invia l'articolo in formato PDF   

Installare MSChart per VB.NET

Un’altra funzionalità non inclusa automaticamente nelle ultime versioni di Visual Basic .NET è il famoso (per chi ha usato vb6) controllo MSChart, il controllo per fare i grafici per intenderci.

Per far apparire ed usare MSChart nelle vostre applicazioni dovete installarlo scaricando questi due aggiornamenti:

http://www.microsoft.com/downloads/en/confirmation.aspx?familyId=130f7986-bf49-4fe5-9ca8-910ae6ea442c&displayLang=en

poi questo (il nome del link dice che è un add-on per Visual Studio 2008 ma voi installatelo anche se avete 2005):

http://www.microsoft.com/downloads/en/confirmation.aspx?familyId=1d69ce13-e1e5-4315-825c-f14d33a303e9&displayLang=en

Ok, il più è fatto, nella casella degli strumenti cliccate col tasto destro del mouse e selezionate Scegli elementi. Dall’elenco dei componenti .NET scorrete fino a trovare le 2 voci che parlano di “chart”, selezionatele e cliccate su OK.

Ecco fatto, tra gli strumenti vi troverete una bella e piccola icona colorata raffigurante un istogramma…

Free PDF    Invia l'articolo in formato PDF   

Cambiare il MAC address

Partendo da una domanda letta su un forum dove un ragazzo chiedeva se era possibile cambiare il MAC address di una scheda di rete ed eventualmente come fare, vorrei illustrare qui i passaggi necessari per compiere questa operazione.

Per prima cosa segnatevi l’indirizzo MAC (Media Access Control) del dispositivo di rete che volete modificare, uno dei tanti metodi è usando il comando “ipconfig /all” oppure “getmac” dal prompt dei comandi.

L’indirizzo MAC di un dispositivo di rete è composto da 6 byte indicato in esadecimale. La combinazione di indirizzo IP e indirizzo MAC rende possibile lo scambio di pacchetti TCP/IP sulle reti LAN. Per una descrizione più approfondita suggerisco di fare una ricerca su Internet.

Per cambiare il MAC su sistemi Windows si può alterare il valore dell’indirizzo direttamente nel file di registro. Per far questo aprire Regedit e cercate questa chiave di registro:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\ Class\{4D36E972-E325-11CE-BFC1-08002bE10318}

Sotto di essa troverete una serie di cartelle numerate 0001, 0002, ecc. Cercate quella che che si chiama “NetCfgInstanceId” contenente il nome del trasporto (il lungo valore di cifre e numeri visualizzato dal comando “getmac”). Per controllare se tutto è giusto verificate anche il valore di “DriverDesc” che sia uguale alla descrizione del dispositivo di rete che volete cambiare.

A questo punto cambiate il valore di “NetworkAddress” sostituendolo col nuovo indirizzo MAC desiderato (se la voce “NetworkAddress” non c’è potete crearla, è un REG_Z, cioè una stringa). Uscite da Regedit, spegnete e riaccendete il PC. Lanciando di nuovo “ipconfig /all” troverete il nuovo indirizzo MAC al posto del precedente.

Questa operazione è realizzabile anche su altri sistemi non Windows ma sinceramente con Linux o Mac non l’ho mai eseguita.

PDF Creator    Invia l'articolo in formato PDF