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
Det här är problemet on line 69:
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
}
?>
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.
Tack åtta det funkar skit bra nu, nästan
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?
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å?
sadjad:
Tack åtta det funkar skit bra nu, nästan
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());
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());
wow
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.
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!
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!";
}