lunedì 24 dicembre 2018

I pericoli nascosti nei caratteri non visibili

La stringa che segue è composta da 7 caratteri:
a​​​​​b
Non ci credete? Provate a copiarla e incollarla in un editor, e contare i caratteri muovendovi con le freccette, partendo dalla sinistra della "a" per finire alla destra della lettera b.
La stringa "a​​​​​b" che vedete contiene 5 caratteri invisibili tra la "a" e la "b" ma non sono nascosti artificiosamente, sono cinque "zero width whitespace", ovvero cinque spazi di dimensione nulla. Ebbene si, esistono dei caratteri di questo tipo.

Dov'è il problema con questi caratteri, ed altri di questo tipo?
Immaginate di registrare dei nickname univoci, ma composti da qualsiasi carattere (basta stare attenti in fase di output in fondo): ad un rompiscatole basterebbe registrare nuovi utenti fittizi ed aggiungere questi caratteri nel nickname per fingersi qualcun'altro. Agli occhi degli altri utenti sarà lo stesso nickname.

venerdì 26 febbraio 2016

Attenzione a copiare i comandi linux

Sarà capitato anche a voi, programmatori con accesso ssh ad un server, di cercare comandi linux in giro.
Vi sarà capitato di imbattervi in stackexchange, in siti dedicati, in forum e quant'altro.
Ad un certo punto trovate il comando che vi serve, lo selezionate e lo eseguite, incollandolo, nella vostra shell.
Beh, non fatelo mai più.

Ho preparato un esempio molto semplice, eccolo qui:
ls -l
# ognuna di queste righe viene eseguita appena si incolla
# quindi faccio quello che mi pare
# con i permessi dell'utente loggato, magari root ;)
touch ciaociaociaociao.txt
# pulisco lo schermo, la history etc e torno al comando atteso
clear
ls -l
| grep ciao


Variante (facilmente utilizzabile nei forum dove è concesso l'uso di immagini):
ls -l 
# Variante con ALT di una immagine
# ognuna di queste righe viene eseguita appena si incolla<br>
# quindi faccio quello che mi pare
# con i permessi dell'utente loggato, magari root ;)
touch ciaociaociaociao.txt
# pulisco lo schermo, la history etc e torno al comando atteso
clear
ls -l | grep ciao


Se questo fosse un comando trovato in giro, probabilmente lo copiereste ed incollereste nella vostra shell: provate ad incollare qui per vedere cosa potrebbe accadere (è solo una textarea per vedere cosa avete copiato):


Incollando in una vera shell vedreste muoversi qualcosa, sparire tutto e vi ritrovereste con la vostra prompt in alto con il comando che vi aspettate. Potreste ignorare questo strano comportamento, sempre che ve ne accorgiate, o scoprire che avete appena eseguito qualcosa, ma in ogni caso è ormai troppo tardi!

Il trucco è semplice: all'interno della vostra selezione finisce del testo che non vedete: nel primo esempio un tag <span> con posizione assoluta lontano in alto a sinistra fuori dallo schermo (richiede del css in pagina o anche inline), nella seconda versione si tratta dell'attributo ALT delle immagini, che fornisce la versione testuale dell'immagine stessa..
Ho verificato come in alcune versioni di forum sia concesso l'uso di immagini con tanto di tag "alt", che è quanto basta per inserire minacce di questo tipo in giro.

Quello che si può combinare è senza confini, dall'installazione di backdoor al furto di file, il tutto limitatamente ai permessi dell'utente quantomeno, che però spesso ha poteri sufficienti per fare diversi tipi di danni.

Quello che posso consigliare, ovviamente, è di incollare prima in un editor di testi, per scrupolo!

martedì 24 febbraio 2015

1 kilobyte non sono 1024 byte


Condivido con voi, spero di non essere l'ultimo a saperlo e quindi di dare una informazione: ho appena scoperto che - a voler essere rigorosi - 1 kB (kilobyte) non sono 1024 byte, ma proprio 1000!! No, non mi confondo con i bit!
Lo stesso vale per Giga etc... provate a convertire 1 Gigabyte in byte con google e vedrete che anche lui la pensa così
https://www.google.it/search?q=1gigabyte+in+bytes
Ho così scoperto i "kibibyte", "mebibyte" e il "gibibyte"
SPIEGAZIONE BREVE PER CHI NON HA TEMPO:
I prefissi k, G etc appartengono al sistema internazionale, e sono sempre stati intesi per le potenze di 10 (10^3, 10^6) a differenza delle unità per misure binarie (2^10, 2^20...). Visto che 1024 era simile a 1000, si è accettata l'approssimazione e si è mantenuto il simbolo creando in molti casi delle ambiguità.

Per risolvere l'ambiguità esistono i "kibibyte", "mebibyte" ed i "gibibyte", che si scrivono KiB MiB e GiB. 
Usando questa unità di misura la conversione su Google è corretta
https://www.google.it/search?q=1GiB+in+bytes
Pare che anche MacOS X usi la notazione internazionale mostrando lo spazio con la conversione con potenze di 10 (1000 MB = 1 GB).

Precisazione finale: chi scrive "GB" al giorno d'oggi non sta usando sicuramente (o consapevolmente) il sistema Internazionale, quindi resta nell'ambiguità. C'è da dire, a mitigazione di questo discorso, che si usa il GB quando si ha al massimo un solo decimale.
E voi conoscevate i kibibyte ed i gibibyte?

mercoledì 1 maggio 2013

Come rendere asincrone le chiamate agli AdServer


Se avete sul vostro sito delle pubblicità saprete che le chiamate agli adserver si inseriscono nel punto in cui il banner deve essere mostrato. Di solito si tratta di una singola chiamata ad una funzione, definita da un file js esterno fornito dall'adserver, richiamato nei meta della pagina. Sarebbe tutto perfetto, ma...

C'è un problema!
Quella singola funzione javascript, che dovrebbe semplicemente iniettare il codice html del banner in quel punto della pagina, il più delle volte inserisce altri script, che richiamano altri script, che richiamano altri AdServer fino a fornirci il banner. In caso di rallentamenti nel recupero di risorse esterne o down momentaneo di qualche server ci si può ritrovare un sito “bloccato” per colpa delle pubblicità. E non è bello.


Possiamo rendere asincrone le chiamate all’adserver?
Gli adserver scrivono utilizzando la funzione javascript document.write(), che inserisce codice html nella pagina nel momento in cui viene eseguito, e quindi nel punto in cui il banner è richiamato.

Se vogliamo per qualche ragione avere un funzionamento asincrono, ovvero poter mettere i banner nelle loro posizioni al termine del caricamento della pagina, c’è una soluzione: 
ridefinire temporaneamente la funzione document.write
In javascript è possibile infatti ridefinire le funzioni, e le funzioni di oggetti come document non fanno eccezione, almeno sui browser su cui ho testato (fatemi sapere). Quindi possiamo creare una document.write che faccia quello che vogliamo noi, per poi rimetterla a posto.

A parole so' bboni tutti
Il tutto si risolve in pochissime righe di codice (ci aggiungo giusto un po’ di commenti), con una funzione come questa:


// copyright Ludovico Grossi, share, enjoy, modify and don’t forget credits!
// http://ludovicogrossi.blogspot.it/
function captureWrites(arg1, arg2) { // adapt the number of parameters for your needs
   var buffer;
   // backup the document.write function
   var document_write_bak = document.write;
   // redefine the document.write function
   document.write = function(input) {
       buffer += input;
   }
   // call the original script
   YourOriginalAdServerCall(arg1, arg2); // PUT YOU ORIGINAL ADSERVER CALL HERE
   // the function called our modified version of document.write, we will return it at the end
   // now we should restore the function
   document.write = document_write_bak;
   // and we finish!
   return buffer;
}



Nel codice HTML, dove dovete mostrare la pubblicità:


<div id=”ad300x250”>
<script type=”text/javascript”>
var ad300x250 = captureWrites(‘arg’, ‘arg2‘); // adapt the number of parameters for your needs
$(function () {
   $(“#ad300x250”).html(ad300x250);
});
</script>
</div>


In questo esempio uso jQuery giusto per inserire il contenuto nel div adibito al banner quando viene scatenato l’evento document.ready, così che venga eseguito subito, pur non bloccando il resto della pagina. Ovviamente potete (dovete) modificarlo secondo le vostre necessità, ad esempio ritardandolo con un


<script type=”text/javascript”>
var ad300x250 = captureWrites(‘arg’, ‘arg2‘);
window.setTimeout(function() {
   $(“#ad300x250”).html(ad300x250);
}, 3000);
</script>


o richiamandolo al window.load (fine del caricamento completo della pagina)


<script type=”text/javascript”>
var ad300x250 = captureWrites(‘arg’, ‘arg2‘);
$(window).load(function () {
   $(“#ad300x250”).html(ad300x250);
});
</script>





LG.

domenica 9 dicembre 2012

Dove la Apple può cambiarci (di nuovo) la vita

Il marchio Apple è diventato quasi sinonimo di lifestyle, visto il sempre maggiore peso dell'informatica nella nostra vita, ed in tempi moderni la vita la si vuole incredibilmente semplice.
Riflettendo sulla Apple post Steve, mi chiedevo come avrebbero potuto dei comuni esseri mortali trovare un nuovo spazio, legato all'informatica, decisamente innovativo ma non inventato, forse esistente in versioni "grezze" sul mercato.
La risposta è arrivata velocemente. Domotica. Un insieme di dispositivi Apple per la diffusione della musica in casa, gestione della televisione connessa ad internet (proseguendo quanto fatto per Apple TV), ma anche semplici controlli remoti, webcam, gestione luci e sveglie "integrate nella casa", il tutto controllato da tablet o smartphone. Dove si compra?
Pensando a dei prodotti Apple sarebbero, per loro qualità, dei must-have immediati e totali, capaci di spiazzare il mercato, diventare istantaneamente leader di settore, sfruttare tutto il mondo mobile e tablet che hanno contribuito a creare. La situazione è simile: un settore esistente, fornitori presenti, tecnologie utilizzate ma migliorabili, beneficio del prodotto per tutti.
Sono giocattoli troppo costosi? Attualmente si, ma non sempre i costi sono del tutto giustificati: conosco una startup che con un arduino integra maniglie, luci e porte in modo wireless.
Si può fare tanto, bene, a costi accessibili e in tempi ragionevoli.
Con grande godimento di chi li acquisterà.

venerdì 23 novembre 2012

La sicurezza delle bookmarklet

Scrivo questo post dopo una esperienza con le bookmarklet davvero intensa. Le bookmarklet, similmente ad alcuni tipi di estensioni, sono degli script che - detto molto semplicemente - possono agire sulla pagina web su cui vengono aperte. Le bookmarklet sono azionate dall'utente e generalmente svolgono funzioni di clipping, condivisione, editing etc.
Quanto dico di seguito sulle bookmarklet vale per le estensioni che hanno un comportamento simile di manipolazione del DOM.

lunedì 3 settembre 2012

Velocità = Conversione (ovvero: che rapporto c’è tra velocità delle pagine e il tasso di conversione?)

Quanto impiega il cervello a pensare ad altro?
Parto da questa domanda generica per una riflessione sul tasso di conversione. Tutto iniziò quando, a causa della lentezza della rete a cui mi ero collegato, per vedere una pagina web dovevo aspettare diversi secondi. Mi sono accorto che durante il caricamento finivo sistematicamente per pensare ad altro, dare una rapida occhiata alla webmail, aprire una ricerca su wikipedia o altro. Solo dopo diverso tempo mi ricordavo che stavo aspettando il caricamento di quella pagina e tornavo dove ero.
Questo ovviamente è un esempio estremo, ma riflettendo sulla cosa mi sono chiesto appunto quanto sia il tempo che il cervello impiega a pensare ad altro, e quindi quanto impieghiamo a distrarci. In fondo i pensieri che abbiamo quotidianamente non ci vengono mentre siamo chiusi in una camera a privazione sensoriale, ma intervengono nella nostra mente tra una azione e l’altra, tra un pensiero ed il successivo, si insinuano come possono, quando possono.