Ho scritto una classe PHP che gestisce Session e li memorizza in DB invece dei normali File nel server, lo puoi trovare su My Session Handler Class
In quel post un utente per nome @AnotherGuy ha sollevato alcuni problemi / problemi di sicurezza riguardo al mio Session Fingerprinting methods
, che mi sembra valido, e lo cito qui sotto:
Now to the last thing I will talk about. As said in the start I am no security expert, but I feel like your fingerprint solution is fishy. Imagine two different people from the same company using your site. The company uses a load balancer, which makes their IP address the same. If all company's browsers/clients are the same your fingerprint for these two people would be identical. Even though you are checking HTTP_X_FORWARDED_FOR headers you cannot rely on load balancers to send the header. I cannot tell you how to properly detect sessions using the fingerprint idea.
Si riferiva alle funzioni getFingerPrint()
& _isSuspicious($fp)
/**
* [_getFingerPrint generates session fingerprints md5(USER AGENT + SECURE SESSION + IP ADDRESS)]
* @return [strings] [encryted session info fingerprint]
*/
private function _getFingerPrint()
{
return md5($this->_user_agent.self::SECURE_SESSION . $this->_ip_address);
}
/**
* [_isSuspicious check for possible session hijack attempt, by comaparing encrypted user system specific values against exoisting records ]
* @param [string] $fp [session fingerprint]
* @return boolean
*/
private function _isSuspicious($fp)
{
return ($fp != $this->_getFingerPrint()) ? True : False;
}
Sto usando getFingerPrint()
per generare un hash di sessione utilizzando l'agente utente + sale + indirizzo IP e _isSuspicious()
per controllare l'impronta digitale generata di nuovo contro l'impronta digitale memorizzata nel Database. Sembra che affronti il rischio di sicurezza fino alla stessa misura , ma quando gli utenti si trovano nella rete locale (LAN, ecc.) e utilizzano anche gli stessi agenti browser, sembrano essere fattibili al rischio di sicurezza di session hijacking
.
Inoltre sto usando la funzione qui sotto per ottenere l'indirizzo IP dell'utente,
/**
* [_getRealIpAddr Get the IP address of the user]
* @return [strings] [IP address of the client]
*/
private function _getRealIpAddr()
{
if (!empty($_SERVER['HTTP_CLIENT_IP']))
{
/*check ip from share internet*/
$ip = $_SERVER['HTTP_CLIENT_IP'];
}
elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR']))
{
/*to check ip is pass from proxy*/
$ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
}
else
{
$ip = $_SERVER['REMOTE_ADDR'];
}
return $ip;
}
Ora, come posso rendere questo hashing di sessione più solido quando gli utenti condividono lo stesso pool di reti.
La prima soluzione che mi viene in mente è l'aggiunta di un COOKIE
(sale saltuario / numero ecc.) All'hashing che sarà particolare per il sistema specifico dell'utente e nonostante abbia lo stesso agente utente e amp; indirizzo IP due utenti avranno cookie locali differenti. Chiunque ha altre soluzioni / opzioni migliori o un modo completamente diverso per gestire questa situazione?
Modifica 2: E riguardo all'uso di EVERCOOKIE [ma cosa succede se javascript è disabilitato? ]!