Programmera i PHP/Loginkontroll

Från Wikibooks


Det finns många ondskefulla personer ute på Internet som gör vad de kan för att hacka databaser, därför måste vi ta med en del säkerhetsåtgärder. Bland annat tar vi bort speciella tecken som egentligen används av MySQL bara för att vara säkra på att databasen inte kan manipuleras utifrån.

I PHP kan man skriva ut information på skärmen på två sätt, det ena är med kommandot print, det andra med kommandot echo. De är likvärdiga och det är en smaksak vilket du väljer. bara du har "-tecken före och efter texten samt avslutar med ett semikolon. Problemet uppstår om du vill använda ett semikolon inuti texten. Då tror PHP att du avslutar texten vid det andra semikolonet, vilket du inte gör. För att få det att fungera måste du sätta en backslash framför \" .


I koden här nedanför finns:

$_SESSION['myusername'] = $myusername;
$_SESSION['mypassword'] = $mypassword;

Det innebär på svenska att servern sparar en liten textfil där ditt användarnamn och lösenord finns med. Så länge du inte stänger webläsaren kommer du att vara registrerad som inloggad, vilket är precis vad vi är ute efter. Vi vill ju inte att snokande elever skall kunna hitta allt du sparat i din lilla databas, eller hur? Genom att hålla reda på om du är inloggad eller inte kan vi skriva viss kod som visas för inloggade, och annan kod som visas för oinloggade.

I framtiden får du fylla i:

session_start()

i toppen på alla php sidor du tänker använda för att inte förlora din "biljett" på att du är inloggad i systemet.

Fyll i header och footer precis som i förra exemplet, och däremellan fyller du i:

<?php
  session_start();
//Olika viktiga variabler
// Filnamn checklogin.php
$host="localhost"; // Host , på en privat dator duger oftast localhost, det är ett IP nummer om basen finns på annan dator.
$username="root"; // Mysql användarnamn, antagligen root
$password="password1"; // Lösenord till root, kan t.ex. vara password1
$db_name="dataskolan"; // Databasens namn
$tbl_name="dataskolan_user"; // Tabellens namn

// Anslut till MySQL servern och välj rätt tabell
mysql_connect("$host", "$username", "$password")or die("Kan inte ansluta till databasen");
mysql_select_db("$db_name")or die("Kan inte välja datatabellen");

// Användarnamn och lösenord skickade från loginformuläret
$myusername=$_POST['myusername'];
$mypassword=$_POST['mypassword'];

// För att förhindra databashackning
$myusername = stripslashes($myusername);
$mypassword = stripslashes($mypassword);
$myusername = mysql_real_escape_string($myusername);
$mypassword = mysql_real_escape_string($mypassword);

//Välj rätt person utifrån inloggningsnamn och lösenord
$sql="SELECT * FROM $tbl_name WHERE LOGIN='$myusername' and PASS='$mypassword'";
$result=mysql_query($sql);

// Räkna antalet rader som hämtas, 1= ok, 0 = finns inte
$count=mysql_num_rows($result);

//Om man hittade en användare?
if($count==1){

// Registrera $myusername, $mypassword i sessionen och skicka användaren till filen "login_success.php"
 $_SESSION['myusername'] = $myusername;
 $_SESSION['mypassword'] = $mypassword;

header("location:login_success.php");
}
else {
echo "Fel användarnamn eller lösenord";
echo "<br>";
echo "<a href=\"main_login.php\">Tillbaka</a>";
}
//Om användarnamn och/eller lösenord var fel måste användaren få reda på det. En länk sänder honom tillbaka för ett nytt försök.
?>

Spara filen som checklogin.php i var/www mappen så att Apache kan hitta den.

login_success.php[redigera]

Nu behöver vi kunna göra en enkel test om inloggningen faktiskt fungerat. Koden (förutom header och footer) är:

<?php
//I framtiden måste följande fyra rader alltid finnas överst i varje fil där du vill begränsa åtkomst
session_start();
if(!session_is_registered(myusername)){
header("location:main_login.php");
}
?>

 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" dir="ltr" lang="sv-SE">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>Lyckad inloggning </title>
</head>
<body>

Din inloggning gick perfekt!
<a href="index.php">Till huvudsidan</a>

 </body>
 </html>

Logout[redigera]

Slutligen måste vi ju också ha ett sätt att logga ut användaren. Skapa en fil som heter logout.php och fyll i följande kod:

<?php
session_start();
session_destroy();
?>

 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" dir="ltr" lang="sv-SE">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>Utloggningssidan </title>
</head>
<body>

Du är utloggad.<br>
<a href="index.php">Till huvudsidan</a>

 </body>
 </html>

Genom att lägga in session_destroy så nollställs sessionen och man är inte längre behandlad som en inloggad användare.

index.php[redigera]

Vi behöver en sida där man alltid hamnar, där också dina elever hamnar. Från den sidan måste man kunna nå både inloggning och utloggning. Huvudsidan i varje webplats heter index och eftersom vi har en php sida får den heta index.php.

Överst måste vi ha:

<?php
//I framtiden måste följande rad alltid finnas överst
session_start();
?>

Därefter:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" dir="ltr" lang="sv-SE">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>Startsidan </title>
</head>
<body>


Här skriver vi in länkar och information:

 <?php
//Visa inloggning om ej inloggad, annars utloggning
if(!session_is_registered(myusername)){
echo "<a href=\"main_login.php\">Till inloggningssidan</a>";
}

if(session_is_registered(myusername)){
echo "<a href=\"logout.php\">Till utloggningssidan</a>";
}
?>


Slutligen behövs footern:

 </body>
 </html>


Spara alltihop som index.php i var/www mappen

Index.html[redigera]

Det händer att en webserver föredrar att visa upp en fil som heter index.html före index.php. Därför måste du skapa en index.html fil som också ligger i var/www katalogen som skickar användaren direkt till index.php. Annars måste man alltid skriva index.php för att komma in. Det finns ett kommado som heter metarfresh som brukar användas. Där ställer man in hur många sekunder man skall vänta innan en användare skickas till en annan sida, vi sätter den på 0 sekunder för direkt överföring, men har även en länk utifall något gått fruktansvärt fel.

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" dir="ltr" lang="sv-SE">
<head>
<meta http-equiv="refresh" content="0;index.php">
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>Startsidan </title>
</head>
<body>

<b>Nu är du allt litet vilse, klicka <a href="index.php">här</a> för att komma rätt.</b>

 </body>
 </html>

Spara den sedan som index.html surfa slutligen till http://127.0.0.1/ eller http://localhost för att se att allt verkligen fungerar. Det borde det göra nu, och du har ett fullt fungerande system med säker inloggning till egna sidor, fast det är inte särskilt många ännu.


Källa: http://www.phpeasystep.com/phptu/6.html