webForumDet fria alternativet

if , else

PHP

3 svar · 964 visningar · startad av MHZ

Medlem sedan apr. 200555 inlägg
Frågan#1

Efter massa pill ändrar jag frågan och undrar om detta ser bra ut? Verkar fungera eller om det kan göras bättre.

Skapat kakor

setcookie('userKaka', $userName, false);
setcookie('passKaka', $userPass, false);
setcookie('nivaKaka', $nivaKaka, false);

Som skydd på min sida har jag nu

$user = $row['user'];
$pass = $row['pass'];

if (intval($nivaKaka > 1) AND ($userKaka = $user) AND ($passKaka = $pass)) 
{
}
else 
{
header("Location: index.php");
}

Jag vill kolla både namn/pass samt vilken nivå man loggar in på.

Medlem sedan jan. 2005953 inlägg
#2

1. När du anropar setcookie så sätter du expire till false. Detta värde ska vara ett heltal, vilket gör att PHP gör om false till dess motsvarande heltal, vilket är 0. 0 är dessutom default-värdet för setcookies expire-parameter, det gör att du kan skippa att skicka med ett värde där och på så sätt få ner din filstorlek, om än ytterst lite :)

2. Vad innehåller $userPass? Jag hoppas att det är en hash av lösenordet, så att du inte lagrar lösenordet i klartext i kakan (samma sak gäller för databasen).

3. Eftersom du sätter expire till 0 så kommer kakan att försvinna när webbläsaren stängs. Varför använder du då kakor istället för sessioner?

4. Slutparentesen för anropet till intval() sitter fel i din if-sats. Ändra till intval($nivaKaka) > 1.

5. Vid omdirigering med header("Location") bör du lägga in exit() efter header-anropet, detta eftersom scriptet annars fortsätter exekveras

header("Location: index.php");
exit();

6. I koden du visar här så är if-satsen tom, är det så på din sida också? I så fall är det bättre att ändra logiken i if-satsen så att du kan skippa else.
Antingen kan du negera hela din befintliga logik

if (!(intval($nivaKaka) > 1 && $userKaka = $user && $passKaka = $pass)) {
    header("Location: index.php");
    exit();
}

eller så kan du "vända" på logiken

if (intval($nivaKaka) <= 1 || $userKaka != $user || $passKaka != $pass) {
    header("Location: index.php");
    exit();
}
Medlem sedan apr. 200555 inlägg
#3

Man kan välja 'false' eller '60 dagar' med kryssruta vid inlogg så därför använder jag kakor och det är en hash på lösenordet.

När det gäller skyddet för sidor verkar detta vara det jag söker

if (!(intval($niva) < 2 && $userKaka = $user && $passKaka = $pass)) {
header("Location: index.php");
exit;
}

I klartext fungerar det att alla under nivå 2 kan se sidan och de med nivå 2 skickas till inloggningen på index.php.

Ska även de på nivå 2 kunna se sidan bilr det

if (!(intval($niva) < 3 && $userKaka = $user && $passKaka = $pass)) {
header("Location: index.php");
exit;

Har jag förstått detta rätt nu?

Medlem sedan jan. 2005953 inlägg
#4

Ja det är korrekt förstått tror jag. Dock ser jag ett fel som jag missade tidigare. Ett likhetstecken är tilldelning, du vill göra en jämförelse och då är det dubbla likhetstecken som ska användas.

if (!(intval($niva) < 2 && $userKaka == $user && $passKaka == $pass)) {

Personligen hade jag föredragit att använda den andra varianten jag skrev:

if (intval($niva) > 1 || $userKaka != $user || $passKaka != $pass) {

då jag tycker att det är lättare att förstå den när man snabbt ögnar igenom koden, men som sagt, det är bara min personliga preferens.

254 ms totalt · 4 externa anrop · v20260731065814-full.1dc6f849
122 ms — deklarationer (db)
0 ms — hämta statistik (cache)
127 ms — hämta tråd, inlägg och bilagor (db)
124 ms — ändringar (db)