PHP: come non confrontare gli hash

Provate ad eseguire questo codice:

<?php var_dump(md5('240610708') == md5('QNKCDZO'));
var_dump(md5('aabg7XSs') == md5('aabC9RqS'));
var_dump(sha1('aaroZmOk') == sha1('aaK1STfY'));
var_dump(sha1('aaO8zKZF') == sha1('aa3OFF9m'));
var_dump('0010e2' == '1e3');
var_dump('0x1234Ab' == '1193131');
var_dump('0xABCdef' == ' 0xABCdef');

In PHP l’operatore == è molto pericoloso in certi contesti, specialmente quello di sicurezza, in cui non si desidera che l’interprete del linguaggio faccia quello che il manuale definisce “type juggling”.

E’ vero: trovare una collisione di due hash che iniziano per 0e e contengono solamente cifre decimali non è facile, ma non è nemmeno impossibile perché ci sono 1038 hash SHA1 che contengono 0e seguito solamente da cifre decimali.

Forse è meglio utilizzare === e ricordare che lo strong typing è palloso per il 97% delle volte, ma per quel 3%…

Autore: Luigi Rosa

Consulente IT, sviluppatore, SysAdmin, cazzaro, e, ovviamente, geek.

Spazio per un commento