Storable Random Password

Categorie:PHPTags: , , ,

Problemi con la sicurezza delle tue applicazioni? Contattaci!

Utile per molte applicazioni e per i processi di login, gli algoritmi in grado di generare password casuale sono molto utili al fine di generare credenziali di autenticazione o verificare un processo di corrispondenza di un indirizzo mail con un account. Un occhio di riguardo è sempre rivolto alla sicurezza che le password devono mantenere per proteggere tutto ciò che sta oltre il loro utilizzo. Inutile dire quindi che la miglior password utilizzabile è quella formata dall’unione di lettere maiuscole e minuscole, numeri e caratteri speciali per una lunghezza di almeno 8 caratteri.

Trattando di software rivolti ad un pubblico di vario genere, non sempre utilizzare la password più efficiente è la risposta giusta in quanto difficilmente memorizzabile e quindi conservata in mail, fogliettini o altri dispositivi non protetti.

Per ottenere un buon connubio tra sicurezza e semplicità d’uso è necessario poter generare password casuali che presentino una facilità di lettura, quindi di memorizzazione, data dallo pseudo utilizzo di costrutti grammaticali. Unendo infatti suffissi, prefissi, vocali prese una sola volta e consonanti ripetute secondo regole grammaticali, si può ottenere una password sicuramente insensata ma facile da ricordare.

Di seguito presentiamo un breve algoritmo scritto in PHP che restituisce una password casuale facile da ricordare o come spesso chiamate le SRP Storable Random Password.

La funzione può essere personalizzata in fase di chiamata aumentando/diminuendo il numero di sillabe da utilizzare e introducendo o meno i caratteri e la quantità numerica nonché l’utilizzo dei prefissi grammaticali:

  public function gen_mem_password($syllables = 3, $use_prefix = false, $use_numbers = true,$quantity_numbers=2){
            // Define function unless it is already exists
    if (!function_exists('ae_arr'))
    {
        // This function returns random array element
        function ae_arr(&$arr)
        {
            return $arr[rand(0, sizeof($arr)-1)];
        }
    }

    // italian prefix
    $prefix = array('an',       'ana',      'ante',     'anti',     'arci',
                    'avan',     'bis',      'circom',   'cis',      'con',
                    'contra',   'contro',   'de',       'di',       'dis',
                    'eu',       'extra',    'fra',      'in',       'infra', 
                    'inter',    'intra',    'iper',     'ipo',      'luxta',    
                    'meta',     'ob',       'oltre',    'post',     'pre',      
                    'pro',      're',       'sin',      'sopra',    'sotto',    
                    'stra',     'sub',      'super',    'sur',      'tra', 
                    'trans');

    // italian suffix
    $suffix = array('accio',    'aggine',   'aggio',    'aglia',    'aio',
                    'anza',     'astro',    'ata',      'ato',      'enza',
                    'eria',     'esco',     'etto',     'ezza',     'erla', 
                    'etto',     'ezza',     'fero',     'iere',     'ino',
                    'ismo',     'ista',     'mento',    'oide',     'one', 
                    'ota',      'oto',      'otto',     'tore',     'uccio',
                    'ucolo',    'zione',    'ale',      'ario',     'ese', 
                    'evole',    'issimo',   'oso',      'oto',      'mente',
                    'archia',   'filla',    'logia',    'mania',    'teca',
                    'iatra',    'scopia'); 

    //vowel sounds 
    $vowels     = array('a', 'o', 'e', 'i', 'u', 'ou'); 

    //sound consonants 
    $consonants = array( 'r', 't', 'p', 's', 'd', 'f', 'g', 'h', 'l', 'z','c', 'v', 'b', 'n', 'm','qu');
    //numbers
    $numbers    = array('1','2','3','4','5','6','7','8','9','0');

    $password           = $use_prefix?ae_arr($prefix):'';
    $password_suffix    = ae_arr($suffix);

    for($i=0; $i<$syllables; $i++)
    {
        //random consonant
        $doubles    = array('n', 'm', 't', 's','r','c','d','p','f','g','l','z','v');
        $c          = ae_arr($consonants);
        if (in_array($c, $doubles)&&($i!=0))
            if (rand(0, 2) == 1) 
                $c .= $c;
        
        $password .= $c;

        //random vowel
        $password .= ae_arr($vowels);

        if ($i == $syllables - 1) 
            if (in_array($password_suffix[0], $vowels))
                $password .= ae_arr($consonants);

    }

    // selecting random suffix
    $password .= $password_suffix;

    if($quantity_numbers>=0 && $use_numbers)
	for($j=0; $j<$quantity_numbers; $j++)
	 	$password .= ae_arr($numbers);
	
    

    return $password;
        
    }

Filtro Zend o PHP per nomi propri di persona

Problemi con Zend Framework o php? Contattaci!

Riportiamo di seguito un utile filtro scritto in PHP e predisposto all’uso con Zend Framework per filtrare una stringa e renderla grammaticalmente corretta alle regole che afferiscono ai nomi propri di persona nella grammatica Italiana.

/**
 * Zend Framework
 *
 * LICENSE
 *
 * This source file is subject to the new BSD license that is bundled
 * with this package in the file LICENSE.txt.
 * It is also available through the world-wide-web at this URL:
 * http://framework.zend.com/license/new-bsd
 * If you did not receive a copy of the license and are unable to
 * obtain it through the world-wide-web, please send an email
 * to license@zend.com so we can send you a copy immediately.
 *
 * @category   Zend
 * @package    Zend_Filter
 * @copyright  Draco Corporation (http://www.draco-corporation.com)
 * @license    Draco Corporation (http://www.draco-corporation.com)
 * @version    PersonName.php 1 2013-04-25 11:17
 * @author     Draco Corporation (http://www.draco-corporation.com)
 */

/**
 * @see Zend_Filter_Interface
 */
require_once 'Zend/Filter/Interface.php';
/**
 * @see Zend_Locale
 */
require_once 'Zend/Locale.php';

/**
 * @category   Zend
 * @package    Zend_Filter
 * @copyright  Draco Corporation (http://www.draco-corporation.com)
 * @license    Draco Corporation (http://www.draco-corporation.com)
 */
class Zend_Filter_PersonName implements Zend_Filter_Interface
{
   
    /**
     * Defined by Zend_Filter_Interface
     *
     * returns the name of the person with the first letter capitalized
     *
     * @param  string $value
     * @return string
     */
    public function filter($value)
    {
        

        //reduces all characters enlarging only the first character of each word
        $value = ucwords(strtolower($value));
        
        //If the name is an accent is enlarged after the first letter of this
        $value = preg_replace('/\'(\w+)/e', "'\''.ucfirst('$1')", $value);

      
        return $value;
    }
}

Open Graph cache

Categorie:Open GraphTags: ,

Problemi con Open Graph? Contattaci!

Il protocollo Open Graph è uno standard di programmazione basato sul noto Social Network Facebook. Questo consente di esprimere “azioni sociali” finalizzate alla condivisione di un’esperienza. Acquistare un prodotto o visitare un sito potranno essere condivise sul proprio profilo in modo automatico.

In fase di implementazione o soprattutto di testing, è necessario testare le istruzioni Open Graph direttamente sul web in quanto Facebook deve poter effettuare una chiamata al sito che stiamo testando per ricavarne le informazioni necessarie. Quest’ultime però vengono immagazzinate in cache da Facebook ed aggiornate solo dopo periodi prestabiliti rendendo quindi difficile il test delle istruzioni impartite.

Per forzare Facebook ad aggiornare la sua cache inerente il sito che contiene le istruzioni Open Graph, basta recarsi nella sezione Debug di Facebook al seguente link: https://developers.facebook.com/tools/debug ed inserire il sito web oggetto di test.

Oltre all’aggiornamento della cache, lo strumento ci darà anche ulteriori informazioni tecniche.

Problemi con Open Graph? Contattaci!

IPN paypal

Categorie:PHPTags: , ,

Vuoi utilizzare lo strumento IPN PayPal per la tua piattaforma? Contattaci!

Un IPN (Instant Payment Notification) è un servizio fornito da PayPal che consente di automatizzare le operazioni successive ad un acquisto senza richiedere la presenza di un utente fisico.

L’ IPN è un sistema molto sicuro che opera dietro lo scenario di una transazione da cliente e venditore effettuando un dialogo diretto tra il Server di PayPal e quello del venditore.

Nel codice sopra riportato, immaginiamo un tipico pulsante ‘Acquista’ che il cliente preme per effettuare il pagamento di un ordine. Ogni Tag rappresenta un’istruzione da fornire al server di PayPal per effettuare l’operazione come la mail di riferimento dell’account del venditore, l’oggetto acquistato, l’importo, la valuta ecc. Aspetto fondamentale è l’istruzione che specifica l’indirizzo dove risiede l’IPN (http://sitovenditore.xx/ipn.php) che servirà a PayPal per effettuare le operazioni tecniche di dialogo con il nostro sistema.


query("SELECT * FROM ordine WHERE idordine = '$customParameter'");
                   

                
            while($row = mysqli_fetch_array($result)){          
              $result = $mysqli->query("UPDATE cliente SET crediti = crediti - ".$row['quantita_crediti']." WHERE  idcliente =".$row['cliente'].";");

            }

            // chiusura della connessione
            $mysqli->close();
 
        }
            
            
            
            
            
            
            
            
            
    // intercetta le variabili IPN inviate da PayPal   
    $req = 'cmd=_notify-validate';


    // legge l'intero contenuto dell'array POST e replica una nuova variabile
    foreach ($_POST as $key => $value) {
        $value = urlencode(stripslashes($value));
        $req .= "&$key=$value";
    }

 
    

    //Generazione degli header secondo il nuovo standard PayPal
    $header = "POST /cgi-bin/webscr HTTP/1.1\r\n";
    $header .= "Content-Type: application/x-www-form-urlencoded\r\n";
    $header .= "Host: www.paypal.com\r\n";  // www.paypal.com for a live site
    $header .= "Content-Length: " . strlen($req) . "\r\n";
    $header .= "Connection: close\r\n\r\n";

    // apre una connessione al socket PayPal 
    $fp = fsockopen ('ssl://www.paypal.com', 443, $errno, $errstr, 30);
    
    
    // converte le variabili inviate da IPN in variabili locali
    $custom             = filter_var($_POST['custom']           , FILTER_SANITIZE_STRING);
    $txn_id             = filter_var($_POST['txn_id']           , FILTER_SANITIZE_STRING);
    $payment_status     = filter_var($_POST['payment_status']   , FILTER_SANITIZE_STRING);
    $receiver_email     = filter_var($_POST['receiver_email']   , FILTER_SANITIZE_EMAIL);
    $payer_email        = filter_var($_POST['payer_email']      , FILTER_SANITIZE_EMAIL);
    $first_name         = filter_var($_POST['first_name']       , FILTER_SANITIZE_STRING);
    $last_name          = filter_var($_POST['last_name']        , FILTER_SANITIZE_STRING);
    $address_street     = filter_var($_POST['address_street']   , FILTER_SANITIZE_STRING);
    $address_city       = filter_var($_POST['address_city']     , FILTER_SANITIZE_STRING);
    $address_state      = filter_var($_POST['address_state']    , FILTER_SANITIZE_STRING);
    $address_zip        = filter_var($_POST['address_zip']      , FILTER_SANITIZE_STRING);
   
    
    if (!$fp) {
        exit();
    } else {     
        
        fputs ($fp, $header . $req);
        
        while (!feof($fp)) {
           $res = fgets ($fp, 1024);
           if (stripos($res, "VERIFIED") !== false)  {
                if($receiver_email == "emailaccountvenditore@xxxx.it"){
                         mysqlOperation($custom);
                }
           }
 

            if (strcmp ($res, "INVALID") == 0) {
             

            } 
        }//while   
    }//else
    
    

 

    
    

    
?>

Nel codice soprastante, abbiamo ipotizzato una funzione che verrà invocata nel caso di una transazione eseguita correttamente ovvero il decremento di un numero di crediti dal conto di un utente.

Sintatticamente, l’IPN riceve una chiamata dal Server di PayPal con diversi parametri passati attraverso l’array POST. Detto questo, l’IPN apre un socket in ascolto con PayPal e successivamente invia la stessa richiesta ricevuta in modo che lo stesso possa verificarne la corretezza e rispondere quindi con i messaggi ‘VERIFIED’ o ‘INVALID’.

Vuoi utilizzare lo strumento IPN PayPal per la tua piattaforma? Contattaci!

Velocità Connessione Speed Test ADSL

A seguito della delibera n. 244/08 il Garante delle Telecomunicazioni, ha avviato un progetto per la verifica della propria connessione ADSL al fine di garantire le reali promesse contrattuali dei provider dei servizi.

Da questo, ne scaturiscono due software liberalmente e gratuitamente scaricabili in grado di:
effettuare misurazioni certificate in modo da verificare i parametri reali di fornitura, con quelli promessi in fase di contratto. Qualora ci fossero delle discordanze, il programma consente di avere un certificato valido per è riconosciuto in termini legali in caso di discordanze regolamentari.

Per utilizzare il servizio, è necessario recarsi al link: https://www.misurainternet.it/registration_form.php ed effettuare una semplice registrazione al servizio. A seguito convalidazione tramite la mail, occorre accedere al portale tramite la pagina https://www.misurainternet.it/login_form.php con le credenziali di accesso fornite nella mail di convalida.

Successivamente occorre effettuare il download e l’esecuzione dei seguenti file:
Misura Internet Speed Test
Ne.Me.Sys

Dapprima avviamo Misura Internet Test e premiamo sul pulsante check in modo da accertare di avere le condizioni ideali per effettuare il test ovvero:

  • Essere collegati direttamente al router tramite il cavo Ethernet
  • Essere sicuri che non vi siano altri computer collegati sulla stessa rete
  • Avere abbastanza risorse di CPU e di RAM
  • Non essere collegati tramite Wireless o connessione telefonica (GPRS, UMTS, 3G ecc..)

Tutti questi prerequisiti, sono verificati dal software che indicherà con il colore verde in caso di successo o rosso altrimenti. In quest’ultima casistica è ovvio rettificare i parametri indicati come non conformi.

Quando tutti i test sono accettabili, è possibile avviare il test premendo sul pulsante verde di avvio. Al termini delle operazioni verranno mostrati i reali parametri di Ping, velocità di Download e di Upload.

Nel caso in qui questi valori fossero inferiori a quelli previsti dal contratto, si può utilizzare il software Ne.Me.Sys per generare un attestato che può essere usato per eventuali comunicazioni con il fornitore del servizio o per eventuali azioni legali.

Postfix con smtp esterno

Categorie:LinuxTags: , , ,

Configurare postfix all’invio di mail utilizzando un mail server esterno, è una pratica diffusa e la cui guida è disponibile in molti tutorial online ad esempio http://mhawthorne.net/posts/postfix-configuring-gmail-as-relay.html

Quando però, visionando i nostri file di log ci ritroviamo a sbattere su un errore tipo:

said: 530 5.7.0 Must issue a STARTTLS command first. p33sm6206256elf.16 (in reply to MAIL FROM command))

siamo davanti ad un BUG di POSTFIX. Per risolvere il problema, è sufficente editare il file /etc/postfix/main.cf e sostituire qualora presente, la riga
smtpd_use_tls=yes


con
smtp_use_tls=yes

Dividere un file

Categorie:Linux, PERLTags: , , , ,

In alcuni casi, può succedere che si abbia bisogno di dividere un file in sottoparti. Un esempio può essere parsing su file con dimensioni molto grandi. In questo caso uno script non riuscirebbe ad effettuare l’analisi sul testo in quanto non basterebbe la memoria allocata dal Sistema Operativo. Per ovviare al problema, si potrebbe andare a modificare le dimensioni di memoria allocate ad esempio utilizzando il comando ulimit su Linux per modificare l’allocazione delle diverse sezioni. Un’altra strada, è rappresentata dalla divisione del file in multi parti utilizzando linux. Ammettendo di avere un file contenente numerosi indirizzi e-mail, di dimensioni 1,2 Gb e denominato e-mail.txt, potremo ricorrere su una shell al comando

split -b Xm nome_file prefisso

quindi nel nostro esempio

split -b 200m e-mail.txt multi-

otterremo una serie di file ogni 200Mb con nome multi-a, multi-b, multi-c ecc…

Includere HTML in HTML

Categorie:HTML, PHPTags: , , ,

In un nostro recente lavoro ci è stato richiesto il collegamento ad una porzione di html da un sito esterno. Solitamente questo tipo di estensione viene effettuata utilizzando la tecnologia fornita dagli Iframe che, sostanzialmente, concede sul nostro sito l’apertura di una finestra (delle dimensioni volute) che si affaccia sul sito esterno. Il problema di questa tecnica è la gestione html del sito incluso.

Quando non siamo i proprietari del sito esterno diventa difficile, se non impossibile, gestire le funzioni del codice. Nel nostro caso specifico dovevamo includere il codice HTML da un sito, cercando di carpirne una serie di news, e ri-pubblicarle sul nostro sito.

Utilizzando gli Iframe abbiamo ottenuto un buon risultato ma, cliccando sui collegamenti ipertestuali, questi si aprivano all’interno della stessa finestra Iframe, rendendo impossibile la consultazione. L’unica soluzione possibile è stata la cattura dell’intero codice HTML utilizzato e, effettuando parsing riga dopo riga, siamo riusciti non solo a catturare la porzione di codice interessata, ma anche a modificarla introducendo, ad esempio, il target _blank agli url delle notizie, per evitare la dispersione dei nostri utenti.

Ad esempio, se volessimo includere la porzione di codice presente sul sito www . sitodaincludere . yyy:


In tal caso dobbiamo includere una lista di elementi che possiedono immagini e collegamenti ipertestuali, riferiti con path relativo, quindi non utilizzabili dal nostro sito. Vediamo ora il codice PHP utilizzato per scaricare la pagina, parserizzare e stampare a video la porzione di codice che ci interessa, sostituendo le parti da settare in base al nostro sito:

',$r)){
	$bool=true;
        $codice=$codice.$r
  }
 
  //Fin tanto che la variabile di controllo è vera
  if($bool){
        //Sostituiamo nella riga corrente, i path relativi con quelli assoluti
        $r=eregi_replace("/images/arrow_red.png", "http://www.sitodaincludere.yyy/images/arrow_red.png", $r);
        $r=eregi_replace("',$r)){
           $codice=$codice.$r;
           //Settiamo a false la variabile di controllo
	   $bool=false;
	}		
    }

}

//Stampiamo a video il risultato ottenuto
echo $codice;

?>

Includendo questo script PHP nel punto preciso della nostra pagina otterremo:


Buona programmazione a tutti!

© Copyright 2012 - Draco Corporation s.a.s - P.iva 03189390788 - Privacy Policy