Avatar billede nimann Nybegynder
10. november 2005 - 15:01 Der er 8 kommentarer

Har et ikke-sikkert login script.

Jeg har siddet og rodet med et login script i PHP/MySQL hele natten, og er ved at være færdig nu. Men jeg har opdaget at der er et kææmpe hul i sikkerheden, og det går ikke ;)

Har lavet en login form med dette script som action:

<?

// Connect til databasen
include 'db.php';

// Dejlig nemt ;)
$username = $_POST['username'];
$password = $_POST['password'];

// Har de udfyldet begge felter?
if((!$username) || (!$password)){
  include 'head.php';
  echo "<center>Du skal udfylde Login, og Password før du kan komme videre</center><br>";
  include 'login_form.htm'; // Hvis ikke, så stik dem en login form!
  include 'foot.php';
  exit(); // Og afslut scriptet!
}

// Valider username og password via databasen
$sql = mysql_query("SELECT * FROM forhandler_login WHERE username='$username' AND password='$password'");
$login_check = mysql_num_rows($sql);

if($login_check > 0){
    while($row = mysql_fetch_array($sql)){
    foreach( $row AS $key => $val ){
        $$key = stripslashes( $val );
    }
        // Registrer session variabler
        session_register('tlf');
        $_SESSION['tlf'] = $username;
        session_register('adress');
        $_SESSION['adress'] = $adress;
        session_register('city_zip');
        $_SESSION['city_zip'] = $city_zip;
        session_register('navn');
        $_SESSION['navn'] = $navn;

        header("Location: findex.php");
  }
}  else {
    include 'head.php';
    echo "<center>Du kunne ikke logges ind. Enten har du skrevet forkert Login eller Password. Prøv venligst igen:</center>";
    include 'login_form.htm';
    include 'foot.php';
  }
 


 
?>


Det er jo også meget fint, men kan jo sagtens komme ind på den "hemmelige" side (findex.php) uden at logge ind.
Så snakkede jeg med en der sage at jeg bare skulle tilføje dette i toppen af alle de "hemmelige" sider:

function session_checker(){
if(!session_is_registered('username')){
include 'login_form.html';
exit();
}
}


session_start();
session_checker();

Det ville jo også virker.. Bare ikke heeeelt så godt som jeg kunne tænke mig ;) For med den løsning kan enhver lave sit eget lille script der registrere 'username', og så logge ind som hvem de havde lyst til..

Nej skal på en måde lave et lille stykke kode jeg includer i toppen af hver "hemmelig" side, som connecter til MySQL, og finder ud af om det er det rigtige login og pass...

Det skal lige siges at jeg har lært både PHP og MySQL løbende med den hjemmeside jeg har lavet som alt det her skal bruges til. Så det kan godt være at det er ekstremt næmt, men jeg kan ikke selv regne ud hvordan man skriver de 4-5 linier der skal til :P

På forhånd tak!

-Nimann
Avatar billede showsource Seniormester
10. november 2005 - 15:08 #1
lidt rodet login du har lavet der.

Men en måde til at tjekke om en session er sat:

<?php
session_start();

if(!isset($_SESSION["username"])) {
header("Location:loginform.php");
exit;
}
?>

resten af siden..................
Avatar billede nimann Nybegynder
10. november 2005 - 15:17 #2
"lidt rodet login du har lavet der."
-Ja, og jeg siger jo også at jeg er komplet nybegynder.. Det ser bedere ud i ConTEXT ;)

"Men en måde til at tjekke om en session er sat:"
-Ok, men det var jo ikke det jeg spurgte om.. Og desuden er det jo næsten det samme jeg selv har skrevet?
Avatar billede olebole Juniormester
10. november 2005 - 15:21 #3
<ole>

- måske fordi, showsource ikke syntes dit spm. gav mening  :)

Hvis man hvergang, en bruger skal checkes, skal slå op i en DB, er der jo ingen grund til, man har gjort så stort arbejde ud af at implementere sessions. En DB er ikke et hak mere sikker end en session.
Ikke hvis sessions er korrekt brugt ... og det er nok showsource's idé at få dig til at gøre det  ;o)

/mvh
</bole>
Avatar billede muddi Praktikant
10. november 2005 - 15:27 #4
Du har faktisk et hul mere i dit script idet det er modtageligt for SQL Injection.

Du bør ændre disse linjer:

$username = $_POST['username'];
$password = $_POST['password'];

Til dette

$username = addslashes($_POST['username']);
$password = addslashes($_POST['password']);

Ellers kunne enhver indtaste
username:  admin
password:  ' or '1'='1

og denne sætning

$sql = mysql_query("SELECT * FROM forhandler_login WHERE username='$username' AND password='$password'");

ville blive til

$sql = mysql_query("SELECT * FROM forhandler_login WHERE username='admin' AND password='' or '1'='1'");

og det er bestemt et sikkerhedhul... endda et der er meget nemt et opdage!

mvh Morten
Avatar billede muddi Praktikant
10. november 2005 - 15:35 #5
Hvis du f.eks. har en URL der ligner dette
http://dinside.dk/index.php?pageid=32

og du så blot laver et opslag i en tabel der f.eks. ser således ud

pageid  | title  | author | content
-------------------------------------
1        titel1  | dig    | blabla
2        titel2  | mig    | blabla
3        titel3  | dem    | blabla
...      ...    | ...    | ...
32        titel32 | Tom    | blabla

hvis du så bare henter pageid fra urlen med $_POST['pageid']

og har noget SQL ala "SELECT * FROM pages WHERE pageid = {$_POST['pageid']}"
så har du balladen igen... HUSK ALTID AT BRUGE addslashes på variabler der kan ændres af brugeren. Også selvom der er tale om skjulte tekstfelter o.l.!
Avatar billede nimann Nybegynder
10. november 2005 - 15:41 #6
Tak for det muddi!

olebole og showsource - jamen jeg skriver jo for at lære noget, og hvis det er rigtig når i siger at det er sikkert nok som jeg har gjordt kan jeg jo fortsætte smed ;) så mange tak for svaret!
ja det er også mit første spm. herinde, så jeg ved ikke hvordan man give de points ud?
Avatar billede muddi Praktikant
10. november 2005 - 15:45 #7
Du kan ikke give nogen points endnu fordi der ikke er nogen der har svaret ;)
Husk addlslashes fremover ... den kan redde dig fra meget besvær!

/Morten
Avatar billede showsource Seniormester
10. november 2005 - 15:47 #8
En hurtig omskrivning af login:

<?php
session_start();

if(isset($_POST["username"], $_POST["password"])) {
include("db.php");

$sql = mysql_query("SELECT * FROM forhandler_login WHERE username='". mysql_escape_string($_POST["username"]) ."' AND password='". mysql_escape_string($_POST["password"]) ."'");

    if(mysql_num_rows($sql) == 1) {
    $ar = mysql_fetch_array($sql);
    $_SESSION["tlf"] = $_POST["username"];
    $_SESSION["adress"] = $ar["adress"];
    $_SESSION["city_zip"] = $ar["city_zip"];
    $_SESSION["navn"] = $ar["navn"];
    header("Location:findex.php");
    exit;
    }else{
    echo"Fejl i login!";
    }
}

?>

Og alle sider som skal beskyttes, kan du så starte med min første post

Umiddelbart kan man ikke så'n lige selv lave sin egen session, og så godtages det af serveren
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

IT-JOB

Politiets Efterretningstjeneste

Platform Engineer hos PET

Forsvarsministeriets Materiel- og Indkøbsstyrelse

SAP-medarbejder til Roller & Autorisationer i Forsvarets Cyberdivision

Zealand Business College

Faglærer til Data/IT på ZBC i Ringsted

Forsvarsministeriets Materiel- og Indkøbsstyrelse

Kryptokustode til opbygning af Forsvarets nye IT-platform