Ik heb een php inlogpagina gemaakt met een mysql database. Wij zijn een vereniging en ik wil graag een pagina maken waarop enkel leden van onze vereniging deze info kunnen bekijken.
Omdat ik enkel toegang wil verlenen aan onze leden ken ik deze en heb ik alle nodige informatie al ingevoerd in een sql database. tot dusver geen probleem.
Bij het aanmaken van deze database heb ik voor allen een standaard wachtwoord ingegeven. Bestaat er een simpele code wanneer zij aanmelden met het vooraf ingestelde standaard wachtwoord dat ze een eigen wachtwoord invoeren?
met een if bij het inlogge checken of de gebruiker nog steeds het standaardpass heeft. Zoja, dan laat je een pagina met ww veranderen zien. Zoniet dan laat je gewoon de site zoals het moet zien.
Bij het wachtwoord veranderen werk je net hetzelfde als bij het registreren. Alleen met het verschil dat je nu i.p.v "INSERT INTO tabel () values ()", "UPDATE tabel SET wachtwoord = $nieuw_ww WHERE username = $username"
dit is een simpel voorbeeld, je moet het zelf wel nog beveiligen, want als je dit gaat gebruiken ben je zo gehackt
Het beste lijkt mij om een veld aan je database toe te voegen waarin je bewaart of de user zijn password moet wijzigen of niet (tip: ENUM('0','1') veld). Als dit veld op "1" staat laat je de user zijn password updaten (het is namelijk de eerste keer dat hij inlogt). Vanaf hij zijn password dan wijzigt update je zijn password in de database en zet je het veld op '0'. Zo kan je later ook nog makkelijk forceren om een user bij de volgende login zijn password te laten wijzigen.
Ik heb tabel met Id, username, password and passwordcheck (dit laatste is enum 0 1).
op de login pagina heb ik een veld username and password.
de logincheck.php controleert de username and password en als dit ok is gaat hij naar de login_success.php . Hoe kan ik zeggen dat als het veld passwordcheck waarde 1 heeft, de gebruiker naar de pagina changepassword moet gaan en als dit waarde 0 heeft gewoon verder gaat naar de beveiligde pagina?
<?php
$host="localhost"; // Host name
$username="xxx"; // Mysql username
$password="xxxxx"; // Mysql password
$db_name="members"; // Database name
$tbl_name="leden"; // Table name
// Connect to server and select databse.
mysql_connect("$host", "$username", "$password")or die("cannot connect");
mysql_select_db("$db_name")or die("cannot select DB");
// username and password sent from form
$myusername=$_POST['myusername'];
$mypassword=$_POST['mypassword'];
// To protect MySQL injection (more detail about MySQL injection)
$myusername = stripslashes($myusername);
$mypassword = stripslashes($mypassword);
$myusername = mysql_real_escape_string($myusername);
$mypassword = mysql_real_escape_string($mypassword);
$sql="SELECT * FROM $tbl_name WHERE username='$myusername' and password='$mypassword'";
$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_register("myusername");
session_register("mypassword");
header("location:login_success.php");
}
else {
echo "Wrong Username or Password";
}
?>
Ik ben nog niet lang bezig met php. Momenteel werkt dit script al een tijdje op onze website, maar heb pas het onderhoud van de website van onze vereniging overgenomen. Ik heb al enkele kleine aanpassingen uitgevoerd, maar ik zit met een probleem dat ik niet opgelost krijg. IK heb iedereen die ik wil toelaten tot de geheime inhoud (enkel voor leden bestemd) in een mysql database. Deze database bevalt id, naam, password en passwordupdate. deze laatste is een 0,1 veld.
Ik wil dat php checkt of naam en password overeenkomt. Zo ja moet hij volgende stappen uitvoeren:
als passwordupdate = 0 moet hij gaan naar passwordupdate.php
als passwordupdate = 1 moet hij gaan naar geheim.php
anders error.php en link naar homepage.
momenteel kan enkel leden met passwordupdate = 1 de geheime inhoud zien en alle andere gaan naar de pagina passwordupdate.php, ook diegene die geen lid zijn.
session_register() is misschien wel een antieke functie, maar hij werkt volgens mij nog wel naar behoren. Als ik toch bezig ben met het vernieuwen van dit script, wat raden jullie me dan aan.
<?php
ob_start();
$host="localhost"; // Host name
$username="xxxx"; // Mysql username
$password="xxxxxxxx"; // Mysql password
$db_name="members"; // Database name
$tbl_name="leden"; // Table name
// Connect to server and select databse.
mysql_connect("$host", "$username", "$password")or die("cannot connect");
mysql_select_db("$db_name")or die("cannot select DB");
// Define $myusername and $mypassword
$myusername=$_POST['myusername'];
$mypassword=$_POST['mypassword'];
// To protect MySQL injection (more detail about MySQL injection)
$myusername = stripslashes($myusername);
$mypassword = stripslashes($mypassword);
$myusername = mysql_real_escape_string($myusername);
$mypassword = mysql_real_escape_string($mypassword);
$sql="SELECT * FROM $tbl_name WHERE username='$myusername' and password='$mypassword' and passwordcheck='1'";
$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_register("myusername");
session_register("mypassword");
header("location:login_success.php");
}
else {header("location:passwordupdate.php");
echo "Wrong Username or Password";
}
session_register() is misschien wel een antieke functie, maar hij werkt volgens mij nog wel naar behoren. Als ik toch bezig ben met het vernieuwen van dit script, wat raden jullie me dan aan.
Kan onveilig zijn (hackgevoelig), of er bij een volgende release uitgehaald worden.
Tegenwoordig kan het gewoon zo
<?php
session_start(); // is belangrijk, anders werken sessies sowieso niet.
/**
* groot script
**/
$_SESSION['naam'] = 'Freddy';
$_SESSION['userlvl'] = 32;
?>
<?php
session_start();// is belangrijk, anders werken sessies sowieso niet.
/**
* groot script
**/
$_SESSION['naam']='Freddy';
$_SESSION['userlvl']=32;
?>
een wachtwoord opslaan in een sessie is zeer onveilig, met een simpele FF plugin kan je cookies uitlezen (want ja, ook sessies werken onder water met een cookie).
<?php
$user = $_POST['user'];
$pass = $_POST['pass'];
// !! $user en $pass moet je zelf nog beveiligen
$sql = 'SELECT * FROM tabel WHERE username = "'.$user.'" AND password = "'.$pass.'"';
$qrs = mysql_query($sql);
$rs = mysql_fetch_assoc($qrs);
// !! Ook hier zelf nog foutafhandeling ect, ingooien. bekijk bijvoorbeeld eens mysql_num_rows()
if($rs['passwordcheck'] == 1) {
// ga naar verander.php
} else {
// ga maar door
}
?>
<?php
$user=$_POST['user'];
$pass=$_POST['pass'];
// !! $user en $pass moet je zelf nog beveiligen
$sql='SELECT * FROM tabel WHERE username = "'.$user.'" AND password = "'.$pass.'"';
Ik heb aantal aanpassingen gedaan van wat je hierboven hebt opgesomd:
$_Session[naam] heb ik vervangen door $_SESSION['myusername'] = $myusername;
$_session[userlvl] waar slaat die 32 op?? en Freddie, is dat een willekeurige naam?
Moet ik op de login_success.php deze session gegevens herhalen?
Is dit dan ok? (zie code hieronder)
met deze aanpassingen geeft hij steeds wit scherm van checklogin.php en gaat niet verder. alsof hij geen connectie heeft met de database.
ben ik echt zo dom of is php moeilijker als gedacht.
gegevens beveiligen zoek ik later wel uit, eerst wil ik een werkend script.
header("location:login_sussess.php");
}
else{
echo "Not allowed to be here";
//header('Location: index.php');
}
?>
<?
session_start();
session_destroy();
?>
?
code checklogin
<?php
session_start(); // is belangrijk, anders werken sessies sowieso niet.
$host="localhost"; // Host name
$username="luc"; // Mysql username
$password="test123"; // Mysql password
$db_name="members"; // Database name
$tbl_name="leden"; // Table name
// Connect to server and select databse.
mysql_connect("$host", "$username", "$password")or die("cannot connect");
mysql_select_db("$db_name")or die("cannot select DB");
// To protect MySQL injection (more detail about MySQL injection)
$myusername = stripslashes($myusername);
$mypassword = stripslashes($mypassword);
$myusername = mysql_real_escape_string($myusername);
$mypassword = mysql_real_escape_string($mypassword);
$sql = "SELECT * FROM $tbl_name WHERE username = '$myusername' AND password = '$mypassword'";
$qrs = mysql_query($sql);
$rs = mysql_fetch_assoc($qrs);
if($rs['passwordcheck'] == '1') {header("location:passwordupdate.php")
// ga naar verander.php
} else {header("location:login_success.php");
// ga maar door
}
$_SESSION['myusername'] = $myusername;
$_SESSION['userlvl'] = 32;
een wachtwoord opslaan in een sessie is zeer onveilig, met een simpele FF plugin kan je cookies uitlezen (want ja, ook sessies werken onder water met een cookie).
Ja en nee. Er is inderdaad een sessie cookie waarin het ID van de sessie staat. Data die je in een sessievariabele steekt wordt echter op de server opgeslagen. Adv die sessie cookie wordt gekeken welke data bij welke gebruiker hoort.
Wel blijft het een feit dat het niet veilig is om een wachtwoord in een sessie op te slaan. Indien de server er niet tegen beveiligd is is het in principe mogelijk dat mensen die op dezelfde server zitten als jou (zoals steeds het geval is bij de "shared hosting" pakketten) de data kunnen uitlezen van sessies die jou script bij jou bezoeker wegzet.
Als je trouwens adv. sessies wilt controleren of een gebruiker al dan niet is ingelogd moet je ook eens kijken naar session_regenerated_id (let op: geef als argument true mee). Door deze functie veranderd het sessie ID steeds, waardoor het lastiger wordt een login te "spoofen" en zo zonder in te loggen toch toegang te krijgen tot de beveiligde inhoud.
Ik heb aantal aanpassingen gedaan van wat je hierboven hebt opgesomd:
$_Session[naam] heb ik vervangen door $_SESSION['myusername'] = $myusername;
$_session[userlvl] waar slaat die 32 op?? en Freddie, is dat een willekeurige naam?
Moet ik op de login_success.php deze session gegevens herhalen?
Is dit dan ok? (zie code hieronder)
met deze aanpassingen geeft hij steeds wit scherm van checklogin.php en gaat niet verder. alsof hij geen connectie heeft met de database.
ben ik echt zo dom of is php moeilijker als gedacht.
gegevens beveiligen zoek ik later wel uit, eerst wil ik een werkend script.
blabla...
Ik heb je de query voorgekauwd, kopier dat eens, dan doet je pagina het tenminste ($sql = 'blabla');
Gesponsorde links
Je moet ingelogd zijn om een reactie te kunnen posten.