Ska göra en enkel inloggnings-funktion åt en kund.
Jag vill att när användaren har loggat in så skall nånå sorts "bevis" lagras i ett session-objekt så att personen kan navigera runt på sidan utan att hela tiden behöva logga in sig på vissa sidor.
Det ska finnas två olika typer av inloggade medlemmar:
vanliga användare som bara kan läsa informationen
och
admins som har rättighet till att lägga till/ändra/ta bort produkter.
Hur enkelt är det att kapa en session-objekt och luska ut innehåller ur den?
Jag hade tänkt mig att enbart lagra användarid, användar-typen(admin eller user) i session-objektet.
Om dessa två objekt hittas i sessionen så är medlemmen inloggad.
Jag är dock inte säker på att detta är ett bra sätt. Bör jag även lagra lösenordet i session-objektet och varje gång användaren besöker en skyddad sida så skall den sidan kontrollera att både lösenord och userid stämmer. Givetvis skall lödenordet vara krypterat.
Följdfråga blir då att hur krypterar jag lösenordet? Hur skall kontrollen dekryptera lösenordet för att kontrollera det mot databasens innehåll?
Kan man på nåt sätt skapa fake-sessions som då innehåller userid och på så sätt kringgå kontrollen ifall jag enbart kör med userid i session-objektet?
Ett enkelt sätt kan vara att spara användarens IP-nummer i sessionen och matcha det hela tiden som en check.
Byts IP:et men det är samma session så har sessionen mot all förmodan blivit kapad...
Det är ju bara adminsidorna som du behöver kolla rättigheterna på och då är ju sessions ett utmärkt val.
Man fyller i namn och lösen, dessa kollas och om de stämmer så sätts en session. Tycker inte att du behöver spara lösenordet i en session och kolla så det stämmer hela tiden. Risken för en sessionkapning är ju inte så stor.
När du sparar ett lösenord i databasen så kör du md5() på det först.
Innan du kontrollerar ett lösenord så måste du köra md5.
t.ex
if (isset($_POST['submit'])){
$pass = md5($_POST['passwd']);
$sql = "SELECT id FROM members WHERE user='{$_POST['user']}' AND pass='$pass'";
$result = mysql_query($sql);
// Hittades inte användarnamn och lösenord
// skicka till formulär med felmeddelande
if (mysql_num_rows($result) == 0){
header("Location: login.php?badlogin=");
exit;
}
// Sätt sessionen med unikt index
$_SESSION['sess_id'] = mysql_result($result, 0);
$_SESSION['sess_user'] = $_POST['user'];
header("Location: welcome.php");
exit;
}
...och om man vill göra det ännu finare så använder man mysql:s inbyggda funktion password() istället för md5(). :)
MySQL skrev:
Note: The PASSWORD() function is used by the authentication system in MySQL Server, you should not use it in your own applications. For that purpose, use MD5() or SHA1() instead.
Läste era mycket intressanta inlägg angående bra inloggning och säkerhetskontroll. Jag har hitintills kört med cookies som sätts vid inloggning och för varje sida kontrolleras att kakorna är identiska med uppgifterna i databasen. Är det bättre/säkrare/snabbare att använda sessions? Går sessions att kapa lättare än mina kontroller mot databasen kanske???
... Jag har hitintills kört med cookies som sätts vid inloggning och för varje sida kontrolleras att kakorna är identiska med uppgifterna i databasen. Är det bättre/säkrare/snabbare att använda sessions? Går sessions att kapa lättare än mina kontroller mot databasen kanske???
Om jag har förstått det rätt är sessioner mycket lättare att få säkert. Innehållet i en cookie kan läsas från klientens sida, medan en session inte kan läsas annat än av servern. Således är det lättare att bygga en säker inloggning mha av sessions än cookies.
tydal gav ett väldigt utförligt svar angående vad som krävs för säker inloggning med cookies för ett tag sedan. Jag ska se om jag hittar det... Se detta och framförallt detta inlägg. Dessutom står det en del om jämförelsen mellan cookies & databas kontra sessioner i Inloggning - bra och dåligt med olika idéer.