Omdirigering till login med dynamisk URL (?p=) funkar inte

Permalänk

Omdirigering till login med dynamisk URL (?p=) funkar inte

Jag har två sidor som bara ska kommas åt om användaren är inloggad. En för administratören och en för övriga användare. När en användare kommer till dessa sidor utan att vara inloggad vill jag att de skickas vidare till inloggningssidan. Det fungerar inte med den webbplatsen jag håller på med.

Jag använder ett skript på startsidan så att interna länkar inkluderas i en div-box på den sidan och mina länkar blir därför så här:

?p=mapp/filnamn

och det fungerar inte med

header('Location: /?p=admin/login');

Om jag däremot utesluter detta skript och använder vanliga länkadresser:

header('Location: /admin/login.php');

fungerar det som det ska, men jag vill inte behöva kopiera samma kod om och om igen för att få med header, footer, leftbar och rightbar på varje sida.

Jag har grubblat över detta i en evighet och förgäves har jag sökt efter ett svar. Idag har jag suttit med detta tidigare idag samt sedan klockan tio ikväll, men ingen lösning. Jag vet inte ens vad jag ska söka på. Vad är det jag inte förstår. Det var inte alls länge sedan jag hade ytterligare ett problem, just för att jag har en sådan länkadress.

Det här är scriptet som jag använder på sidan som jag inte ska kunna komma åt om jag inte är inloggad:

<?php session_start(); $username = $_SESSION['username']; include ('functions.php'); db_connect(); if(!empty($_SESSION['username'])){ $sql = mysql_query("SELECT username, usertype FROM users WHERE username='$username'"); $result = mysql_num_rows($sql); $row = mysql_fetch_array($sql); if($_SESSION['username'] = $username AND $row['usertype']==1){ $_SESSION['username'] = $username; $user_welcome = "Välkommen ".$username; } else{ //header('Location: /?p=admin/login'); die("<a href='?p=admin/login'>You have to login as admin to access this page!</a>"); } } else{ //header('Location: /?p=admin/login'); die("<a href='?p=admin/login'>You have to login to access this page</a>"); } ?>

Jag använder die för det är det enda som fungerar, men vill använda det som står i kommentaren.

Det kanske inte är hela världen att använda metoden jag gör idag, men problemet är att när jag får meddelandet att jag måste logga in för att se sidan, så försvinner högerfältet och det ser helknäppt ut.

Förutom detta funderar jag om det är säkert med detta skript för att hindra obehöriga? Det känns inte så, men säkerheten kanske bara är hänger på inloggningen? Finns det någon bra sida som förklarar bra hur en inloggning blir relativt säker?

Tillagt:
Tillagt:
Jag kom på att jag nyligen fick upp information om att den enda lösningen var att använda .htaccess mod rewrite. Jag hängde dock inte med på exakt vad jag skulle göra. Jag hade det på servern i alla fall. För tillfället känner jag inte för att servern ska strula. Är detta nåt som du lika enkelt bara raderar som du lägger dit det? En del saker kan ha förmågan att strula ihop andra saker och även om man gör det ogjort ligger nåt kvar och så får man rabies för att man inte finner lösningen.

Jag är också intresserad om det finns nån annan bra lösning än omdirigering. Det viktiga är att inte högermenyn försvinner.

Kom på en sak...
Permalänk
Medlem

Utan mod_rewrite förstår inte servern att parameter p avses vara en path. "?p=blah/bleh" är en query-string, en bit av en komplett URL. Genom att skriva header('Location: ?p=what/ever') omdirigerar du antagligen sidan till aktuell adress, men med ?p=what/ever tillagt på slutet, och parameterns värde blir tillgängligt för PHP genom $_GET['p'].

Det finns en del lösningar på problemet men omdirigering är det vanligaste och beprövat. Däremot tycker jag din inloggningscheck ser väldigt underlig ut. Med if ($_SESSION['username'] = $username AND $row['usertype']==1) kontrollerar du bara om usertype är lika med 1; den första biten, $_SESSION['username'] = $username, är en tilldelning som sätter värdet av $username i $_SESSION['username'].

En mindre detalj är att du skriver Välkommen istället för Välkommen. Detta är en kvarleva från mitten av nittiotalet och dålig praxis.

Visa signatur

Kom-pa-TI-bilitet

Permalänk
Skrivet av Teknocide:

Utan mod_rewrite förstår inte servern att parameter p avses vara en path. "?p=blah/bleh" är en query-string, en bit av en komplett URL. Genom att skriva header('Location: ?p=what/ever') omdirigerar du antagligen sidan till aktuell adress, men med ?p=what/ever tillagt på slutet, och parameterns värde blir tillgängligt för PHP genom $_GET['p'].

Det finns en del lösningar på problemet men omdirigering är det vanligaste och beprövat. Däremot tycker jag din inloggningscheck ser väldigt underlig ut. Med if ($_SESSION['username'] = $username AND $row['usertype']==1) kontrollerar du bara om usertype är lika med 1; den första biten, $_SESSION['username'] = $username, är en tilldelning som sätter värdet av $username i $_SESSION['username'].

En mindre detalj är att du skriver Välkommen istället för Välkommen. Detta är en kvarleva från mitten av nittiotalet och dålig praxis.

Att if ($_SESSION['username'] = $username AND $row['usertype']==1) bara kontrollerar om usertype = 1 hänger jag inte med på. I min logik, betyder ovanstående OM sessionen username är lika med $username och användartypen är lika med 1. Alltså om pågående session username är lika med en användare som finns i tabellen OCH om denna användare har värdet 1. Vad har jag missat?

Permalänk
Medlem

Du försöker göra en tilldelning ist för en jämförelse
Detta

if ($_SESSION['username'] = $username AND $row['usertype']==1)

ska nog vara

if ($_SESSION['username'] == $username AND $row['usertype']==1)

Permalänk
Medlem
Skrivet av suzanne68:

Att if ($_SESSION['username'] = $username AND $row['usertype']==1) bara kontrollerar om usertype = 1 hänger jag inte med på. I min logik, betyder ovanstående OM sessionen username är lika med $username och användartypen är lika med 1. Alltså om pågående session username är lika med en användare som finns i tabellen OCH om denna användare har värdet 1. Vad har jag missat?

Du har bara ett lika med-tecken och gör sålunda en tilldelning istället för jämförelse. Även om du hade skrivit rätt skulle kollen vara onödig då du tidigare har satt $username att innehålla värdet ur session: Du försöker jämför den mer sig själv.

Skickades från m.sweclockers.com

Visa signatur

Kom-pa-TI-bilitet

Permalänk

Det här med lika med tecknet var en miss. Hur ser en sådan här kod ut om den är korrekt? Alltså kontrollerar om användaren är inloggad och om det då är usertype 1. Just det här med session har jag inte fått grepp om och jag har lättare att förstå det felaktiga i denna kod om jag har en rätt kod att jämföra med, om den rätta koden är strippad med bara det nödvändiga för kontrollerna. Det är lättare för mig att se och jämföra än att få en beskrivning på vad jag ska göra.

Permalänk
Medlem
Skrivet av suzanne68:

Det här med lika med tecknet var en miss. Hur ser en sådan här kod ut om den är korrekt? Alltså kontrollerar om användaren är inloggad och om det då är usertype 1. Just det här med session har jag inte fått grepp om och jag har lättare att förstå det felaktiga i denna kod om jag har en rätt kod att jämföra med, om den rätta koden är strippad med bara det nödvändiga för kontrollerna. Det är lättare för mig att se och jämföra än att få en beskrivning på vad jag ska göra.

Har annoterat delar av koden nedan. Längre ner finns en städad version.

<?php session_start(); $username = $_SESSION['username']; // här tillderar du värdet av $_SESSION['username'] till $username (1.) include ('functions.php'); db_connect(); // vi behöver inte ha en databaskoppling här om $username inte är satt if(!empty($_SESSION['username'])){ // varför använder du inte $username här? $sql = mysql_query("SELECT username, usertype FROM users WHERE username='$username'"); $result = mysql_num_rows($sql); // denna verkar du inte använda $row = mysql_fetch_array($sql); if($_SESSION['username'] = $username AND $row['usertype']==1){ // här är det logiska felet som tidigare nämnts: du sätter $_SESSION['username'] till $username // En jämförelse görs med dubbla likamed-tecken, precis som är gjort i $row['usertype'] == 1. Detta är dock helt meningslöst eftersom du redan tidigare, se (1.), har satt $username till $_SESSION['username']. $_SESSION['username'] = $username; // här sätter du $_SESSION['username'] till $username en gång till, vilket även här är totalt verkningslöst. $user_welcome = "Välkommen ".$username; // bör vara "Välkommen $username" } else{ //header('Location: /?p=admin/login'); die("<a href='?p=admin/login'>You have to login as admin to access this page!</a>"); } } else{ //header('Location: /?p=admin/login'); die("<a href='?p=admin/login'>You have to login to access this page</a>"); } ?>

städad:

<?php $username = $_SESSION['username']; if (!empty($username)) { db_connect(); $querystring = mysql_real_escape_string( "SELECT COUNT(*) AS usercount FROM users WHERE username='$username' AND usertype=1" ); $result = mysql_query($querystring); if (mysql_result($result, 0, 'usercount') == 1) { echo "Välkommen $username!"; } else { die('Du har inte tillgång till denna sida'); } } else { die('Du måste logga in för att se denna sida'); } ?>

Typ något sådant; jag programmerar inte PHP.

Visa signatur

Kom-pa-TI-bilitet