Anonimizzare le email di un database con uno script

È possibile anonimizzare un intero database, colonna per colonna, riga per riga, cella per cella usando un semplice script.

Lo script che vi propongo è stato scritto in PHP, in collaborazione con BriganteMik.

Prima di lanciarlo è necessario solo configurare opportunamente i parametri di accesso al database.

<?php

$servername = "localhost";
$username = "username";
$password = "password";
$dbname = "dbname";
$destinatario = "myemail.com"; // ES: "tolkien.us" will be <random-name>@tolkien.us


function email_cleanup($servername, $username, $password, $dbname){
    
    // Connecting to database
    $conn = new mysqli($servername, $username, $password, $dbname);
    if ($conn->connect_error) {
        die("Connection failed: " . $conn->connect_error);
    } else {
        print("Connected to db: ".$dbname);
    }

    $table_query = "SHOW TABLES";
    $result = $conn->query($table_query);

    while($row = $result->fetch_assoc()) {
        $table_name =  ($row['Tables_in_'. $dbname]);
        $columns_query = 'SHOW COLUMNS FROM ' . $table_name . '  WHERE (TYPE LIKE "VARCHAR%")'; // OR TYPE LIKE "TEXT")';
        $result_column = $conn->query($columns_query);
        var_dump("TABLE: " . $table_name); 
            while( $row_column =  $result_column->fetch_assoc() ) {
                $data_query = "UPDATE ". $table_name . " SET " . $row_column['Field'] . " = 
                    REPLACE(
                        " . $row_column['Field'] . ", 
                        SUBSTRING(
                            " . $row_column['Field'] . ", 
                            INSTR(" . $row_column['Field'] . ", '@') - 1
                        ), 
                        CONCAT(FLOOR(RAND() * (1000) +1),'@" . $destinatario . "'))
                    WHERE " . $row_column['Field'] . " RLIKE '[A-Z0-9._-]+@[A-Z0-9.-]+\.[A-Z]{2,4}'" ;
                $conn->query($data_query);
                var_dump("Query executed: $data_query");
            }
        }
    $conn->close();
}

Classi php reference, clone, duplicate

 

È molto interessante notare la differenza tra clonazione, duplicazione e referenza ad una classe. In questo piccolo articolo ci chiariremo le idee in tal senso.

Vi invito ad eseguire lo script che segue in un file .php

// Classe sorgente
$class = new stdClass();
// Assegnazione
$a = $class;
// Referenza
$b = &$class; // Clonazione
$c = clone $class; // Creo una proprietà per $class e gli assegno un valore. $class->roba = 'roba'; // Dump delle differenze var_dump($a); var_dump($b); var_dump($c);

Il risultato che io ottengo è il seguente:

object(stdClass)#1 (1) {
  ["roba"]=>
  string(4) "roba"
}
object(stdClass)#1 (1) {
  ["roba"]=>
  string(4) "roba"
}
object(stdClass)#2 (0) {
}

Come dobbiamo interpretare questo risultato?

La questione è molto semplice come possiamo vedere:

  • $class è la classe sorgente;
  • $a  rappresenta una copia di $class ottenuta per assegnazione (tramite l’operatore di assegnazione ‘=’);
  • $b referenzia $a, significa che è un puntatore alla risorsa, non un suo duplicato;
  • $c è invece un clone della classe.

Quello che vediamo nei 3 var_dump è:

  • che $a e $b si comportano allo stesso modo e dal numero identificativo della risorsa (quello con il cancelletto) capiamo che si tratta della stessa cosa (ovvero di puntatori a $class);
  • $c invece rappresenta una nuova istanza della classe (stdClass) ottenuta per clonazione.

List directories with php and compare them

Sometimes it’s important to quickly highlight differences between two folders structure.

It could happen expecially when you are obliged to work on cheap environments, without console and you need to understand if there are differences among your local filesystem and the remote one.

<?php

$dir = __DIR__;
$scan_result = scandir( $dir );
foreach ( $scan_result as $key => $value ) {
  if (!in_array($value, array('.', '..'))) {
    if (is_dir($dir . DIRECTORY_SEPARATOR . $value)) {
      print $value."<br/>";
    }
  }
}

You can copy the script in each directory and naming it scandir.php, than reach it by browser at the url http://path-to-your-base-folder/scandir.php.

In this way you have just executed the script, do it on each environment directory and occasionally compare them.

To compare there are Notepad++, git diff, WinMerge and plenty of open source tools.

Scandir is a php function, check it, I have wrote this code using an example I found there.