Avatar billede LilleUdvikler Nybegynder
11. maj 2011 - 10:06 Der er 33 kommentarer og
1 løsning

Login script - adgangssider

Hej experter.

Jeg er i gang med et login script.

I det her script, skal man have adgang til en side, som man selvfølgelig ikke skal kunne komme ind på, hvis man IKKE er logget ind. Det går også fint nok, man kan ikke komme ind på siden, hvis man linker direkte efter filen - så bliver man redirected til login siden.

Det der så er mit problem er:

Jeg har en log ud funktion, som selvfølgelig skal logge brugeren fuldstændig ud, så man IKKE kan komme ind på siden der er beskyttet, med mindre man logger ind igen.

Men når man så er logget ud, så bliver man redirected til login siden igen. Men derfra kan man så bare trykke tilbage, også er man inde på siden igen. Dette skal IKKE være muligt.

Min kode ser sådan her ud:
//Her bliver man tjekket, om man er bruger eller ej, om adgangskode er rigtig eller ej. Osv osv.

<?php

include('connect_login.php');

// make clean xss function. som gør at man ikke kan køre sin egen database på vores database.

function cleanxss($input)
{
/// Prevents XXS Attacks www.itshacked.com
$search = array(
'@&lt;script[^&gt;]*?&gt;.*?&lt;/script&gt;@si',  // Strip out javascript
'@&lt;[\/\!]*?[^&lt;&gt;]*?&gt;@si',            // Strip out HTML tags
'@&lt;style[^&gt;]*?&gt;.*?&lt;/style&gt;@siU',    // Strip style tags properly
'@&lt;![\s\S]*?--[ \t\n\r]*&gt;@'        // Strip multi-line comments
);

$inputx = preg_replace($search, '', $input);
$inputx = trim($inputx);
if(get_magic_quotes_gpc())
{
$inputx = stripslashes($inputx);
}
$inputx = mysql_real_escape_string($inputx);
return $inputx;
}

// username and password sent from form
$brugernavn= ($_POST['brugernavn']);
$password= ($_POST['password']);
$password = md5($password);

//CleanXSS fjern XSS
$brugernavn = cleanxss($brugernavn);
$password = cleanxss($password);

// To protect MySQL injection (more detail about MySQL injection)
$brugernavn = stripslashes($brugernavn);
$password = stripslashes($password);
$brugernavn = mysql_real_escape_string($brugernavn);
$password = mysql_real_escape_string($password);


$sql= "SELECT * FROM $tbl_name WHERE brugernavn='$brugernavn' and password='$password'";
$result=mysql_query($sql);

// Mysql_num_row is counting table row
$count=mysql_num_rows($result);

// If result matched $myusername and $mypassword, table row must be 1 row
if($count==1){
// Register $myusername, $mypassword and redirect to file "login_success.php"
$_SESSION['loggedIn'] = $brugernavn && $password;

if(isset($_SESSION['loggedIn'])){
    include("loggedin.php");   
}

}
else
{
    echo "Der er sket en fejl. <br>
          <a href='#'>Har du glemt din adgangskode?</a> <br>
          <a href='opret.php'>Eller er du endnu ikke oprettet som bruger?</a>";
    include("main_login.php");
}

?>



--- loggedin.php ---
<?php
session_start();
$_SESSION['brugernavn'] = $brugernavn;
$_SESSION['password'] = $password; 

if(isset($_SESSION['brugernavn'])){

?>

Du er logget ind :-)

<p>Du har nu følgende muligheder:<br>
<a href="/nyheder/skriv_ny.php">Skriv en nyhed</a> - <a href="logout.php">Log ud</a></p>

<?php

}

else
{
    include("main_login.php");
}
?>

--- logout.php ----
<?
session_start();
session_destroy();
header("Location:main_login.php");
?>


--- Jeg håber nogen af jer gider kigge på det. Selvom der er lidt meget kode :-)
Avatar billede kjeldsted Novice
11. maj 2011 - 10:24 #1
Er den første kodebid main_login.php?
Avatar billede kjeldsted Novice
11. maj 2011 - 10:26 #2
Desuden bør du i logout.php også lige køre en

session_regenerate_id (true);
Avatar billede LilleUdvikler Nybegynder
11. maj 2011 - 10:34 #3
Hej kjeldsted.

Den første del er checklogin.php

Okay, det vil jeg gøre, tak :)
Avatar billede repox Seniormester
11. maj 2011 - 10:43 #4
Jeg synes at checklogin.php er temmelig overkill (og pudsigt sat sammen med en masse dobbeltkonfekt?). Da det kun er en login funktion kan du med fordel skære logindelen ned til:

<?php

include('connect_login.php');

$brugernavn= mysql_real_escape_string($_POST['brugernavn']); // mysql_real_escape_string er som regel fint, når du ikke skal indsætte i databasen, men blot hente
$password= md5($_POST['password']); // ingen grund til at 'rense' en MD5 hashet streng, da strengen alligevel ikke kommer til at indeholde noget snavs

$sql= "SELECT * FROM $tbl_name WHERE brugernavn='$brugernavn' and password='$password'";
$result=mysql_query($sql);


$count=mysql_num_rows($result);
if($count==1)
{
    $_SESSION['loggedIn'] = true;
  include("loggedin.php");
}
else
{
    echo "Der er sket en fejl. <br>
          <a href='#'>Har du glemt din adgangskode?</a> <br>
          <a href='opret.php'>Eller er du endnu ikke oprettet som bruger?</a>";
    include("main_login.php");
}

?>


Og i stedet for at bruge session_destroy kan du bruge unset($_SESSION["loggedIn"]) i stedet.

Men når du siger du bare kan trykke dig tilbage, for så at være logget ind igen, mener du så ikke også at browseren spørger om du vil poste loginoplysningerne igen?
Avatar billede LilleUdvikler Nybegynder
11. maj 2011 - 10:58 #5
Tak err0r.

Grunden til der var så mange ting, er fordi jeg skulle have alt det der med mySQL injection med også? Hvad gør jeg med det så? :)

Og, nej. Når jeg trykker tilbage, går den bare ind på siden.. Den ber ikke om at sende forespørgslen igen.
Avatar billede LilleUdvikler Nybegynder
11. maj 2011 - 10:59 #6
Fik lige læst i koden. Jeg behøver ikke mySQL injection beskyttelse her ;-) Jeg var lige lidt for hurtig, det er jeg ked af.
Avatar billede repox Seniormester
11. maj 2011 - 11:02 #7
Jo, selvfølgelig skal du have beskyttelse mod mysql injection - beskyttelsen var bare (efter min mening) fyldt med dobbeltkonfekt og virkede lidt overkill ;)

Hvis du kigger på koden kan du også se at jeg anvender mysql_real_escape_string)() på brugernavnet.

Er det sådan du har et sted man kan teste dit script? For jeg kunne godt tænke mig at se det i aktion, for at kunne forstå problematikken med at man bare kan trykke sig tilbage.
Avatar billede LilleUdvikler Nybegynder
11. maj 2011 - 11:04 #8
Har du en god artikel der omhandler mysql injection beskyttelse måske? Jeg har brugt dem der var, fra nettet af.

Er mysql_real_escape() nok, når jeg bare skal hente fra en database?

Ja, det har jeg da..

twimb.dk/login/main_login.php

Du kan bare oprette en bruger. :)
Avatar billede kjeldsted Novice
11. maj 2011 - 11:07 #9
Nu har jeg så lige forsøgt at logge ind. Hvis jeg logger ud og trykker tilbage spørger Firefox pænt om jeg vil sende forespørglsen igen.
Avatar billede kjeldsted Novice
11. maj 2011 - 11:09 #10
Og hvis jeg derimod copy-paster adressen http://www.twimb.dk/login/checklogin.php får jeg at vide at der er sket en fejl.

Så der er sgu faktisk ingen fejl du. repox har ganske ret.
Avatar billede LilleUdvikler Nybegynder
11. maj 2011 - 11:10 #11
Hvordan kan det så være, at jeg ikke får samme meddelelse som jer?

Har det noget med browser at gøre? Det skulle jeg ikke mene, da jeg normalt plejer at få den meddelelse med sådan noget.
Avatar billede repox Seniormester
11. maj 2011 - 11:14 #12
Ja, mysql_real_escape_string() er som udgangspunkt nok til når du skal anvende simple data - du skal bare huske på at intet er 100% sikkert i udviklingens verden ;) Men den er bedre end alle andre sjove funktioner man kan finde på nettet. I øvrigt var din cleanxss() funktion heller ikke til at sikre dig mod SQL injection, men for at sikre dig mod XSS angreb (Cross Site Scripting).

Men hvis du vil være endnu mere sikker på din MySQL kode, vil jeg anbefale dig at overgå til MySQLi ( http://php.net/mysqli ) og gå efter prepared statements... Det er en stor mundfuld, så tag du det i små bidder.

Men i hvert fald, så kan du undgå din fejl ved at redirecte brugeren til en anden side (f.eks. loggedin.php) i stedet for at inkludere den. Det tvinger browseren til at flytte sig fra den side du har postet dataene til og du vil ikke blive spurgt om du vil sende dataene igen, når du trykker dig tilbage.
Avatar billede kjeldsted Novice
11. maj 2011 - 11:17 #13
Hvilken browser benytter du?
Avatar billede LilleUdvikler Nybegynder
11. maj 2011 - 11:31 #14
Mange tak for dine svar repox.

Jeg vil prøve at kigge på dit link.

Når jeg redirecter bruger jeg header(); ikke? :)
Avatar billede LilleUdvikler Nybegynder
11. maj 2011 - 11:32 #15
Jeg bruger Safari :)
Avatar billede repox Seniormester
11. maj 2011 - 11:36 #16
#14
Jo, så kan du skrive header("Location: loggedin.php");
Avatar billede LilleUdvikler Nybegynder
11. maj 2011 - 11:38 #17
#16

Der ser ud til, at den ikke kan lade sig gøre med en header(); den kommer ind loggedin.php, men så viser den bare input boxene, hvor jeg så kan logge ind igen.
Avatar billede kjeldsted Novice
11. maj 2011 - 11:39 #18
Ligner en faktisk ikke særlig heldig bug i Safari. Den gør det også hos mig i Safari.
Avatar billede repox Seniormester
11. maj 2011 - 11:41 #19
Hvordan ser din kode ud nu? Både i checklogin.php og loggedin.php?
Avatar billede LilleUdvikler Nybegynder
11. maj 2011 - 11:41 #20
Nææ, der kan man bare se. Vi har fundet en bug i Safari, hehe ;-)
Avatar billede LilleUdvikler Nybegynder
11. maj 2011 - 11:42 #21
<?php

include('connect_login.php');

$brugernavn= mysql_real_escape_string($_POST['brugernavn']); // mysql_real_escape_string er som regel fint, når du ikke skal indsætte i databasen, men blot hente
$password= md5($_POST['password']); // ingen grund til at 'rense' en MD5 hashet streng, da strengen alligevel ikke kommer til at indeholde noget snavs

$sql= "SELECT * FROM $tbl_name WHERE brugernavn='$brugernavn' and password='$password'";
$result=mysql_query($sql);

$count=mysql_num_rows($result);
if($count==1)
{
    $_SESSION['loggedIn'] = true;
  header("location:loggedin.php");
}
else
{
    echo "Der er sket en fejl. <br>
          <a href='#'>Har du glemt din adgangskode?</a> <br>
          <a href='opret.php'>Eller er du endnu ikke oprettet som bruger?</a>";
    include("main_login.php");
}

?>



loggedin.php -->

<?php
session_start();
$_SESSION['brugernavn'] = $brugernavn;
$_SESSION['password'] = $password; 

if(isset($_SESSION['brugernavn'])){

?>

Du er logget ind :-)

<p>Du har nu følgende muligheder:<br>
<a href="/nyheder/skriv_ny.php">Skriv en nyhed</a> - <a href="logout.php">Log ud</a></p>

<?php

}

else
{
    include("main_login.php");
}
?>
Avatar billede repox Seniormester
11. maj 2011 - 11:49 #22
Den klump her i loggedin.php
$_SESSION['brugernavn'] = $brugernavn;
$_SESSION['password'] = $password;

if(isset($_SESSION['brugernavn'])){


Giver ikke meget mening.

Du kan i stedet bare skrive:
if(isset($_SESSION['loggedIn'])){


Så burde det virke...

Men personligt ville jeg nok selv gøre noget ala:
<?php
session_start();
if(!isset($_SESSION["loggedIn"]))
{
  header("Location: main_login.php");
  exit;
}
?>
Resten af min HTML side, hvis jeg er logget ind
Avatar billede LilleUdvikler Nybegynder
11. maj 2011 - 11:51 #23
Betyder "!" hvis det IKKE er? :-)

Og hvad gør: "exit;" godt for?
Avatar billede repox Seniormester
11. maj 2011 - 12:00 #24
Ja, du kan i princippet sige at hvis man skriver:
if(!10 == 11)
kunne der lige så godt stå
if not 10 == 11

exit; er med til at afslutte scriptet, så det ikke går videre - problematikken opstår hvis scriptet kan udføre ting - skrive i databasen, sende mails eller noget. Så vil scriptet stadig udføres helt, selvom brugeren sendes til en anden side. Det undgår du på den måde.
Avatar billede LilleUdvikler Nybegynder
11. maj 2011 - 12:14 #25
Jeg bruger nu hvad du har skrevet til mig. Det ser ud til, at den stadig har lidt bøvl med, at sende mig videre til loggedin.php

Du kan selv prøve.

username og pass: admin
Avatar billede repox Seniormester
11. maj 2011 - 12:19 #26
Jeg faldt lige over denne i checklogin.php:
$sql= "SELECT * FROM $tbl_name WHERE brugernavn='$brugernavn' and password='$password'";


Hvor bliver variablen $tbl_name sat henne?
Avatar billede LilleUdvikler Nybegynder
11. maj 2011 - 12:35 #27
i min connect_login.php

:

<?php

$host="**"; // Host name
$username="**"; // Mysql username
$password="**"; // Mysql password
$db_name="**"; // Database name
$tbl_name="medlemmere";

// opret forbindelse til database.
mysql_connect("$host", "$username", "$password")or die("cannot connect");
mysql_select_db("$db_name")or die("cannot select DB");

?>
Avatar billede repox Seniormester
11. maj 2011 - 12:46 #28
Kan du i din checklogin.php midlertidigt skifte:
header("location:loggedin.php");
ud med
echo "jeg skulle være inde";

bare for at se om du kommer ind i den rigtige indkapsling?
Avatar billede LilleUdvikler Nybegynder
11. maj 2011 - 13:27 #29
Jeg kommer ind så jeg kan se:

Jeg skulle ha været inde.
Avatar billede repox Seniormester
11. maj 2011 - 13:53 #30
Hmm... Måske noget stavefejl?
Location i header skal være med stort - og du skal have mellemrum mellem kolon og stedet du vil ende:
header("Location: logggedin.php");

Udover det, så prøv lige at poste hele indholdet af loggedin.php igen.
Avatar billede LilleUdvikler Nybegynder
11. maj 2011 - 14:01 #31
<?php
session_start();
if(!isset($_SESSION['loggedIn']))
{
  header("Location: main_login.php");
  exit;
}
?>

Du er logget ind :-)

<p>Du har nu følgende muligheder:<br>
<a href="/nyheder/skriv_ny.php">Skriv en nyhed</a> - <a href="logout.php">Log ud</a></p>
Avatar billede repox Seniormester
11. maj 2011 - 14:16 #32
Jeg tror det er fordi du mangler session_start(); i din checklogin.php?
Avatar billede LilleUdvikler Nybegynder
11. maj 2011 - 14:18 #33
Selvfølgelig!

Lækkert, så ser det ud til at fungere :) Vil du have nogle point? :)
Avatar billede repox Seniormester
11. maj 2011 - 14:21 #34
Jeg smider i hvert fald et svar :)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester