Loginscript werkt niet
Ik ben bezig met een PHP/SQL login script. Nu heb ik mijn script die checkt of wachtwoord en login naam in de database staan. maar als ik het goede wachtwoord en loginnaam invoer krijg ik toch de error. Wie kan me helpen?
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<?php
require("config.php");
if(!$_GET['act']){
echo("<form method='POST' action='$PHP_SELF?act=login'>
Username: <input type='text' name='username' /><br />
Password: <input type='password' name='password' /><br />
<input type='submit' value='Login!' />
</form");
} if($_GET['act'] == "login"){
$username = ($_POST['username']);
$password = ($_POST['password']);
$check = 'SELECT * FROM project2_members WHERE username = "$username" AND password = "$password" ';
$res = mysql_query($check);
if(mysql_num_rows($res) == 1){
//The user had the correct login details
echo("You have been logged in.");
$_SESSION['loggedin'] = "true";
$_SESSION['username'] = $_POST['username'];
}if(mysql_num_rows($res) <= 0){
echo("The username/password was not found. $username $password");
}}
?>
require("config.php");
if(!$_GET['act']){
echo("<form method='POST' action='$PHP_SELF?act=login'>
Username: <input type='text' name='username' /><br />
Password: <input type='password' name='password' /><br />
<input type='submit' value='Login!' />
</form");
} if($_GET['act'] == "login"){
$username = ($_POST['username']);
$password = ($_POST['password']);
$check = 'SELECT * FROM project2_members WHERE username = "$username" AND password = "$password" ';
$res = mysql_query($check);
if(mysql_num_rows($res) == 1){
//The user had the correct login details
echo("You have been logged in.");
$_SESSION['loggedin'] = "true";
$_SESSION['username'] = $_POST['username'];
}if(mysql_num_rows($res) <= 0){
echo("The username/password was not found. $username $password");
}}
?>
Gewijzigd op 07/02/2012 21:10:32 door Matthijs Vos
- niet controleren met !$_GET, maar met isset($_GET)
- geen foutafhandeling
- geen variabelen kopieren op regel 12 en 13
- niet selecteren met *
- sql injectie gevoelig
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php
if (mysql_num_rows($res) == 0 ) {
echo "the username/password not found";
}
else {
/rest van code
}
?>
if (mysql_num_rows($res) == 0 ) {
echo "the username/password not found";
}
else {
/rest van code
}
?>
dus als je NIKS vind krijg je error, en anders ga je verder.. nu chek je het dubbelop en daar gaat ergens fout ( volgens mij )
nu doe je de hele tijd een IF zonder foutafhandeling dus je weet ook niet waarom het komt je doet gewoon alless zonder antwoord te krijgen,
- maak van de if op regel 22 een else
Bedankt voor je reactie. Heb de isset aangepast: if (isset($_GET['act'])) {
Wat bedoel je met geen foutafhandeling en geen variabele kopieren??
Waar moet ik dan mee selecteren? username, password??
Wat betreft sql injectie dat klopt, maar wil hem eerst draaiend hebben en dan die beveiliging er op.
Matthijs
Toevoeging op 07/02/2012 21:29:03:
Op regel 12 en 13 'kopieer' je de get in een andere variabelen. Zet deze gewoon direct waar je ze hebben wilt, ipv kopieren. O
Zoek hier in de tutorials eens naar hoe je sql bouwt, en hoe je dat afhandelt.
O ja, variabelen buiten qoutes
de get gebruik ik voor de login.php?act=login e.d. de post is voor ($_POST['username']); of klopt dat zo niet??
Verder heb ik het script nu aangepast maar als ik het nu uitvoer krijg ik na te zijn ingelogd een witte pagina:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<?php
require("config.php");
if (!isset($_GET['act'])) {
echo("<form method='POST' action='$PHP_SELF?act=login'>
Username: <input type='text' name='username' /><br />
Password: <input type='password' name='password' /><br />
<input type='submit' value='Login!' />
</form");
} if (isset($_GET['?act=login'])){
$username = ($_POST['username']);
$password = ($_POST['password']);
$check = 'SELECT * FROM project2_members WHERE username = "$username" AND password = "$password" ';
$res = mysql_query($check);
$count = mysql_num_rows($res);
if($count==0){
echo("The username/password was not found. $username $password");
} else{
//The user had the correct login details
echo("You have been logged in.");
$_SESSION['loggedin'] = "true";
$_SESSION['username'] = $_POST['username'];
}}
?>
require("config.php");
if (!isset($_GET['act'])) {
echo("<form method='POST' action='$PHP_SELF?act=login'>
Username: <input type='text' name='username' /><br />
Password: <input type='password' name='password' /><br />
<input type='submit' value='Login!' />
</form");
} if (isset($_GET['?act=login'])){
$username = ($_POST['username']);
$password = ($_POST['password']);
$check = 'SELECT * FROM project2_members WHERE username = "$username" AND password = "$password" ';
$res = mysql_query($check);
$count = mysql_num_rows($res);
if($count==0){
echo("The username/password was not found. $username $password");
} else{
//The user had the correct login details
echo("You have been logged in.");
$_SESSION['loggedin'] = "true";
$_SESSION['username'] = $_POST['username'];
}}
?>
als jij een taart naar iemands gezicht gooit , krijg je geen reactie of je het goed hebt gedaan of niet goed hebt gedaan. ( oftewel een fouthandeling )
dat doe je doormiddel van een IF / ELSE
dus IF (ik gooi een taart op zijn gezicht ){
echo "de man rent achter me aan";
}
else {
echo "de man blijft stilstaan";
}
Oke, klopt inderdaad, heb ik nu opgelost
@jeroen
Als ik doe:
'SELECT * FROM project2_members WHERE username = "('$_POST['username']')" AND password = "('$_POST['password']')" ';
Krijg ik een error, komt ik doe denk ik iets verkeerd met de quoute's maar weet niet wat.
Ten tweede, haal altijd variabelen buiten quotes:
"SELECT * FROM project2_members WHERE username = '" . $_POST['username'] . "' AND password = '" . $_POST['password'] . "'"
Toevoeging op 07/02/2012 21:48:49:
Verder is het natuurlijk slecht om wachtwoorden plain-text op te slaan, maar dat terzijde
Allemaal hartstikke bedankt, login doet het.
Wat betreft plain-text dat was puur omdat hij het niet deed dat ik de md5 had weggehaald.
Nog een 2e vraag wat kan ik nog doen om sql-injection tegen te gaan??
Alle gegevens die van de gebruiker komen mysql_real_escape_string() omheen zetten. Nogmaals, ik verwijs je naar de tutorials over sql en foutafhandeling hier op phphulp
Oke, ga ik zeker even gebruiken, hartstikke bedankt voor alle hulp. Mag dit topic nog even open blijfen voor evt. vragen?
Maak je daarover geen zorgen; topics worden nooit gesloten tenzij daar een goede reden voor is.
Oke, je ziet op veel forums dat ze worden gesloten als alles is opgelost. Ga zeker het script van beginnersfouten doornemen. Bedankt
dat doe je als volgt
Code (php)
1
2
3
4
5
6
2
3
4
5
6
<?php
"SELECT * FROM project2_members WHERE username = '" . $_POST['username'] . "' AND password='".md5($_POST['password'])."'
?>
"SELECT * FROM project2_members WHERE username = '" . $_POST['username'] . "' AND password='".md5($_POST['password'])."'
?>
mysql_real_escape_string.
En een wachtwoord met alleen md5 is allang niet veilig meer. Gebruik een Salt + Pepper (liefst dynamisch) en een van de sha* decrypt functies.
@reshadd, ga aub eerst zelf leren voordat je antwoorden wilt geven! Want ook dit script is hackgevoelig door geen gebruik En een wachtwoord met alleen md5 is allang niet veilig meer. Gebruik een Salt + Pepper (liefst dynamisch) en een van de sha* decrypt functies.
Je moet wanneer je inlogt het ingevoerde wachtwoord encoden en DIE vergelijken met een record uit de database.
Overigens is MD5 niet aan te raden voor wachtwoord hashes.
Overigens, wat is de beste manier om te cobtroleren of een form verzonden is?
matthijs raad hem aan om zijn wachtwoorden te beveiligen, hij zegt dat hij de MD5 weg had gehaald omdat het niet werkte met inloggen, dus ik legde hem uit hoe dat kan, het ging om de MD5! dus ik snap niet waarom jij over de mysql_real_escape_string komt terwijl we het over de MD5 hebben?
en dat je md5 beter niet kan gebruiken dat snap ik ook wel maar het ging hier even om waarom zijn md5 het NIET deed en hoe het wel ZOU KUNNEN werken
@roel encoden thats what i ment maar ik gaf er een voorbeeld bij toch ;) dus als ik ipv encoden per ongeluk decoden zeg dan gaat de wereld er niet ten onder van kan iedereen overkomen als je van 7 uur tot nu aan het werk bent -_- maar ik zal er voortaan op letten