Vra

spesifiek dit is met betrekking tot by die gebruik van 'n kliënt sessie koekie om 'n sessie te identifiseer op die bediener.

Is die beste antwoord op SSL / HTTPS-enkripsie gebruik vir die hele webwerf, en jy het die beste waarborg dat niemand in die middel aanvalle in staat om 'n bestaande kliënt sessie koekie snuif sal wees?

En miskien tweede beste om 'n soort van enkripsie gebruik op die sessie waarde self wat gestoor word in jou sessie koekie?

As 'n kwaadwillige gebruiker fisiese toegang tot 'n rekenaar het, kan hulle steeds kyk na die lêerstelsel 'n geldige sessie koekie te haal en gebruik dit om 'n sessie te kaap?

Was dit nuttig?

Oplossing

Encrypting die sessie waarde sal nul effek hê. Die sessie koekie is reeds 'n arbitrêre waarde, versleutelen dit sal net genereer 'n ander arbitrêre waarde wat gebruik kan word snuif.

Die enigste werklike oplossing is HTTPS. As jy nie wil hê om SSL doen op jou hele werf (miskien jy het prestasie kommer), kan jy in staat wees om weg te kom met net SSL beskerming van die sensitiewe gebiede. Om dit te doen, maak eers seker jou inskrywing bladsy is HTTPS. Wanneer 'n gebruiker inteken, stel 'n veilige koekie (wat beteken dat die leser sal net stuur dit oor 'n SSL skakel) bykomend tot die gereelde sessie koekie. Dan, wanneer 'n gebruiker besoek een van jou "sensitiewe" gebiede, lei hulle om HTTPS, en kyk vir die teenwoordigheid van daardie veilige koekie. 'N ware gebruiker sal dit, 'n sessie kaper sal nie.

wysig : Hierdie vraag is oorspronklik geskryf in 2008. Dit se 2016 nou, en daar is geen rede om nie te SSL in jou hele site. Jy hoef nie meer plat HTTP!

Ander wenke

Die SSL help net met snuif aanvalle. As 'n aanvaller toegang tot jou masjien het sal ek aanvaar dat hulle kan jou veilige koekie te kopieer.

Op die heel minste, maak seker oud koekies verloor hul waarde na 'n ruk. Selfs 'n suksesvolle hijaking aanval sal die wiele gery toe die koekie nie meer werk nie. As die gebruiker 'n koekie van 'n sessie wat aangemeld meer as 'n maand gelede het, maak hulle hul wagwoord weer in te voer. Maak seker dat wanneer 'n gebruiker op die skakel na jou webwerf se "teken uit", wat die ou sessie UUID kan nooit weer gebruik.

Ek is nie seker of hierdie idee sal werk nie, maar hier gaan: Voeg 'n reeksnommer in jou sessie koekie, miskien 'n string soos volg:

SessionUUID, Serial Num, Huidige Datum / Tyd

Enkripteer hierdie string en gebruik dit as jou sessie koekie. Gereeld verander die reeks num - miskien wanneer die koekie is 5 minute oud en dan weer uit te reik die koekie. Jy kan selfs weer uit te reik dit op elke bladsy te sien as jy wil. Op die bediener kant, hou 'n rekord van die laaste reeks num jy het uitgereik vir daardie sessie. As iemand ooit 'n koekie met die verkeerde reeksnommer stuur dit beteken dat 'n aanvaller kan gebruik word om 'n koekie hulle vroeër onderskep so ongeldig die sessie UUID en vra die gebruiker om hul wagwoord weer in te voer en dan weer uit te reik 'n nuwe koekie.

Onthou dat jou gebruikers meer as een rekenaar mag hê, sodat hulle meer as een aktiewe sessie kan hê. Moenie iets wat dwing hulle om in te teken weer elke keer as hulle wissel tussen rekenaars nie.

Het jy al oorweeg lees van 'n boek oor PHP sekuriteit? Sterk aanbeveel.

Ek het baie sukses met die volgende metode vir nie SSL gesertifiseerde webwerwe.

  1. Dis-toelaat verskeie sessies onder dieselfde rekening, maak seker dat jy dit nie nagaan uitsluitlik deur IP-adres. Eerder kyk deur teken gegenereer op login wat gestoor word met die gebruikers sessie in die databasis, sowel as IP-adres, HTTP_USER_AGENT en dies meer

  2. Die gebruik van verband gebaseer hiperskakels Genereer 'n skakel (bv. http://example.com/secure.php?token=2349df98sdf98a9asdf8fas98df8 ) Die skakel is aangeheg met 'n x-byte (voorkeur grootte) ewekansige gesoute MD5 string, op bladsy herleiding die lukraak gegenereer teken kom ooreen met 'n versoek bladsy.

    • By herlaai, 'n paar tjeks word gedoen.
    • Oorsprong IP-adres
    • HTTP_USER_AGENT
    • Sessie gebrand
    • jy die punt.
  3. Kort Lewe-span sessie verifikasie koekie. soos hierbo gepos, 'n koekie met 'n veilige string, wat een van die direkte verwysings na die sessies geldigheid is 'n goeie idee. Maak dit verval elke x minute, heruitreiking wat teken, en weer sinchroniseer die sessie met die nuwe data. Indien enige mis-wedstryde in die data, óf teken die gebruiker uit, of om hulle weer te kontroleer hul sessie.

Ek is in geensins 'n kenner op die onderwerp, i'v het 'n bietjie ondervinding in hierdie spesifieke onderwerp, hoop 'n paar van hierdie help iemand daar buite.

// Collect this information on every request
$aip = $_SERVER['REMOTE_ADDR'];
$bip = $_SERVER['HTTP_X_FORWARDED_FOR'];
$agent = $_SERVER['HTTP_USER_AGENT'];
session_start();

// Do this each time the user successfully logs in.
$_SESSION['ident'] = hash("sha256", $aip . $bip . $agent);

// Do this every time the client makes a request to the server, after authenticating
$ident = hash("sha256", $aip . $bip . $agent);
if ($ident != $_SESSION['ident'])
{
    end_session();
    header("Location: login.php");
    // add some fancy pants GET/POST var headers for login.php, that lets you
    // know in the login page to notify the user of why they're being challenged
    // for login again, etc.
}

Wat dit beteken is capture 'kontekstuele' inligting oor sessie van die gebruiker se stukkies inligting wat nie moet verander gedurende die lewe van 'n enkele sessie. 'N gebruiker is nie van plan om by 'n rekenaar in die VSA en in China op dieselfde tyd, reg? So as die IP adres verander skielik in dieselfde sessie wat sterk impliseer 'n sessie kaping poging, sodat jy die sessie te beveilig deur die beëindiging van die sessie en dwing die gebruiker in staat om weer te kontroleer. Dit werk die hack poging, die aanvaller is ook gedwing om aan te meld in plaas van toegang tot die sessie. Stel die gebruiker van die poging (Ajax dit 'n bietjie), en vola, Bietjie vererg + ingelig gebruiker en hul sessie / inligting beskerm word.

Ons gooi in User Agent en X-GESTUUR-VIR na ons bes doen om uniekheid van 'n sessie te vang vir stelsels agter gevolmagtigdes / netwerke. Jy kan in staat wees om meer inligting te gebruik dan dat, voel vry om kreatief te wees.

Dit is nie 100% nie, maar dit is redelik damn effektiewe.

Daar is meer wat jy kan doen om sessies te beskerm, verval hulle as 'n gebruiker 'n webwerf verlaat en kom terug dwing hulle om miskien weer aanteken. Jy kan 'n gebruiker op te spoor verlaat en terug te kom by die opneem van 'n leë HTTP_REFERER (domein getik in die URL bar), of kyk of die waarde in die HTTP_REFERER gelyk jou domein of nie (die gebruiker gekliek n eksterne / vervaardigde skakel na te kom jou webwerf).

verloop sessies, moenie toelaat dat hulle onbepaald geldig bly.

Moenie staatmaak op koekies, kan hulle gesteel word, is dit een van die draers van die aanval vir sessie kaping.

Probeer Veilige Cookie protokol in hierdie papier deur Liu, Kovacs, Huang, en Gouda:

Soos in dokument:

  

'n veilige   koekie protokol wat loop tussen 'n kliënt en 'n bediener   moet die volgende vier dienste:. verifikasie, vertroulikheid, integriteit en anti-herhaling

As vir die gemak van ontplooiing:

  

In terme van doeltreffendheid, ons protokol geen databasis betrek   lookup of publieke sleutel kriptografie. In terme van deployability, kan ons protokol maklik ontplooi word op 'n bestaande webbediener, en dit maak nie enige verandering aan benodig   die Internet koekie spesikasie.

In kort:. Dit is 'n veilige, liggewig, werk vir my net groot

Daar is geen manier om sessie hijaking 100% voorkom, maar met 'n paar benadering kan ons verminder die tyd vir 'n aanvaller die sessie hijaking.

Metode om te verhoed dat sessie hijaking:

1 - gebruik altyd sessie met SSL sertifikaat;

2 - stuur sessie koekie net met httponly gestel is (voorkom JavaScript om toegang te verkry sessie koekie)

2 - gebruik sessie wedergeborenes id by login en logout (let wel:. Gebruik nie sessie herstel by elke versoek, want as jy agtereenvolgende Ajax versoek dan moet jy 'n kans om verskeie sessie te skep)

3 - stel 'n sessie timeout

4 - winkel leser gebruiker agent in 'n $ _SESSION veranderlike 'n vergelyk met $ _SERVER [ 'HTTP_USER_AGENT'] by elke versoek

5 - stel 'n teken koekie, en stel verstryking tyd van daardie koekie tot 0 (totdat die leser gesluit). Regenereer die koekie waarde vir elke versoek. (Vir Ajax versoek nie teken koekie herstel). Ex:

    //set a token cookie if one not exist
    if(!isset($_COOKIE['user_token'])){
                    //generate a random string for cookie value
        $cookie_token = bin2hex(mcrypt_create_iv('16' , MCRYPT_DEV_URANDOM));

        //set a session variable with that random string
        $_SESSION['user_token'] = $cookie_token;
        //set cookie with rand value
        setcookie('user_token', $cookie_token , 0 , '/' , 'donategame.com' , true , true);
    }

    //set a sesison variable with request of www.example.com
    if(!isset($_SESSION['request'])){
        $_SESSION['request'] = -1;
    }
    //increment $_SESSION['request'] with 1 for each request at www.example.com
    $_SESSION['request']++;

    //verify if $_SESSION['user_token'] it's equal with $_COOKIE['user_token'] only for $_SESSION['request'] > 0
    if($_SESSION['request'] > 0){

        // if it's equal then regenerete value of token cookie if not then destroy_session
        if($_SESSION['user_token'] === $_COOKIE['user_token']){
            $cookie_token = bin2hex(mcrypt_create_iv('16' , MCRYPT_DEV_URANDOM));

            $_SESSION['user_token'] = $cookie_token;

            setcookie('user_token', $cookie_token , 0 , '/' , 'donategame.com' , true , true);
        }else{
            //code for session_destroy
        }

    }

            //prevent session hijaking with browser user agent
    if(!isset($_SESSION['user_agent'])){
        $_SESSION['user_agent'] = $_SERVER['HTTP_USER_AGENT'];
    }

    if($_SESSION['user_agent'] != $_SERVER['HTTP_USER_AGENT']){
      die('session hijaking - user agent');
    }

Let wel: nie teken koekie met Ajax versoek regenereer wel: die kode hierbo is 'n voorbeeld. wel: indien gebruikers afteken dan die koekie teken moet vernietig word, sowel as die sessie

6 - dit is nie 'n goeie hoek te benader om gebruikers IP gebruik vir die voorkoming van sessie hijaking omdat sommige gebruikers IP verandering met elke versoek. Wat 'n invloed GELDIG GEBRUIKERS

7 - persoonlik ek sessie data te stoor in die databasis, is dit aan jou watter metode jy neem

As jy fout vind in my benadering asseblief vir my reg te stel. As jy meer maniere om sessie hyjaking voorkom asseblief vir my sê.

Maak seker jy gebruik nie incremting heelgetalle vir sessie-ID's. Baie beter om 'n GUID, of 'n ander lang lukraak gegenereerde karakterstring te gebruik.

Daar is baie maniere om beskerming teen sessie kaping skep egter almal van hulle is óf tevredenheid van die gebruikers te verminder of is nie veilig nie.

  • IP en / of X-GESTUUR-VIR tjeks. Hierdie werk, en is redelik veilig ... maar dink die pyn van gebruikers. Toe kom hulle by 'n kantoor met WiFi, kry hulle nuwe IP-adres en verloor die sessie. Het weer log-in.

  • User Agent tjeks. Dieselfde as hierbo, nuwe weergawe van die leser is uit, en jy 'n sessie te verloor. Daarbenewens, dit is regtig maklik om te "hack". Dit is triviaal vir hackers om vals UA snare stuur.

  • localStorage teken. Op log-on genereer 'n teken, stoor dit in die leser stoor en stoor dit tot geïnkripteer koekie (geïnkripteer op bediener-kant). Dit het geen newe-effekte vir gebruiker (localStorage voortduur deur die leser opgraderings). Dit is nie so veilig - as dit is net sekuriteit deur die onbekendheid. Verder kan jy 'n paar logika (enkripsie / dekripsie) voeg by JS om verder te verduister nie.

  • Koekie heruitreiking. Dit is waarskynlik die regte manier om dit te doen. Die geheim is om net laat een kliënt na 'n koekie te gebruik op 'n slag. So, sal aktiewe gebruiker het koekie re-uitgereik elke uur of minder. Ou koekie ongeldig as nuwe een uitgereik. Hacks is steeds moontlik, maar baie moeiliker om te doen - hetsy hacker of geldige gebruiker sal kry toegang verwerp.

Kom ons dat oorweeg tydens die aanteken fase van die kliënt en bediener kan saamstem oor 'n geheime sout waarde. Daarna sal die bediener bied 'n telling waarde met elke update en verwag dat die kliënt om te reageer met die hash van die (geheime sout + telling). Die potensiële kaper het geen manier om hierdie geheim sout waarde te verkry en dus kan nie genereer die volgende hash.

AFAIK die sessie voorwerp is nie toeganklik nie by die kliënt, as dit geberg word by die webbediener. Dit is egter die sessie ID gestoor as 'n koekie en dit laat die web bediener te spoor sessie van die gebruiker.

Om sessie kaping met behulp van die sessie-ID te voorkom, kan jy 'n hashed string binne die sessie voorwerp te slaan, gemaak met behulp van 'n kombinasie van twee eienskappe, afgeleë addr en afgeleë hawe, wat kan verkry word by die webbediener in die versoek voorwerp. Hierdie eienskappe bind die gebruiker sessie aan die leser waar die gebruiker in geteken nie.

As die gebruiker inteken in 'n ander leser of 'n incognito-modus op dieselfde stelsel, die IP addr sal dieselfde bly, maar die hawe sal anders wees. Daarom, wanneer die aansoek is toeganklik, die gebruiker sal 'n ander sessie ID toegeken deur die webbediener.

Hier is die kode wat ek geïmplementeer en getoets deur die kopiëring van die sessie-ID van een sessie na 'n ander. Dit werk baie goed. As daar 'n leemte, laat my weet hoe jy dit nageboots.

@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
    HttpSession session = request.getSession();
    String sessionKey = (String) session.getAttribute("sessionkey");
    String remoteAddr = request.getRemoteAddr();
    int remotePort = request.getRemotePort();
    String sha256Hex = DigestUtils.sha256Hex(remoteAddr + remotePort);
    if (sessionKey == null || sessionKey.isEmpty()) {
        session.setAttribute("sessionkey", sha256Hex);
        // save mapping to memory to track which user attempted
        Application.userSessionMap.put(sha256Hex, remoteAddr + remotePort);
    } else if (!sha256Hex.equals(sessionKey)) {
        session.invalidate();
        response.getWriter().append(Application.userSessionMap.get(sessionKey));
        response.getWriter().append(" attempted to hijack session id ").append(request.getRequestedSessionId()); 
        response.getWriter().append("of user ").append(Application.userSessionMap.get(sha256Hex));
        return;
    }
    response.getWriter().append("Valid Session\n");
}

Ek gebruik die SHA-2 algoritme om die waarde met behulp van die gegewe by SHA voorbeeld hash -256 Hashing by baeldung

Ons sien daarna uit om jou kommentaar.

Om die risiko wat jy kan ook die oorsprong IP assosieer met die sessie te verminder. Op dié manier 'n aanvaller het om binne dieselfde private netwerk wees om in staat wees om die sessie te gebruik.

Checking Referer kop kan ook 'n opsie wees, maar dit is makliker bedrieglike.

Beskerm deur:

$ip=$_SERVER['REMOTE_ADDER'];
$_SESSEION['ip']=$ip;
Gelisensieer onder: CC-BY-SA met toeskrywing
Nie verbonde aan StackOverflow
scroll top