La codifica base64

Questa codifica permette di rappresentare file binari (o anche file di testo) in un formato che usa una base di soli 64 caratteri scelti tra i 128 caratteri dell’ASCII standard 7 bit: quale insieme? dipende dalla particolare implementazione, ma fondamentalmente sono

  • i 26 caratteri Maisuscoli [A-Z], seguiti
  • dai 26 caratteri minuscoli [a-z], seguiti
  • dalle 10 cifre [0-9] e
  • dai segni + [più] e / [slash]

È una tabella composta quindi di 26+26+10+2 = 64 caratteri.

A cosa è dovuto questo che potrebbe sembrare un arzigogolo inutile?

La posta elettronica si basa su questa codifica, per esempio: gli allegati alla mail, quale che sia il loro tipo MIME (sia esso un pdf, un breve video o un audio), vengono convertiti in TESTO puro.

Perché la trasmissione di mail è su base TESTUALE, si trasmette testo. Così anche HTTP: Hyper TEXT Transfer Protocol. Le immagini e i file multimediali in genere che viaggiano su HTTP vengono precedentemente convertite in TESTO.

Lo schema di codifica è il seguente: supponiamo di dover trasmettere con un protocollo di testo (SMTP o HTTP) la stringa “CIAO”.

Prendiamo per ciascun carattere la corrispondente codifica ASCII in binario e ne raggruppiamo le cifre 6 a 6:


Algoritmo per la determinazione dei caratteri base64

Quindi 0 viene mappato in A, 1 in B e così via, fino 61 che viene mappato sul carattere 9, più 62 mappato in + e 63 in /

L’algoritmo prevede che il numero di bit debba essere multiplo di 6, per cui eventualmente si opera un padding (i 4 zeri verdi nel nostro caso); inoltre il numero di caratteri dev’essere multiplo di 4 per cui u questo caso si aggiungono da 0 a due caratteri =.

Varie implementazioni ritornano valori finali leggermente diversi: ad esempio, per evitare problemi inserendo una stringa base64 nell’URL, è necessario evitare il carattere /.

Nella mia implementazione Ubuntu:

$ base64 --version
base64 (GNU coreutils) 8.23
Copyright © 2014 Free Software Foundation, Inc.
Licenza GPLv3+: GNU GPL versione 3 o successive <http://gnu.org/licenses/gpl.html>
Questo è software libero: è possibile modificarlo e ridistribuirlo.
Non c'è ALCUNA GARANZIA, nei limiti permessi dalla legge.

Scritto da Simon Josefsson.

il risultato è

$ echo CIAO | base64
Q0lBTwo=

il padding, in questa implementazione, viene fatto con o=.

Per una immagine il procedimento è lo stesso: si prendono i bytes, si raggruppano per 6, si converte nei caratteri della tabella A-Za-z0-9+/ più eventuale padding

  • di zeri per arrivare ad un numero di bit multiplo di 6 e
  • di caratteri per arrivare ad un numero di caratteri multiplo di 4.

Pillole UNIX: acquisire il DNS dal server attraverso una sessione VPN

Mi sono imbattuto in questo problema.

Per accedere alla rete aziendale di un cliente in modo sicuro mi è stato assegnato un collegamento VPN che ho utilizzato mediante un client OpenVPN.

Lo script di configurazione del client però mancava delle istruzioni per acquisire gli IP del DNS necessari per navigare una volta collegati.

Ciò che succedeva era che la connessione era stabilita ma mi dovevo salvare in /etc/hosts gli indirizzi e i nomi delle macchine che volevo raggiungere, lavoro che di solito è svolto dal DNS aziendale.

Su imbeccata di un collega ho trovato la soluzione in questa risorsa che consiste nell’aggiungere in coda al file di configurazione del client queste istruzioni:

script-security 2
up /etc/openvpn/update-resolv-conf
down /etc/openvpn/update-resolv-conf

Il file resolv.conf non è editabile a mano perché viene sovrascritto dal sistema operativo (dal programma resolvconf nello specifico) ogni volta che si cambia la configurazione della rete. Nel file update-resolv-conf vengono analizzate le opzioni DHCP provenienti dal server openvpn al fine di aggiornare correttamente il file resolv.conf. In effetti adesso il file resolv.conf contiene i riferimenti necessari a navigare all’interno della rete aziendale:

$ cat /etc/resolv.conf 
# Dynamic resolv.conf(5) file for glibc resolver(3) generated by resolvconf(8)
# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN
nameserver 10.170.5.1
nameserver 10.170.5.2
nameserver 127.0.1.1
search company.domain.com

Prima della modifica invece avevo

$ cat /etc/resolv.conf 
# Dynamic resolv.conf(5) file for glibc resolver(3) generated by resolvconf(8)
# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN
nameserver 127.0.1.1

e quindi vedevo solo il mio pc.

Centrare verticalmente blocchi div con CSS2

Per centrare verticalmente un blocco testo, se questo è composto di una sola linea, è necessario specificare oltre all’altezza del contenitore div anche l’altezza della linea di testo e queste devono coincidere:

HTML

<div>blocco centrato verticalmente</div>

 

CSS

div
{
  height: 200px;
  line-height: 200px; /* <-- devi aggiungere questa */
  vertical-align: middle;
}

Per un testo multi riga, è sufficiente racchiuderlo in un ulteriore blocco span.

CSS

div
{
  height: 200px;
  line-height: 200px;
}

span
{
  display: inline-block;
  vertical-align: middle;
  line-height: 14px; /* <-- regolare questo */
}

[Fonte: StackOverflow]

 

 

Reverse DSN: recuperare un nome host da un indirizzo IP

Normalmente una query, una interrogazione, DNS parte da un nome host e risulta in un indirizzo IP

nslookup è una utility che appoggiandosi, ad un server di nomi, restituisce la risposta:

$ nslookup www.google.com
Server: 127.0.1.1
Address: 127.0.1.1#53

Non-authoritative answer:
Name: www.google.com
Address: 216.58.205.36
Normalmente nslookup fa la query ad un server di default, che in questo caso è il 127.0.1.1, il quale da una risposta non autoritativa o non autorevole, non essendo il server che possiede questo record (www.google.com); quindi si tratta di una coppia {host;ip_address} che ha nella cache locale.
Possiamo anche chiedere ad un diverso nameserver specificando l’indirizzo IP (es. x.y.z.w) come secondo argomento del comando:
$ nslookup www.google.com x.y.x.w
Qualora nslookup non trovasse questo nome nella cache locale, chiede al DNS di riferimento della rete a cui il computer è connesso, il quale a sua volta può contenere nella sua cache il record e rispondere non autorevolmente oppure, in caso contrario, fare riferimento al DNS del provider, e via così finché si arriva al possessore del record. Il meccanismo di cache serve proprio ad evitare questa catena di interrogazioni ogni volta che si chiama un certo host.

Diverso è il discorso se stiamo cercando l’host name di una macchina di cui siamo a conoscenza dell’indirizzo IP. Questo tipo di interrogazione è una interrogazione inversa e viene chiamata rDNS (r per reverse).

Il DNS inverso è controllato da chiunque sia il possessore dell’indirizzo IP. Egli può scegliere di delegare DNS inversi per un certo sottoinsieme di suoi indirizzi, cioè può scegliere di far fare questo lavoro ad un altro name server; il quale a sua volta può delegare un altro name server a gestire un sottoinsieme degli indirizzi IP che ha in gestione, e così via.

Alla fine, IANA “possiede” tutti gli indirizzi IP di internet. IANA delega questi indirizzi IP a 5 registri regionali:

E questi registri delegano i loro indirizzi IP ai fornitori di accesso a dorsale e, via via, agli ISP (Internet service Providers) fino agli utenti finali.

Dunque, su Internet, se volete controllare le query inverse sul DNS per il vostro indirizzo IP, dovete contattare il gestore che vi fornisce questo indirizzo IP e chiedergli di farvi una delega da installare nei vostri server DNS.

Per esempio se il vostro range di IP va da 1.2.3.0 a 1.2.3.255 allora la delegazione DNS inversa tipicamente si ottiene aggiungendo al vostro DNS la zona DNS “3.2.1.in-addr.arpa”.

Se dovete gestire uno o pochi indirizzi IP la procedura è leggeremente diversa. Si faccia riferimento alla RFC2317 per dettagli.

[Tutta la storia su Simpledns.com]

 

UNIX Pillole: scansionare una directory alla ricerca di una stringa in un file

Per cercare una stringa in un file possiamo utilizzare il comando grep:

$ cat multibox.html | grep result
Il file binario (standard input) corrisponde

come si vede però se il file è considerato come binario non ottengo informazioni utili.

 

Il seguente comando invece cerca le stringhe anche all’interno di un file binario:

$ strings -f *.html | grep result

file1.html: <div id="result" class="result">
file1.html: <table id="resulttable">
file2.html: <div id="result" class="result">

 

MySQL – gestione degli errori in inserimenti con valori nulli

mysqlSe cerchiamo di inserire dei valori nulli in un campo di una tabella dichiarato NOT NULL, il comportamento del DBMS MySQL è diverso a seconda della query che lanciamo, sulla base di un parametro di configurazione del server.

 

 

 

 

Ad esempio questa query cerca di inserire un valore null in una campo dichiarato not null (user_id):

insert into playlist(name, user_id) values ('ooo', null)

risultando in un errore:

Error Code: 1048. Column 'user_id' cannot be null

Ma se il campo non lo citiamo proprio:

insert into playlist(name) values ('ooo')

viene generato solamente un warning:

1 row(s) affected, 1 warning(s): 1364 Field 'user_id' doesn't have a default value

ed il record viene inserito lo stesso e viene forzato il valore del campo a 0 (se il campo è di tipo numerico) o a stringa vuota (se il campo è di testo).

Per evitare questo comportamento ed avere un comportamento coerente (errore in ogni caso) si deve modificare la proprietà sql_mode del DBMS :

set sql_mode = 'TRADITIONAL';

nel mio DBMS era impostata di fabbrica a

> select @@sql_mode

> NO_ENGINE_SUBSTITUTION

che è la proprietà che consente di NON sostituire automaticamente con InnoDB il motore di default in caso di non dichiarazione nelle istruzioni DDL come create table o alter table.

Per maggiori informazioni sui valori della variabile sql_mode e sulle combinazioni di valori, consultare il sito MySQL.

 

 

Francesco Vedovato illustra all’IQC di Waterloo lo stato della Comunicazione Quantistica in spazio libero

Quantum Communication e Quantum Computing sono le frontiere più promettente del prossimo futuro in chiave di comunicazioni, sicurezza e velocità di elaborazione.

Francesco Vedovato, un dottorando di ricerca che lavora nel gruppo Quantum Future del DEI di Padova, diretto dal prof. Paolo Villoresi, sta studiando proprio questo tipo di comunicazioni.

Nel video che segue Francesco illustra all’Institute of Quantum Computing dell’Universtià di Waterloo (Ontario, Canada) i risultati del lavoro nell’ambito del progetto di Comunicazione tra Terra e satelliti LEO (Low Earth Orbit), svolto dal gruppo Quantum Future in collaborazione con il Matera Laser Ranging Observatory.

Il talk risale ad agosto 2016.

 

Creiamo un’applicazione con Laravel

Con questo articolo creiamo da zero una applicazione PHP+Laravel.

PHP

Ci posizioniamo nella cartella htdocs della installazione del nostro web server (Apache, Ngnix, LiteSpeed,…)

$ composer create-project laravel/laravel middleware 5.2.*

MySQL

mysql > create database middleware;
mysql > grant all privileges on middleware.* to 'middleware' identified by 'secret';

Modifichiamo il file .env

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=middleware
DB_USERNAME=middleware
DB_PASSWORD=secret

Modifica di /etc/hosts

Occorre definire l’host che andremo ad invocare in modo tale che tcp/ip si connetta a localhost:

$ sudo nano /etc/hosts
127.0.0.1       localhost
127.0.0.1       cms.dev
127.0.1.1       jsbach js
127.0.0.1       api.trackye.com
127.0.0.1       smazing.dev
127.0.0.1       login.dev
127.0.0.1       middleware.dev

# The following lines are desirable for IPv6 capable hosts
::1     ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters

Ho aggiunto la riga in grassetto.

Diritti sulle cartelle

$ sudo chown -R www-data middleware/
$ sudo chmod o+x storage/
$ sudo chmod g+w laravel.log
$ sudo chgrp marcob laravel.log #altrimenti non posso lanciare comandi da bash

Fino a qui riesco a fare funzionare l’url http://localhost/middleware/public ma non http://middleware.dev. Per fare questo occorre

Creare un virtualhost

# middleware
<VirtualHost *:80>
        DocumentRoot /var/www/html/middleware/public
        ServerName middleware.dev
        <Directory /var/www/html/middleware/public>
                Options Indexes FollowSymLinks
                AllowOverride All
                Require all granted
        </Directory>
        ErrorLog ${APACHE_LOG_DIR}/error_middleware.log
        CustomLog ${APACHE_LOG_DIR}/access_middleware.log combined
</VirtualHost>

Riavviare Apache

$ sudo service apache2 restart

Creare il controller Auth per gestire la protezione degli accessi

$ php artisan make:auth
...
Authentication scaffolding generated successfully!

Queste istruzioni creano l’infrastruttura PHP per gestire la login. Però non viene creato nulla sul database, questo va fatto a mano tramite le migrazioni. Facendo riferimento alle due migrazioni che vengono create per default (la tabella users e la tabella password_resets) con artisan possiamo creare le tabelle nel database:

$ php artisan migrate
Migration table created successfully.
Migrated: 2014_10_12_000000_create_users_table
Migrated: 2014_10_12_100000_create_password_resets_table

Nel database vengono create e due tabelle:

 

 

 

 

 

 

 

 

In realtà esiste una terza che è migrations che è i log delle migrazioni che facciamo (nel linguaggio di Laravel una migrazione è uno script PHP che ha come effetto una modifica del database).

Alla fine ecco creata l’applicazione, alla quale accediamo con http://middleware.dev

Nuovo attacco phishing basato sulla tecnica punycode encoding

Attenzione!
Sono appena venuto a conoscenza da una newsletter di Wordfence di questo fatto allarmante.
Con una tecnica chiamata punycode encoding, un attaccante può farvi credere di trovarvi in un sito legale modificando addirittura l’indirizzo che vi compare sulla barra degli indirizzi: sfruttando una falla di Chrome e Firefox, unitamente alla possibilità di usare la codifica Unicode per i nomi di dominio, è possibile visualizzare una stringa identica a quella di un sito popolare anche se il dominio sottostante è tutto un altro.
Nell’articolo di Wordfence trovate un workaround per Firefox. Chrome a giorni dovrebbe rilasciare la fix per risolvere il problema.

Safari e Internet Explorer non sono affetti dal problema.

Questa tecnica è particolarmente insidiosa perché allo stato attuale non vi permette di distinguere il sito legale da quello contraffatto anche guardando il nome del dominio visualizzato dal browser.

In breve due soluzioni per accorgersi del problema (vi anticipo il contenuto dell’articolo):
1) aprire il certificato della crittografia cliccando sul lucchetto accanto al nome del dominio sulla barra degli indirizzi: lì vi compare il vero nome del dominio;
2) oppure fate copia incolla del nome del dominio in un editor come TextPad.

Modificare il size della UI Oracle SqlDeveloper

Il valore default della dimensione del carattere con cui è visualizzata l’interfaccia utente (non il font dell’editor!) è, almeno per i miei gusti, piuttosto piccolino.

C’è un modo per aumentarlo

  $ cd .sqldeveloper/system4.0.3.16.84/o.sqldeveloper.12.2.0.16.84

(occhio che dipende dalla versione, verificare nella propria installazione)

Aprire il file

  $ nano ide.properties 

alla voce

  # The default Ide.FontSize for Mac OS X.
  Ide.FontSize.Aqua=11

io ho modificato così

  # The default Ide.FontSize for Mac OS X.
  Ide.FontSize=16

ottenendo un bel miglioramento da

SqldeveloperPrima.png

a

SqldeveloperDopo.png