Gå til innhold

[LØST]Sikkert innloggins script


Anbefalte innlegg

Er dette et innlogginsscript som er sånn noelunde sikkert nok?

 

logg_inn.php

<html>
<body>
<form method="post" action="logg_inn2.php">  
 Brukernavn:<input type="text" name="brukernavn" /><br />
 Passord:<input type="password" name="passord">	
 <!--sumbit knapp-->
 <input type="submit" name="submit" value="Logg inn!" />
</form>
</html>

logg_inn2.php

<?php
//henter variabler
$brukernavn = $_REQUEST['brukernavn'];
$passord = $_REQUEST['passord'];

//vis navn er tomt gå tilbake
if ($brukernavn==(FALSE) || $passord==(FALSE) )
{
echo "<h1>Du glemte å skrive inn passord eller brukernavn</h1>";
echo '<meta http-equiv="Refresh" content="1; url=logg_inn.php">';
}
else
{
//opretter kobling til mysql serven
$link = mysql_connect('localhost', 'bruker', '')
   or die('Could not connect: ' . mysql_error());

//velger tabell
mysql_select_db('test') or die('Could not select database');

//leser brukernavn
$query = "SELECT * FROM logg_inn WHERE brukernavn = '$brukernavn' AND passord = '$passord'";
$result = mysql_query($query);
$passord2 = mysql_result($result,0,"passord");
$brukernavn2 = mysql_result($result,0,"brukernavn");

//hvis passord og brukernavn er rett -> videre
if ($passord == $passord2 AND $brukernavn == $brukernavn2)
{
//lagrere brukernavnet til sessionen
session_start();
$_SESSION[’id’]=$brukernavn;
echo '<meta http-equiv="Refresh" content="0; url=test.php">';
}
else
{
echo "<h1>Passordet eller brukernavnet var feil</h1>";
echo '<meta http-equiv="Refresh" content="2; url=logg_inn.php">';
}

}
?>

test.php(denne siden skal være beskyttet

<html>
<body>
<?php
session_start();
if (@isset($_SESSION[’id’]))
{
echo "du kan komme inn på denne siden.";
}
else
{
echo "du har ikke tilgang til dennne siden!!";
}
?>
</html>

Er det noen som har ideer til forbedringer?

Endret av orjan1992
Lenke til kommentar
Videoannonse
Annonse
Er dette et innlogginsscript som er sånn noelunde sikkert nok?

Nei, overhode ikke.

 

Problemet er at du er vid åpen for SQL-injeksjoner ettersom du ikke "vasker" variablene som kommer fra brukeren (altså $brukernavn og $passord). Det er dermed en enkel sak å oppgi et brukernavn og/eller passord som gjør hva som helst med databasen din - inkludert å skaffe seg tilgang til de adgangskontrollerte sidene.

 

Dette er egentlig et tema som går ofte igjen når det gjelder innloggingsrutiner. Søk litt, så finner du nok noe du kan basere deg på. Eller rett og slett bruk et ferdig, gratis system.

Lenke til kommentar

Aldri bruk $_REQUEST, fordi den inneholder informasjon fra post, get og cookie. Så du kan aldri være sikker på hvor informasjonen kommer i fra. Bruk i stedet for $_GET, $_POST og $_COOKIE alt etter hva behovet er.

 

Fra php.net

Variables provided to the script via the GET, POST, and COOKIE input mechanisms, and which therefore cannot be trusted. The presence and order of variable inclusion in this array is defined according to the PHP variables_order configuration directive. This array has no direct analogue in versions of PHP prior to 4.1.0. See also import_request_variables().

 

Hele denne biten kan gjøres mye enklere

Klikk for å se/fjerne innholdet nedenfor
//leser brukernavn
$query = "SELECT * FROM logg_inn WHERE brukernavn = '$brukernavn' AND passord = '$passord'";
$result = mysql_query($query);
$passord2 = mysql_result($result,0,"passord");
$brukernavn2 = mysql_result($result,0,"brukernavn");

//hvis passord og brukernavn er rett -> videre
if ($passord == $passord2 AND $brukernavn == $brukernavn2)
{
//lagrere brukernavnet til sessionen
session_start();
$_SESSION[’id’]=$brukernavn;

PHP
<?php

$brukernavn=mysql_real_escape_string($_POST['brukernavn']);

$passord=mysql_real_escape_string($_POST['passord']);

 

$check=mysql_fetch_row(mysql_query("

SELECT count(*) nr, brukernavn FROM logg_inn 

WHERE brukernavn = '{$brukernavn}' AND passord = '{$passord}' 

GROUP BY brukernavn"));

 

if ($check[0]==1)

{

  session_start();

  $_SESSION['id']=$check[1];

}

 

// ....

?>

 

Husk at session_start() må startes før noe blir skrevet ut til nettleseren. Unntaket er ved bruk av Output buffering.

 

Kan være en del å lære av å prøve å skrive sine egne logg inn rutiner, men dette er nok ett tema det er skrevet mye om på diverse forum, så jeg vil foreslå at du prøver å lese igjennom en del av det, og så se om du kan/må forbedre koden din ;)

 

Bruk kun SELECT * FROM ... når du trenger alle feltene, hvis ikke så spesifiser kun de du trenger.

Endret av crowly
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...