Du må være registrert og logget inn for å kunne legge ut innlegg på freak.no
X
LOGG INN
... eller du kan registrere deg nå
Dette nettstedet er avhengig av annonseinntekter for å holde driften og videre utvikling igang. Vi liker ikke reklame heller, men alternativene er ikke mange. Vær snill å vurder å slå av annonseblokkering, eller å abonnere på en reklamefri utgave av nettstedet.
  16 789
Holder på å lage et adminområde til en side jeg holder på med, her er login formen:

Kode

<form action="admin.php" method="post"> 
  Brukernavn: <input type="text" name="user"><br> 
  Passord: <input type="password" name="pass"><br> 
  <input type="submit" value="Logg inn"> 
</form>
Den er lagret som login.php


Så har jeg selve admin.php, som sjekker om brukeren finnes, og om passordet passer opp mot denne:

Kode

session_start(); 
mysql_connect("XXXXXXXX") or die("Kolbing til database er hindret!");
mysql_select_db("tore");
echo mysql_error();
  if($_SERVER["REQUEST_METHOD"] == "POST") { 
$md5Pass = md5($_POST["pass"]);
    $result = mysql_query("SELECT * FROM russ_users WHERE users_name='".$_POST["user"]."' AND users_pass='".$md5Pass."'"); 
    if(mysql_num_rows($result)) { 
      session_register("innlogget");
      print("Velkommen!"); 
	  echo "<br>Du er innlogget, <a href=admin/index.php>trykk her</a> for gå inn på området.<br>";
    } 
    else { 
      print("Feil brukernavn eller passord!"); 
    } 
  }
Dette var admin.php, håper alle forstår hva som skjer der.



Så var det spørsmålet, klarer dere å se noen sikkerhetsrisikoer her? Har sett over det er par ganger uten å finne noe opplagt.

Vet at nå må jeg ha ØVERST(?) på alle sider som skal være sikret...:

Kode

session_start();
if(isset($_SESSION["innlogget"])) 
 {
Hvis den er satt
}
else {
Hvis den IKKE er satt.
}
Det er sikkert en MYE enklere måte å sikre sidene på enn det et hakk over her, kanskje via en funksjon eller.no. Sier ikke nei til forslag til endringer der. Har også sett noen sider bruker session_id(?) i adressene sine, sikkert noe side.php". session_id(); .", men hva er formålet med det, og er det noe jeg bør implentere?

Men så så jeg dette på php.net:
If you are using $_SESSION (or $HTTP_SESSION_VARS), do not use session_register(), session_is_registered(), and session_unregister().
Vis hele sitatet...
Kilde: her

Vet ikke om det har så mye å si, fant lite også om hva som blir gale da. Håper hvertfall folk kan se igjennom skriptet og se om de finner noen opplagte feil, eller tips til forbedringer. Det fungerer hvertfall helt fint her nå
Sist endret av tore-; 21. november 2003 kl. 00:06.
Vet ikke om jeg ekstrem.. men jeg syntes det der er et langt fra sikkert script.

Jeg annbefaler at du bruker både session og cookie, og begge skal ha bruker, ip, tids bekgrenset.. jeg liker også å ha sjekk om at requesten til admin.php kommer fra login.php på din egen server..
For å dra denne diskusjonen litt videre, så vil jeg påstå at det du har der er mer enn godt nok for å beskytte en personlig hjemmeside eller liknende, å bli så "ekstrem" som KozmiC her, trengs ikke for slike sider, det må være en del viktige saker på den før det blir så ekstremt nødvendig.

My 2 cents
neida....hvorfor gjøre ting halvveis.....nazi-mode all the way når man først er igang
http://www.freakforum.nu/forum/showt...threadid=23984 står det litt i!

Opprinnelig postet av KozmiC
jeg liker også å ha sjekk om at requesten til admin.php kommer fra login.php på din egen server..
Vis hele sitatet...
Hvordan gjør man det egentlig?
MINST 12år
tore-'s Avatar
Trådstarter
Kan ta å legge til sjekk om hvor requesten kommer fra, og om $user og $pass i formen er gitt noen verdi. Burde gjøre det litt sikrere.

Er for en halvveis personlig side, så bør være litt sikker.

Men jeg sliter egentlig med sessions, hvordan gjøre det sikkert, evt. bruke sql for å gjøre det sikrere slik som det diskuteres i Benson sin link over her.

Forslag? Artikler el. jeg kan lese over?
vel, http://php.net/sessions og http://www.php.net/manual/en/ref.session.php forklarer endel.. Kort fortalt putter du bare info som
sessionid, ip, klokkeslett osv inn i en slags "temp" tabell hver gang noen logger inn, som igjen blir sjekket på hver "adminside". Også lage et script som fjerner disse etter xx inaktiv tid.

Lite eksempel (meget usikkert hvor "bra "det er, men det skal funke :P )

Kode

Del av login script:

$sessionid = session_id();
$ip = $_SERVER['REMOTE_ADDR'];
$_SESSION['brukernavn'] = $brukernavn;
$_SESSION['passord'] = $passord;
$_SESSION['last_action'] = date("YmdHis");

mysql_query("INSERT INTO sessionting(sessionid, brukernavn, pass, ip, last_action) values('$sessionid', '$bruker', '$pass', '$ip', NOW())");
Der $brukernavn og $passord er det som blir submittet i formen.

vet ikke hvor mye det hjalp, men ta kontakt med gusto, han som satte meg på sporet
Sist endret av Benson; 21. november 2003 kl. 12:20.
improbable
Gusto's Avatar
DonorAdministrator
Benson: Snakket me'n i dag morges faktisk. ;9
Forresten, hvorfor har du lagt passordet inn i sessiontabellen? Og ukryptert i tillegg. Bare harskt smør på flesk å gjøre det slik.

Kode

<form action="index.php" method="post"> 
  Brukernavn: <input type="text" name="user"><br> 
  Passord: <input type="password" name="pass"><br> 
  <input type="submit" value="Logg inn"> 
</form>
legge denne heller i en mappe som heter login og la den alltid hoppe til seg selv, med kall på toppen og en if som bruker header location ETTER å ha satt $_SESSIONOg når du lager passord gjør det omtrent slik:

Kode

$passordSomBlirLagretIDatabasen = md5( $_POST['login'].'/'.$_POST['passord'] )
og sessions bør du gi navn slik:

Kode

$_SESSION[ md5( date( "mY/Y-Ym" ). $_SERVER['REMOTE_IP'] )]['gop1pli37'] = $brukerID;
$_SESSION[ md5( date( "mY/Y-Ym" ). $_SERVER['REMOTE_IP'] )]['gop1pli38'] = md5( $brukerID );
Kjør også en kontroll på:

Kode

if ( $_SESSION[ md5( date( "mY/Y-Ym" ). $_SERVER['REMOTE_IP'] )]['gop1pli37']
	!= md5( $_SESSION[ md5( date( "mY/Y-Ym" ). $_SERVER['REMOTE_IP'] )]['gop1pli38'] ) ) {
	Location( "Header:/index.php");
}
[edit]
Slik at man ikke bare kan lage en fake session ved hjelp av å gamble på at $_SESSION['passord'] eller password inneholder det du er ute etter fra forrige bruker,
sett aldri passord i $_SESSION[]; last_action hører også til i databasen bak.
[/edit]
Sist endret av fxxked; 21. november 2003 kl. 12:35.

Slik at man ikke bare kan lage en fake session ved hjelp av å gamble på at $_SESSION['passord'] eller password inneholder det du er ute etter fra forrige bruker,
sett aldri passord i $_SESSION[]; last_action hører også til i databasen bak.
Vis hele sitatet...
Og hvor kommer man med det feltet rett? uansett, du har et poeng med å lagre det slik du gjør. Blir bare enda mer sikkert. Men tror ikke man klarer å komme inn, må tross alt ha sessionid, klokkeslett etc :P
Du kommer da inn på flere av mine løsninger... 2x :-p
MINST 12år
tore-'s Avatar
Trådstarter
Har fikset litt på admin.php:

Kode

start_session();
mysql_connect("XXXXXX") or die("Kolbing til database er hindret!");
mysql_select_db("tore");
echo mysql_error();
  if($_SERVER["REQUEST_METHOD"] == "POST") {
if(!$_POST["user"] OR !$_POST["pass"]) {
echo "bruker/pass ikke definert";
}
else {
$md5Pass = md5($_POST["pass"]);
$result = mysql_query("SELECT * FROM russ_users WHERE users_name='".$_POST["user"]."' AND users_pass='".$md5Pass."'");
    if(mysql_num_rows($result)) {
while($row = mysql_fetch_array($result)) {
$ip = $_SERVER['REMOTE_ADDR'];
$_SESSION["users_id"] = $row["users_id"];
$_SESSION["users_name"] = $row["users_name"];
$_SESSION["users_email"] = $row["users_email"];
$_SESSION["last_action"] = time();
$_SESSION[ md5( date( "mY/Y-Ym" ). $_SERVER['REMOTE_IP'] )][ gop1pli37 ] = $brukerID;
$_SESSION[ md5( date( "mY/Y-Ym" ). $_SERVER['REMOTE_IP'] )][ gop1pli38 ] = md5( $brukerID );

      print("Velkommen!");
      echo "<br>Du er innlogget, <a href=admin/index.php>trykk her</a> for gå inn på området.<br>";
}
    }
    else {
      print("Feil brukernavn eller passord!");
    }
  }
}
Ved print_r($_SESSION); får jeg følgende:
Array ( [users_id] => 1 [users_name] => Tore [users_email] => [last_action] => 1069418860 [2cba98e2b91518251ed493c86dda4ed8] => Array ( [gop1pli37] => [gop1pli38] => d41d8cd98f00b204e9800998ecf8427e ) )

Ser ut som jeg har et array inni et array, ser ikke helt hva som er galt. Tips til hva som kan være galt?


Hvordan kan jeg bruke denne infoen til å sikre adminområdet?
Tror det er slik at alle sidene må ha:

Kode

session_start();
if ( $_SESSION[ md5( date( "mY/Y-Ym" ). $_SERVER['REMOTE_IP'] )]['gop1pli37']
    != md5( $_SESSION[ md5( date( "mY/Y-Ym" ). $_SERVER['REMOTE_IP'] )]['gop1pli38'] ) ) {
echo "Du har ikke tilgang.";
}
else {
echo "du kom inn.";
}
Men vil ikke dette skape problemer hvis brukeren er HELT i slutten av mnd, et par sekunder før ny mnd? For da vil det jo bli et annet session verdi.

Jeg vel også denne infoen inn i en db ( $_SESSION[ md5( date( "mY/Y-Ym" ). $_SERVER['REMOTE_IP'] )]['gop1pli37'] ) og så sjekke dette opp mot en sql spørring?

Forslag? Endringer?
Jo, men da er det bare å legge til m-1 i en ifelse eller så kan du være like lat som meg og la dem få timeout. Da blir dem sendt til påloggingssiden.
Jeg vet ikke hvor mange hits du har på sida de, men i de fleste tilfeller vil du enkelt kunne unngå det problemet uten veldig mye mas.

Evt kan du bytte ut date() saken i forslaget mitt og bruke current ID på fra en MySQL tabell, hvor du logger sessions kan gjøre samme nytte, selv om jeg tall i seg selv er enkle å bruteforce... så lag strenger slik at md5 hashen blir basert på: "detteProsjektet".$row->currentID."kjeks"
da må du seff kjøre en query før sjekk...

Kode

$ip = $_SERVER['REMOTE_ADDR'];
$_SESSION["users_id"] = $row["users_id"];
$_SESSION["users_name"] = $row["users_name"];
$_SESSION["users_email"] = $row["users_email"];
$_SESSION["last_action"] = time();
$_SESSION[ md5( date( "mY/Y-Ym" ). $_SERVER['REMOTE_IP'] )][ gop1pli37 ] = $brukerID;
$_SESSION[ md5( date( "mY/Y-Ym" ). $_SERVER['REMOTE_IP'] )][ gop1pli38 ] = md5( $brukerID );
bør være:

Kode

$ip = $_SERVER['REMOTE_ADDR'];
$_SESSION[ md5( date( "mY/Y-Ym" ). $_SERVER['REMOTE_IP'] )][ gop1pli37 ] = $row["users_id"];
$_SESSION[ md5( date( "mY/Y-Ym" ). $_SERVER['REMOTE_IP'] )][ gop1pli38 ] = md5( $row["users_id"] );
Sist endret av fxxked; 21. november 2003 kl. 15:16.
MINST 12år
tore-'s Avatar
Trådstarter
Hvorfor bør den være det, det du skrev over der? Den infoen jeg har lagt ved:

$_SESSION["users_id"] = $row["users_id"];
$_SESSION["users_name"] = $row["users_name"];
$_SESSION["users_email"] = $row["users_email"];
$_SESSION["last_action"] = time();

er jo informasjon jeg har lyst å ta med på alle de andre sidene, uten at jeg må bruke sql hele tiden....

Skal poste en ferdig side hvor folk kan teste ut litt og sjekke sikkerheten, hvis dere gidder
Hvor mye aktivitet er aktuelt?
Hvor stor båndbredde er det på serveren?
MINST 12år
tore-'s Avatar
Trådstarter
minimalt egentlig, sikkert 20-30 unike hver dag. Det eneste som egentlig tar bw er bildene.

Edit: Sjekket, ca. 10mb i uken, bare på php filene. Bildene er/var på en annen server, en kjap en, så det er ikke noe problem.

Serveren har null load, og masse ram og cpu.
Sist endret av tore-; 21. november 2003 kl. 23:40.
MINST 12år
tore-'s Avatar
Trådstarter
Fant en liten snedig sak til Macromedia som gjordet alt for meg:

Kode

<?php require_once('Connections/db.php'); ?>
<?php
// *** Start the session
session_start();
// *** Validate request to log in to this site.
$FF_LoginAction = $HTTP_SERVER_VARS['PHP_SELF'];
if (isset($HTTP_SERVER_VARS['QUERY_STRING']) && $HTTP_SERVER_VARS['QUERY_STRING']!="") $FF_LoginAction .= "?".htmlentities($HTTP_SERVER_VARS['QUERY_STRING']);
if (isset($HTTP_POST_VARS['user'])) {
  $FF_valUsername=$HTTP_POST_VARS['user'];
  $FF_valPassword=md5( $HTTP_POST_VARS['pass'];
  $FF_fldUserAuthorization="";
  $FF_redirectLoginSuccess="../index.php";
  $FF_redirectLoginFailed="login.php";
  $FF_rsUser_Source="SELECT users_name, users_pass ";
  if ($FF_fldUserAuthorization != "") $FF_rsUser_Source .= "," . $FF_fldUserAuthorization;
  $FF_rsUser_Source .= " FROM russ_users WHERE users_name='" . $FF_valUsername . "' AND users_pass='" . $FF_valPassword . "'";
  mysql_select_db($database_db, $db);
  $FF_rsUser=mysql_query($FF_rsUser_Source, $db) or die(mysql_error());
  $row_FF_rsUser = mysql_fetch_assoc($FF_rsUser);
  if(mysql_num_rows($FF_rsUser) > 0) {
    // username and password match - this is a valid user
    $MM_Username=$FF_valUsername;
    session_register("MM_Username");
    if ($FF_fldUserAuthorization != "") {
      $MM_UserAuthorization=$row_FF_rsUser[$FF_fldUserAuthorization];
    } else {
      $MM_UserAuthorization="";
    }
    session_register("MM_UserAuthorization");
    if (isset($accessdenied) && true) {
      $FF_redirectLoginSuccess = $accessdenied;
    }
    mysql_free_result($FF_rsUser);
    session_register("FF_login_failed");
	$FF_login_failed = false;
    header ("Location: $FF_redirectLoginSuccess");
    exit;
  }
  mysql_free_result($FF_rsUser);
  session_register("FF_login_failed");
  $FF_login_failed = true;
  header ("Location: $FF_redirectLoginFailed");
  exit;
}
?>
<html>
<head>
<title>Logg inn</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
</head>

<body>
<form action="<?php echo $FF_LoginAction?>" method="POST">
  <b>Brukernavn: 
  <input type="text" name="user">
  <br>
  Passord:</b> 
  <input type="password" name="pass">
  <br>
  <input type="submit" value="Logg inn">
</form> 

</body>
</html>


Men siden jeg kun forsto halvparten av koden, bruker jeg den ikke. Skal tross alt lære.

Bruker heller følgende:

login.php

Kode

<form action="admin.php" method="post"> 
  <b>Brukernavn: <input type="text" name="user"><br> 
  Passord:</b> <input type="password" name="pass"><br> 
  <input type="submit" value="Logg inn"> 
</form>
admin.php

Kode

<?
if($_SERVER['HTTP_REFERER'] == "XXX/login.php") {
}
else {
	if (!headers_sent()) {
		header ('Location: XXX/login.php');
		exit;
	}
}
session_start(); 
include_once("../../secure/db.php");
if($_SERVER["REQUEST_METHOD"] == "POST") {
if(!$_POST["user"] || !$_POST["pass"]) {
$errorMsg = 1;
}
else {
	$md5Pass = md5($_POST["pass"]);
	$result = mysql_query("SELECT * FROM russ_users WHERE users_name='".$_POST["user"]."' AND users_pass='".$md5Pass."'");
	if(mysql_num_rows($result)) {
		while($row = mysql_fetch_array($result)) {
			$_SESSION["users_name"] = $row["users_name"];
			$_SESSION["users_email"] = $row["users_email"];
			$_SESSION["last_action"] = time();
			$_SESSION[ md5( date( "mY/Y-Ym" ). $_SERVER['REMOTE_IP'] )] = md5( $row['users_id'] );

	$errorMsg = 2;
		}
	} else {
		$errorMsg = 3;
	}
}
}
?>
<html>
<head>
<title>Logg inn autentisering</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
</head>
<body>
<?
if($errorMsg == 1) { echo ("Du glemte å skrive inn brukernavn og/eller passord. Klikk <a href=login.php>her</a> for å prøve igjen."); }
else if($errorMsg == 2) { echo "Du er nå innlogget, trykk <a href=admin/index.php>her</a> for å fortsette"; }
else if($errorMsg == 3) { 
		print("<b>Feil</b> brukernavn og/eller passord!<br>");
		echo "<a href=login.php>Prøv igjen!</a>";
 }
else { echo "Fuck off..."; }
?>
</body>
</html>
admin/*.php (alle sider i mappen vil minimum inneholde dette)

Kode

session_start();
if ($_SESSION[ md5( date( "mY/Y-Ym" ). $_SERVER['REMOTE_IP'] )] != md5( $_SESSION['users_id'] )) {
echo "Du har ikke tilgang.";
}
else {
echo "du kom inn.";
}
admin/logout.php

Kode

session_start();
session_unset();
session_destroy();
echo "Du er logget ut";

Nå kan jeg ikke finne noen som helst feil i det hele tatt.