WN

WN (https://www.wn.se/forum/index.php)
-   Serversidans teknologier (https://www.wn.se/forum/forumdisplay.php?f=4)
-   -   PHP->Sessions->Object->Säkerhet? (https://www.wn.se/forum/showthread.php?t=13186)

FredrikMH 2006-03-28 12:04

Jag funderar lite över säkerheten i mitt system (som ännu ej är i bruk).

Det är så att jag använder session_register() på ett objekt av klassen User. Där användarnamn, lösenord osv finns lagrat. Detta för att jag vill på ett enktelt sätt komma åt all användarinformation på alla kommande sidor. Nu undrar jag om jag behöver kolla Objektet som kommer tillbaka så det inte har ändrats av användaren. Exemeplvis innuti objektet finns information lagrad om användaren är en vanlig användare, moderator eller en administratör.

Finns det möjlighet för användaren att modifiera detta och på så sätt skapa säkerhetshål i mitt script? I så fall behöver jag kontrollera all kritisk data överst i varje fil.

DeSoto 2006-03-28 12:26

Det är generellt sett inte bra att lagra objekt i sessionsvariabler, eftersom objektet först serialiseras (heter det så?) och sparas i en fil på servern, och sen avserialiseras (unserialize) nästa gång användaren skickar en request till servern. Detta tar onödigt lång tid. Det är bättre att lagra värdena i din databas, och skapa ett nytt objekt för varje request. Du ska försöka lagra så lite som möjligt i sessionsvariabler.

Eftersom sessionsvariabel-filen lagras på servern finns det inget sätt för en användare att ändra på den (såvida han inte har tillgång till servern). Risken som finns är dock att en användare får reda på ett sessions-id från en administratör, och lurar servern med det sessions-id:et att han är administratören.

kullervo 2006-03-28 13:00

Citat:

Originally posted by DeSoto@Mar 28 2006, 11:26
Det är bättre att lagra värdena i din databas, och skapa ett nytt objekt för varje request.
Du tycker alltså att det är skillnad på att lagra hela objektet i sessionen och att plocka ut datat och lagra det separat i sessionen? Samma sak i min mening. Jag föreslår att lagra hela objektet eftersom det är det resultatet han vill åt. Om det nu är långsammare att lagra hela sessionen så kan det inte vara många microsekunder.

Använder folk PHP's inbyggda session-hanterare till seriösa sajter? Det var länge sen jag ens tänkte på att det faktiskt finns en inbyggd i PHP. Den var kass för 4 år sedan (då jag senast hade med den att göra). Koda en egen istället. Det blir enklare i längden, ger mycket bättre prestanda, är mycket säkrare (om man har koll på bitarna) och är inte skadlig för hårddiskarna.

zoran 2006-03-28 14:00

Citat:

Originally posted by DeSoto@Mar 28 2006, 12:26
Det är generellt sett inte bra att lagra objekt i sessionsvariabler, eftersom objektet först serialiseras (heter det så?) och sparas i en fil på servern, och sen avserialiseras (unserialize) nästa gång användaren skickar en request till servern. Detta tar onödigt lång tid. Det är bättre att lagra värdena i din databas, och skapa ett nytt objekt för varje request. Du ska försöka lagra så lite som möjligt i sessionsvariabler.

Eftersom sessionsvariabel-filen lagras på servern finns det inget sätt för en användare att ändra på den (såvida han inte har tillgång till servern). Risken som finns är dock att en användare får reda på ett sessions-id från en administratör, och lurar servern med det sessions-id:et att han är administratören.

Och du har mätt prestandaskillnaden på serialisering->avserialisering av ett objekt kontra mysql-query och retur av data och kan presentera det för oss?

zoran 2006-03-28 14:06

Citat:

Originally posted by FredrikMH@Mar 28 2006, 12:04
Jag funderar lite över säkerheten i mitt system (som ännu ej är i bruk).

Det är så att jag använder session_register() på ett objekt av klassen User. Där användarnamn, lösenord osv finns lagrat. Detta för att jag vill på ett enktelt sätt komma åt all användarinformation på alla kommande sidor. Nu undrar jag om jag behöver kolla Objektet som kommer tillbaka så det inte har ändrats av användaren. Exemeplvis innuti objektet finns information lagrad om användaren är en vanlig användare, moderator eller en administratör.

Finns det möjlighet för användaren att modifiera detta och på så sätt skapa säkerhetshål i mitt script? I så fall behöver jag kontrollera all kritisk data överst i varje fil.

Du bör, som i alla andra fall, aldrig lagra ett lösenord i klartext. Ifall du har ett krypterat lösenord så tappar det sitt säkerhetsvärde. Med andra ord, spelar ingen roll om någon "får tag i det".

Du kan fortfarande autenticera mot det.

Jag brukar göra så här i en funktion för autenticering:

Ta användarnamnet som användaren skickar in,
Skapa en factory med användarobjekt (jag har få användare),
Hämta objektet med användarnamnet användaren skickade in,
Kryptera lösenordet användaren skickade in med lösenordet i användarobjektet jag fick som salt,
Om resultaten är samma som lösenordet i användarobjektet returnera objektet, annars null.

Sen i applikationen, om sessionen har ett userobjekt som inte är null, är användaren inloggad, annars inte.

FredrikMH 2006-03-28 14:12

Lösenord lagrar jag inte i klartext utan med md5().

zoran 2006-03-29 02:43

Citat:

Originally posted by FredrikMH@Mar 28 2006, 14:12
Lösenord lagrar jag inte i klartext utan med md5().
Dåså, vad har du att riskera ifall någon stjäl det?

Per 2006-03-29 08:42

md5:ar man utan salt krävs det endast att hitta en dublett för att logga in (jmf att använda salt då exakt lösenord måste hittas). Se vad zoran skrev, även om det kanske är smart att använda något mer än bara användarnamn som salt. För övrigt föredrar jag nog sha1.

zoran 2006-03-29 08:59

Citat:

Originally posted by Per@Mar 29 2006, 08:42
md5:ar man utan salt krävs det endast att hitta en dublett för att logga in (jmf att använda salt då exakt lösenord måste hittas). Se vad zoran skrev, även om det kanske är smart att använda något mer än bara användarnamn som salt. För övrigt föredrar jag nog sha1.
Nja, du missupfattade nog mig lite. Jag använder inte användarnamn som salt. När lösenordet skapas, (eller lagras första gången), används 2 random-bokstäver som salt. Däremot när jag ska verifiera lösenordet, måste jag kryptera det lösenordet som jag ska verifiera. För att krypteringen ska ge samma resultat, måste jag använda det krypterade lösenordet som salt (eller rättare sagt de två första bokstäverna).

freakalis 2006-03-30 15:52

Citat:

Originally posted by kullervo@Mar 28 2006, 13:00

Använder folk PHP's inbyggda session-hanterare till seriösa sajter? Det var länge sen jag ens tänkte på att det faktiskt finns en inbyggd i PHP. Den var kass för 4 år sedan (då jag senast hade med den att göra). Koda en egen istället. Det blir enklare i längden, ger mycket bättre prestanda, är mycket säkrare (om man har koll på bitarna) och är inte skadlig för hårddiskarna.

Jag är lite nyfiken hur skriver man sin egna sessionshanterare?


Alla tider är GMT +2. Klockan är nu 06:25.

Programvara från: vBulletin® Version 3.8.2
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Svensk översättning av: Anders Pettersson