La distribuzione pubblica di materiale in rete determina una asimmetria dei rapporti interpersonali: mentre i visitatori hanno piena cognizione della fonte di ciò a cui stanno accedendo, al contrario l’autore del contenuto non sa nulla di chi essi siano (a parte le informazioni statistiche raccolte da Matomo). Per ristabilire un minimo di rapporto one-to-one, da lungo tempo il download del mio libro su Segnali e TLC è vincolato all’indicazione da parte del richiedente della propria email, presso cui viene inviato l’indirizzo da cui scaricare.
Tutto bene, tranne che l’indirizzo comunicato per email era, diciamo così, statico, ossia funzionava indipendentemente dalla email, e chiunque lo conosceva poteva usarlo. Anche se, tutto sommato, a giudicare dalle statistiche di utilizzo di Apache non sembra ci sia stato un grosso numero di download indipendenti dall’email, mi sono comunque chiesto che figura ci facevoIn realtà è successa anche una cosa ben più grave: il link comunicato via email portava ad una copia NAVIGABILE!!! Quella riservata ai sostenitori! E nessuno che in svariati mesi mi ha mai avvisato di niente!!! …probabilmente è questo il motivo principale che mi ha spinto a complicare le cose! se qualcuno si accorgeva che il link era sempre quello. Magari lo sgamavano pure, ma l’indirizzo non si è diffuso forse per timidezza, o per isolamento, o chissà cosa…
Mentre stavo ragionando su come fare per irrobustire la modalità di consegna, mi sono imbattuto in questa preziosa pagina di stackoverflow che illustra le istruzioni PHP necessarie per inviare un file al visitatore:
Apri la tendina per le istruzioni PHP
$filename = "whatever.jpg"; if (file_exists($filename)){ //Get file type and set it as Content Type $finfo = finfo_open(FILEINFO_MIME_TYPE); header('Content-Type: ' . finfo_file($finfo, $filename)); finfo_close($finfo); //Use Content-Disposition: attachment to specify the filename header('Content-Disposition: attachment; filename='.basename($filename)); //No cache header('Expires: 0'); header('Cache-Control: must-revalidate'); header('Pragma: public'); //Define file size header('Content-Length: ' . filesize($filename)); ob_clean(); flush(); readfile($filename); exit; }
Bene, quindi non serve più inviare l’indirizzo per email, il download può partire da solo, come accade con altri siti!! Ma… come si fa a permettere il download solamente al proprietario della email? Semplice, per far partire il download il visitatore dovrà immettere un particolare codice di verifica ricevuto per email. Tale codice è generato (dal PHP) a partire dall’indirizzo email, a cui si concatena una stringa contenuta nella variabile $sale
:
$code = hash_hmac('MD5', $email, $sale); /* $sale è ignoto al visitatore */
$code = substr($code, 0, 6); /* accorcia il codice */
e queste istruzioni sono eseguite, oltre che per creare il codice da inviare per email, anche al ritorno del visitatore, per verificare che abbia fatto accesso alla email fornita. Se i due codici coincidono, il visitatore è autenticato, seppur ad un solo fattore.
Ancora un piccolo sforzo
A questo punto quel che occorre fare è pianificare dove mettere le mani, ed a tal fine mi sono avvalso di ciò che gli informatici chiamano diagramma di sequenza, o call flow nella telefonia, od handshake per il TCP… insomma, questa roba qui:

In pratica, cortesia.html
è la pagina dove immettere la propria email, che viene passata a cortesiaOK.php
che provvede a calcolare il codice ed inviare l’email. Dopodiché occorre un nuovo endpoint (hash_chk.php
) che si occupa di raccogliere i dati dal visitatore e verificare la correttezza del codice: in caso affermativo potrà essere lanciata la pagina (cort-dwld.php
) che fa partire il download, od al contrario segnalare l’errore. Ah si, per sicurezza, anche la pagina che lancia il download ricontrolla il codice, altrimenti… tutto questo lavoro sarebbe stato inutile! 🙂
Questo sarebbe un web service?
Mah, in qualche modo si, nel senso che ci sono delle pagine che in realtà sono programmi, che agiscono in base a dei valori ricevuti, come fossero chiamate a procedure remote (un volta le chiamavano RPC ossia Remote Procedure Call). Qualcuno si sta forse chiedendo come avviene il passaggio dei parametri? Beh, il meccanismo venne denominato Common Gateway Interface o CGI e lo racconto nell’altro mio testo.

Ahahah quello sopra sarei io?? Nooo è solo che mi sono avanzate alcune immagini artificiali, tra le tante che occorre generare prima di ottenerne una che possa andar bene con l’argomento del post 🙂 Ma anche questa sotto non è male!
