webForumDet fria alternativet

Fnuttar, konkatenering samt sessionsäkerhet

PHP

7 svar · 473 visningar · startad av bassebhu

Medlem sedan nov. 20016 480 inlägg
Frågan#1

Hej alla glada!

Det är dags att en gång för alla klargöra när man ska använda enkelfnuttar eller dubbelfnuttar och om man behöver konkatenera eller inte. Rätt grundläggande frågor egentligen hehe.

Vad är bäst av följande och vad är skillnaden?:

<?
$namn = "basse";
echo "Hej " . $namn;
echo "Hej $namn";
?>

Vad är bäst av följande och vad är skillnaden?:

<?
$_GET["basse"];
$_GET['basse'];
?>

Vad är bäst av följande och vad är skillnaden?:

<?
$link = '<a href="' . $_GET["basse"] . '">Länk</a>';
$link = "<a href=\"" . $_GET["basse"] . "\">Länk</a>";
?>

Och sista frågan. Är detta säkert eller ska jag lägga till något? Ser lätt ut att komma runt, men det kanske inte är det?

if(isset($_POST["submit"])) {
	if($_POST["name"] == "hemligtnamn" && $_POST["pass"] == "hemligtlosen") {
		$_SESSION["online"] = true;
		header("Location: admin.php");
		exit;
	} else {
		$wrongLogin = true; // Skriver ut felmeddelande nånstans längre ned på sidan
	}
}

// Sedan en check på skyddade sidor -->

if(!$_SESSION["online"] == true) {
	header("Location: index.php?noSession");
	exit;
}

Taxi!

Medlem sedan aug. 20039 340 inlägg
#2

Re: Fnuttar, konkatenering samt sessionsäkerhet

bassebhu skrev:

<?
$namn = "basse";
echo "Hej " . $namn;
echo "Hej $namn";
?>

Jag tror att echo "Hej $namn"; är snabbast, men däremot så har den andra varianten fördelen att man kan använda funktioner, typ: echo "Hej " . funktion($namn);

bassebhu skrev:

Vad är bäst av följande och vad är skillnaden?:

<?
$_GET["basse"];
$_GET['basse'];
?>

När jag har tittat på källkod har jag fått för mig att enkelfnuttarna används för konstanta värden, och kan möjligen vara lite fortare, men hugget som stucket prestandamässigt vågar jag ändå gissa på.

bassebhu skrev:

Vad är bäst av följande och vad är skillnaden?:

<?
$link = '<a href="' . $_GET["basse"] . '">Länk</a>';
$link = "<a href=\"" . $_GET["basse"] . "\">Länk</a>";
?>

Den största skillnaden är väl att exempel 1 blir något mer lättläst.

bassebhu skrev:

Och sista frågan. Är detta säkert eller ska jag lägga till något? Ser lätt ut att komma runt, men det kanske inte är det?

if(isset($_POST["submit"])) {
	if($_POST["name"] == "hemligtnamn" && $_POST["pass"] == "hemligtlosen") {
		$_SESSION["online"] = true;
		header("Location: admin.php");
		exit;
	} else {
		$wrongLogin = true; // Skriver ut felmeddelande nånstans längre ned på sidan
	}
}

// Sedan en check på skyddade sidor -->

if(!$_SESSION["online"] == true) {
	header("Location: index.php?noSession");
	exit;
}

Det är en relativt säker inloggning, men det hänger ju även på att du t ex använder method="post" på formuläret, kollar $_SESSION["online"] noga, har en utloggningsfunktion etc. Men jag rekommenerar att du skyddar lösenordet i källkoden lite bättre, t ex med md5-hash. Det bästa i det fallet är ju att lagra hashet i en databas som du kollar mot, men om du vill ha det hårdkodat kan du även köra echo md5("mitt lösenord"); på en temp-sida, och sedan kolla ...md5($_POST["pass"]) == "24354e2ae2ae..."... där du lägger in hash-strängen.

Medlem sedan nov. 20016 480 inlägg
#3

Tackar!

hash har jag hållt på med så det ska jag köra sedan mot databas - var mest sessions-delen jag funderade på. Det är omöjligt för en användare att ändra ett värde i en session med andra ord? Allt sparas väl på servern och ingen kan skapa egna sessioner/ändra existerande?

Medlem sedan aug. 20039 340 inlägg
#4

bassebhu skrev:

Det är omöjligt för en användare att ändra ett värde i en session med andra ord? Allt sparas väl på servern och ingen kan skapa egna sessioner/ändra existerande?

Precis. Men om någon lyckas fjärrstyra din dator kan han ju förstås sno ett sessions-id, men d kan ha ju iofs lika gärna formatera din hårddisk ;)

Medlem sedan nov. 20016 480 inlägg
#5

hehe ok.

Hur lång är en default-php-session och hur kan man ändra det värdet?
Hur fungerar en sessions livslängd och giltighet i övrigt.

Om en medlem loggar in men sedan glömmer att logga ut och sessionen blir därmed inte unsettat eller satt till false - när blir den ogiltig då och hur kan man optimera det? När han byter adress, när han stänger fönstret, när han stänger webbläsaren, efter en viss tid oavsett vad han har gjort av de tidigare alternativen?

Hur brukar man göra? Sätta en cookie samtidigt och på nåt sätt styra det? För en cookie utan tid dör väl när man stänger fönstret?
Är det en idé att sätta en session till 20 min när man loggar in och sedan plussa på 20 minuter varje gång användaren gör ett klick? Känns inte så optimalt iofs. Finns inget värre än att bli utloggad helt plötsligt. Hilfe!

Medlem sedan sep. 200436 inlägg
#6

http://se.php.net/manual/sv/function.session-set-cookie-params.php

Där står hur du ställer in hur länge en session ska vara giltig. Default är tills man stänger webläsaren. Men det beror på hur man confat ditt webhotell. Eftersom sessions själv kan styras via cookies så tror jag det automatiskt gör ditt plussa på 20minuter när man kör sessionstart och sedan kollar om session finns. Förutsatt att du valt tiden 20minuter. Men jag vet inte om det är så dock. Hursomhelst använda cookies behöver du bara göra för att skapa en autoinloggning och då kanske du inte ska använda sessionid utan något annat du sparar ner som loggar in användaren automatiskt.

Medlem sedan nov. 20016 480 inlägg
#7

Jag skapade en session igår och när jag gick in på samma sida idag så var jag fortfarande inloggad. Hur kommer det sig? Hade iofs inte stängt av webbläsaren men jag slog in adressen till en skyddad sida i ett nytt fönster. Om jag klickade på min logga-ut-knapp som förstörde sessionen så kom jag inte in på min skyddade sida, så sessions-checken bör fungera korrekt.

Om jag har skapat en session och låter sidan vara uppe och sedan trycker på refresh 2 dagar senare - återupplivas samma session då? Märkligt i så fall. (och jag är inte så korkad att jag sitter och uppdaterar en sida som skickar ett inloggningsformulär med redan ifyllda uppgifter igen)

Betyder detta att jag har ställt in min sessionslivslängd på "odödlig" i webbservern? What to do? 20 minuter låter bra om den nu automatiskt plussar på 20 minuter varje gång man gör en handling. Automatisk inloggning har jag klarat förut, men det är jag inte ute efter nu...

Medlem sedan aug. 20002 975 inlägg
#8

Får jag gissa att du antingen körde på din egen server lokalt, eller en server som har väldigt få besökare (åtminstone i skript med session_start).

Det finns två inställningar som är viktiga här:
session.gc_probability
session.gc_divisor

Om session.gc_probability är satt till 1 och session.gc_divisor till 100, så är sannolikheten att 1/100 att Garabage Collector körs vid anrop av session_start().
Garabage Collector rensar bort de sessionsfiler som är för gamla.

Är det din egen testserver skulle det inte ens räcka med att sätta bägge till 100, för servern skulle först ändra datum på filen, och sedan rensa bort de som är för gamla.

Vill du testa på en lokal testserver så får du sätta bägge till 100 (och starta om webbservern).
Kör i en webbläsare ditt skript.
Vänta minst 24 minuter (default-inställning), och besök din sida med en annan webbläsare.
Då ska din första webbläsares sessionsfil raderats.

281 ms totalt · 4 externa anrop · v20260731065814-full.a51de22e
129 ms — deklarationer (db)
0 ms — hämta statistik (cache)
142 ms — hämta tråd, inlägg och bilagor (db)
136 ms — ändringar (db)