Gå til innhold

Mitt føste (sikre?) innloggingsystem


Anbefalte innlegg

Håper dere kan få bruk for dette scriptet ;)

Jeg har ikke stor peiling på sikkerhet, så det hadde vært fint med tilbakemelding.

 

//index.php:
<?php
include("pass.php");
if (!isset($_GET['logg'])) { ?>

<form action="<?php print $_SERVER['PHP_SELF']; ?>?logg=ja" method="post">
Brukernavn: <input type="text" name="user"><br />
Passord: <input type="password" name="pass"><br />
<input type="submit" value="Logg inn!">
</form>

<?php
} else if ($_GET['logg'] == "ja") {
passord("logged.php");
}
?>

 

// pass.php
<?php
session_start();
function passord($neste) {
$brukernavn = $_POST['user'];
$passord = sha1(md5($_POST['pass']));
$file = file_get_contents('pass.txt');
$lines = explode("\n", $file);
$top = count($lines);
for ($i = 0; $i < $top; $i++) {

 $all = $lines[$i];
 $new = explode("|", $all);
 $new[1] = trim($new[1]);
 if (($brukernavn == $new[0]) && ($passord == $new[1])) {

   $_SESSION['auth'] = $new[2];
   header("Location: $neste");
 }
}
echo "Feil passord";
}
?>

Okey... Dette er standar scriptene. Det øverste er bare en logginn-form, mens den nederste er innlogginga. Her er min hemmelig side "logged.php", hvis du vil ha noe annet så er det bare å endre: passord("filnavn_til_beskyttet_fil.php");

 

// logged.php
<?php
session_start();
if ($_GET['logg'] == "ut") {
$_SESSION['auth'] = '';
header("Location: index.php");
}
if ($_SESSION['auth'] >= 1) {
echo 'Du er admin!';
include ("add.php");
}
if ($_SESSION['auth'] >= 0) { ?>
<p>Dette er hemmelig informasjon! Din status: <?php echo $_SESSION['auth']; ?></p>
<p><a href="?logg=ut">Logg ut!</a></p>
<?php
}
if (!isset($_SESSION['auth'])) {
header("Location: index.php");
}
?>

$_SESSION['auth'] inneholder statusen din. Hvis du har status 1, er du admin. Mens 0 er vanlig.

 

if ($_SESSION['auth'] >= 1) {

// Hvis statusen din er lik eller høyere 1, skjer dette!

}

 

if ($_SESSION['auth'] >= 0) {

// // Hvis statusen din er lik eller høyere 0, skjer dette!

}

 

 

Her den eneste forskjellen fra 1 og 0 at 1'ern kan legge til nye brukere. (SE: include("add.php"); ) Dette kan selvfølgelig endre selv;)

 

// add.php
<?php
session_start();
if ($_SESSION['auth'] == '') { 
header("Location: index.php");
} else {?>
<h4>Brukerregistrering:</h4>
<form action="<?php print $_SERVER['PHP_SELF']; ?>?add=yes" method="post">
Brukernavn: <input type="text" name="bruker"><br />
Passord: <input type="text" name="passwd"><br />
Status: <input type="text" name="status"><br />
<input type="submit" value="Legg til!">
</form>
<?php
if ($_GET['add'] == "yes") {
$file = 'pass.txt';
$leggtil = "\n".$_POST['bruker']."|".sha1(md5($_POST['passwd']))."|".$_POST['status'];
$handle = fopen($file, 'a');
if (fwrite($handle, $leggtil) === FALSE) {
  echo "Greide ikke å legge til bruker!";
  exit;
}
echo "Ny bruker lagt til!";
}
}
?>

Ikke rediger annent enn echo i dette scriptet!

 

 

Brukernavn, passord, og status lagres i filen: pass.txt. Passord lagres som sha1+md5

// pass.txt
admin|a69681bcf334ae130217fea4505fd3c994f5683f|1

Her er brukernavn: admin og passord: demo

Lenke til kommentar
Videoannonse
Annonse

Her er et sha1+md5-krypteringsscript:

<?php
if (!$_GET['md5']) {
?>

<form action="md5.php" method="get">
<input type="text" name="md5">
<input type="submit" value="Send">
</form>

<?php 
} else if ($_GET['md5']) {
$finish = sha1(md5($_GET['md5']));
echo $finish;
}
?>

Lenke til kommentar

Dette er dessverre ikke sikkert overhode. Sett at noen skaffer seg en annens sessionid? Da er man automatisk innlogget, noe som nok ikke var meningen.

 

Derfor: sjekk ALLTID for hver eneste side at brukerens IP og browser stemmer over ens med det du lagerer i session.

 

Det vil gjøre det en del mer sikkert, men selv ikke da er tingene perfekt. Riktig nok sikkert til vanlig bruk.

 

Edit: Dum skrivefeil :(

Endret av Ernie.
Lenke til kommentar
Men da kan man vel bare logge som på en maskin... Hvis jeg tenker på samme måte som deg?

Nei, du kan logge inn uavhengig av hvor du har logget på, hvor mange ganger osv. Ved ny pålogging får du jo ny sessionid med tilhørende ny cookie. Dessuten er en session typisk gyldig 30 minutter i PHP.

Lenke til kommentar
Det er vel sikrere og enklere å bruke feks md5 og salt i stede for både sha1 og md5...

salt?

 

Og holder ikke md5 alene?

	function makesalt(){
 $hash_string = md5(time());
 $stringlength = strlen($hash_string);
 $saltlength = 15;
 $start = rand(0, ($stringlength - $saltlength - 1));
 $salt = substr($hash_string, $start, $saltlength);
 return $salt;  
}

$passord=md5(makesalt().$passord);

 

Da blir passordet hashet sammen med 15 andre tegn, altså 15 tegn+ passord, jo lenger salt, jo lengre tid vil det ta å breakforce md5-hashen ;)

Lenke til kommentar
det blir sikkert når du poster til serveren med javascript md5(sha1("passord")) og så md5($salt_1_til_64 . $passord . $salt_2_til_128) i php og så sjekke opp mot database.

Blir ikke noe av vitsen borte da?

 

Dessuten krever det jo en god del kode i javascript...

Lenke til kommentar
Gjest Slettet+6132
er det riktig at pass.txt ligger tilgjengelig for omverdenen?

Ehm? Om det skal ligge i webmappa ta i det minste og gjør slik:

 

pass.php

<?php die("Piss off motherfucker, you can't read here!"); ?>
olanordmann;hashetpassord
jens;passordhash

Endret av Slettet+6132
Lenke til kommentar
det blir sikkert når du poster til serveren med javascript md5(sha1("passord")) og så md5($salt_1_til_64 . $passord . $salt_2_til_128) i php og så sjekke opp mot database.

Blir ikke noe av vitsen borte da?

 

Dessuten krever det jo en god del kode i javascript...

du kan jo sende det i bare md5/sha1 også.

hvis du mente at vitsen blir borte med javascript så vil jeg si at javascript bare sikkrer den litt extra ikke noe mer.

Lenke til kommentar
er det riktig at pass.txt ligger tilgjengelig for omverdenen?

Ehm? Om det skal ligge i webmappa ta i det minste og gjør slik:

 

pass.php

<?php die("Piss off motherfucker, you can't read here!"); ?>
olanordmann;hashetpassord
jens;passordhash

det hjelper da ingenting så lenge fila heter .txt

 

kall fila isåfall .htpass.txt, da vil ikke apache tillate at du leser fra den

 

EDIT: ser du kalte fila pass.php ja

Endret av Torbjørn
Lenke til kommentar

Leser du litt nøyere så står det faktisk

 

 

pass.php

<?php die("Piss off motherfucker, you can't read here!"); ?>
olanordmann;hashetpassord
jens;passordhash

 

og da funker det.

Endret av pian
Lenke til kommentar
Gjest Slettet+6132
Leser du litt nøyere så står det faktisk pass.php

Noen som er våkne :!:

 

EDIT: Som en regel skal man ALLTID lagre database-stuff og slikt i php-filer som ikke vil bli leselige for brukeren.

Endret av Slettet+6132
Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...