Aviseringar
Rensa alla

Rubrik...


sadjad
Ämnesstartare

Tjenare jag har lyckats göra en registrerings hemsida som är kopplad till mig databas och allting flyter på, nästan.
Nu gick jag över till att göra en inloggnings sida/kod men jag har fastnat på ett ställe som jag inte kan ta mig ur, kan nu hjälpa mig?.

Här får ni lite info om problemet:
Databas=registrering
tabell=registrering
Fält=loginid, password, age, email, lastname, firstname
MySql=Localhost och root har inte lösenord
Image

Det här är problemet on line 69:

Image

Det här är koden:
http://www.mediafire.com/?ndb92aivdn912c0
**************************************
<?php

// Connects to your Database

mysql_connect("localhost", "root", "") or die(mysql_error());

mysql_select_db("registrering") or die(mysql_error());

//Checks if there is a login cookie

if(isset($_COOKIE['ID_my_site']))

//if there is, it logs you in and directes you to the members page

{
$username = $_COOKIE['ID_my_site'];

$pass = $_COOKIE['Key_my_site'];

$check = mysql_query("SELECT * FROM users WHERE username = '$username'")or die(mysql_error());

while($info = mysql_fetch_array( $check ))

{

if ($pass != $info['password'])

{

}

else

{

header("Location: members.php");

}

}

}

//if the login form is submitted

if (isset($_POST['submit'])) { // if form has been submitted

// makes sure they filled it in

if(!$_POST['username'] | !$_POST['pass']) {

die('You did not fill in a required field.');

}

// checks it against the database

if (!get_magic_quotes_gpc()) {

$_POST['email'] = addslashes($_POST['email']);

}

$check = mysql_query("SELECT * FROM users WHERE username = '".$_POST['username']."'")or die(mysql_error());

//Gives error if user dosen't exist

$check2 = mysql_num_rows($check);

if ($check2 == 0) {

die('That user does not exist in our database. <a href=add.php>Click Here to Register</a>');

}

while($info = mysql_fetch_array( $check ))

{

$_POST['pass'] = stripslashes($_POST['pass']);

$info['password'] = stripslashes($info['password']);

$_POST['pass'] = md5($_POST['pass']);

//gives error if the password is wrong

if ($_POST['pass'] != $info['password']) {

die('Incorrect password, please try again.');

}
else

{

// if login is ok then we add a cookie

$_POST['username'] = stripslashes($_POST['username']);

$hour = time() + 3600;

setcookie(ID_my_site, $_POST['username'], $hour);

setcookie(Key_my_site, $_POST['pass'], $hour);

//then redirect them to the members area

header("Location: members.php");

}

}

}

else

{

// if they are not logged in

?>

<form action="<?php echo $_SERVER['PHP_SELF']?>" method="post">

<table border="0">

<tr><td colspan=2><h1>Login</h1></td></tr>

<tr><td>Username:</td><td>

<input type="text" name="username" maxlength="40">

</td></tr>

<tr><td>Password:</td><td>

<input type="password" name="pass" maxlength="50">

</td></tr>

<tr><td colspan="2" align="right">

<input type="submit" name="submit" value="Login">

</td></tr>

</table>

</form>

<?php

}

?>


   
Citera
Åtta

Du letar efter användare i tabellen "users", men din "users"-tabell heter "registrering".

1. Blanda inte språk, det kommer bara att förvirra. Håll dig till engelska.

2. Läs på om PDO. Det gör att du kan använda prepared statements, även om du inte implementerat dem direkt i din DBMS. Det gör att du är skyddad mot första gradens SQL-injektioner, samt gör att du kan byta mellan databasmiljöer utan några större problem.

2a. Du petar in $_POST-variabler direkt i databasen. Vilken skiddie som helst skulle kunna hacka din sida. Om du prompt måste använda dig av ett förlegat sätt att jobba mot din databas, använd åtminstone mysql_real_escape_string för att validera din data innan du petar in den i databasen.

3. Sätt din primärnyckel (loginid) till auto-increment. Annars kommer du att få dubletter så fort du tar bort en post ur din databas, och det får under inga som helst omständigheter hända (din primärnyckel ska alltid vara unik.

4. Använd unicode istället för latin-1. Det kommer att spara dig mycket huvudvärk.


   
SvaraCitera
sadjad
Ämnesstartare

Tack åtta det funkar skit bra nu, nästan [bigcheers]
bara en liten sak till. Fast att jag skriver rätt användarnamn och lösen så står det att jag har skrivit fel lösen, och då är jag 100% säker på kontot finns i databasen och att jag inte har skrivit fel. När jag skriver fel användarnamn står det att användarnamnet inte finns i databasen vilket säger ju att kodningen funkar nästan perfekt förutom att det är något mysko med lösenords "grejjen". Vet ni?
Image


   
SvaraCitera

Lägg upp koden på pastebin.com istället.

EDIT
Kör du md5 på passordsfältet när du lägger in dem också?


   
SvaraCitera

sadjad:

Tack åtta det funkar skit bra nu, nästan [bigcheers]

Testa att ta bort fnuttarna kring dina stringar i databas-querys.

$check = mysql_query("SELECT * FROM users WHERE username = '$username'")or die(mysql_error());

blir alltså

$check = mysql_query("SELECT * FROM users WHERE username = $username")or die(mysql_error());


   
SvaraCitera
Åtta

sadjad:

Fast att jag skriver rätt användarnamn och lösen så står det att jag har skrivit fel lösen

Tror att du missat att köra MD5 i något skede. Kanske när du lägger in lösenordet i databasen.

VictorBjelkholm:

$check = mysql_query("SELECT * FROM users WHERE username = $username")or die(mysql_error());

Är tveksam till huruvida detta kommer fungera. Kommer inte ihåg om PHP utvärderar variabler inom citationstecken. Hur som helst så fungerar följande garanterat (även om jag fortfarande inte rekommenderar att konkatenera variabler med query-strängar):

$check = mysql_query("SELECT * FROM users WHERE username = ".$username)or die(mysql_error());

   
SvaraCitera

wow


   
SvaraCitera

Varför i hela fridens namn har du användarens ID och lösenord i cookies? Jag hoppas du inser att vem som helst med tillgång till användarens dator kan sno hans cookies och sen logga in med hans konto hemifrån? Ännu värre, om användaren har dålig lösenordshygien, vilket alla användare har, så har du just läckt hans mail, Facebook, etc. till alla som har tillgång till hans dator. Lyckat.

Åtta:

Är tveksam till huruvida detta kommer fungera. Kommer inte ihåg om PHP utvärderar variabler inom citationstecken.

Jodå, inom dubbelfnuttar. Dock kommer den föreslagna koden att skita sig, eftersom SQL kräver att strings har just fnuttar på sig.


   
SvaraCitera
sadjad
Ämnesstartare

Oj tack så mycket för svaren och tipsen Åtta och Gentelrnen Nu har jag md5 och skydd mot iaf första gradens sqlinject, tror jag om jag nu har gjort rätt.
Det var jävligt dumt av mig att ha cookies, jag tog bort det.

Nu ser det ut såhär:
Login: http://pastebin.com/H94nScM1
Registrering: http://pastebin.com/SkbctL1s

Tycker ni att det är bra? jag började med MySQL och PHP i tisdag så jag är ganska noobig men jag lär mig och kommer inte ge upp![bigcheers]


   
SvaraCitera

sadjad:

skydd mot iaf första gradens sqlinject, tror jag om jag nu har gjort rätt.

Det är överlag ingen bra idé att smälla ihop SQL-strängar på det sett som du gör. Gör någonging åt det här hållet istället:


$sql = new mysqli('localhost', 'användarnamn', 'lösenord', 'databas');
$stmt = $sql->prepare('SELECT COUNT(*) FROM users WHERE user_name = ? AND hashed_password = MD5(?)');
$stmt->bind_param('ss', $username, $password);
$stmt->execute();
$users = 0;
$stmt->bind_result($users);
$stmt->fetch();
$stmt->close();
if($users > 0) {
echo "OK, inloggad!";
}

   
SvaraCitera