Permalänk

PHP-mysterium

Jag håller på å lära mig PHP och håller just nu på att testa att skriva en enkel login sida.
Eftersom jag mest "leker" så använder jag MySQL-tabellens primary id som användarnamn, och två lösenord.

Nu har jag dock stött på ett problem som jag inte fattar hur det ens kan uppstå.
När jag kollar ett av de inskrivna lösenorden med lösenordet i databasen så tycker den att de både är lika, och inte är lika.

Inloggningssidan är skriven såhär:

<html> <form action='login.php' method='POST'> ID: <input type='text' name='id'><br> Pw1: <input type='password' name='pw1'><br> Pw2: <input type='password' name='pw2'><br> <input type='submit' value='Logga in'> </form> </html>

Och PHP-koden som jag använder ser ut såhär:

<?php $user = $_POST['id']; $pw1 = $_POST['pw1']; $pw2 = $_POST['pw2']; if (!$user||!$pw1||!$pw2) { die("Saknas text i något av fälten"); } //Anslut til databasen include("connstring.php"); if (!$con) { die('CONNECT FEL: ' . mysql_error()); } mysql_select_db($db, $con) or die('SELECT DB FEL: ' . mysql_error()); //Kollar användaren $query = mysql_query("SELECT * FROM safe WHERE id='$user'"); if (!$query) { die("SELECT FEL: " . mysql_error()); } $numrows = mysql_num_rows($query); if ($numrows==0) { die("Fel id"); } $test = 0; // SKA BORT //Kollar lösen //Skapar en array while ($row = mysql_fetch_assoc($query)) { $test = $test + 1; // SKA BORT //Lägger anv o lösen i variabler $dbuser = $row['id']; $dbpw1 = $row['username']; $dbpw2 = $row['password']; echo($test . "<p>"); // SKA BORT } echo("PW1: " . $pw1 . "<br>dbpw1: " . $dbpw1 . "<br>"); // SKA BORT if ($pw1===$dbpw1); // SKA BORT { echo("Identisk<br>"); } if ($pw1==$dbpw1); // SKA BORT { echo("Samma<br>"); } if ($pw1!=$dbpw1); // SKA BORT { echo("Inte Samma<br>"); } if ($pw1!==$dbpw1); // SKA BORT { echo("Inte Identisk<br>"); } // kollar om anv o lösen matchar /*if ($user===$dbuser && $pw1===$dbpw1 && $pw2===$dbpw2); { echo("Inloggad"); } /*else { echo("Fel lösenord"); }*/ ?>

Det som skrivs ut på sidan är följande:

1 PW1: atgjhfxdhj dbpw1: abc123 Identisk Samma Inte Samma Inte Identisk

Sidan finns att testa på: http://erikh.se/log/pw.html

Jag fattar inte riktigt hur $pw1!=$dbpw1 och $pw1==$dbpw1 båda kan vara True.
Men som sagt så håller jag på å lär mig, så de e säkert nått jättelätt som jag har missat eller inte ser.

Tacksam för hjälp

Permalänk

Det ska inte vara något semikolon efter if-satserna.

Din kod är sårbar för SQL-injektion som den är nu. Se http://php.net/manual/en/function.mysql-real-escape-string.ph... för mer information.

Permalänk
Medlem

Varför använder du "ID"?

`id` int(4) NOT NULL auto_increment - det skulle generera ett unikt ID för alla som registrerar sig.

Permalänk
Avstängd

Som Strikatarn sa ta bort semikolon efter if satsen:
Till exempel

if ($pw1===$dbpw1) // SKA BORT { echo("Identisk<br>"); }

För om du har semikolon kommer ifsatsen sluta vid semikolonet och alla dina utskrifter kommer att skrivas ut även fast ifsatsen är falsk

Permalänk
Medlem

Använd strcmp för att kolla om två variablar är lika.

<?php $var1 = "ett"; $var2 = "ett"; if (strcmp($var1, $var2) === 0) echo "Lika."; else echo "Olika."; ?>

Permalänk
Skrivet av Striktarn:

Det ska inte vara något semikolon efter if-satserna.

Skrivet av Pandy95:

Som Strikatarn sa ta bort semikolon efter if satsen:
Till exempel

if ($pw1===$dbpw1) // SKA BORT { echo("Identisk<br>"); }

För om du har semikolon kommer ifsatsen sluta vid semikolonet och alla dina utskrifter kommer att skrivas ut även fast ifsatsen är falsk

Ah, vist ja. Viste att det var nått enkelt jag hade missat.

Tack för hjälpen

Skrivet av Striktarn:

Din kod är sårbar för SQL-injektion som den är nu. Se http://php.net/manual/en/function.mysql-real-escape-string.ph... för mer information.

Jodå, jag vet. Men mitt mål just nu är bara att få till en fungerande inloggning. Därefter tänkte jag lägga till ytterligare funktioner, som att förhindra SQL-injection. Tänkte också hasha lösenordet.

Skrivet av Wollsan:

Varför använder du "ID"?

`id` int(4) NOT NULL auto_increment - det skulle generera ett unikt ID för alla som registrerar sig.

Är inte säker på vad du menar.
Kan det bli problem med att använda primär id:t som användarnamn? Som du säger så skapar det ju ett unikt id för alla användare så de kommer ju inte finnas två likadana användarnamn...

Skrivet av Marwelln:

Använd strcmp för att kolla om två variablar är lika.

<?php $var1 = "ett"; $var2 = "ett"; if (strcmp($var1, $var2) === 0) echo "Lika."; else echo "Olika."; ?>

Ah, tack för tipset. Dedär ska jag ta och testa.

Permalänk
Skrivet av UNDO_2000:

Jodå, jag vet. Men mitt mål just nu är bara att få till en fungerande inloggning. Därefter tänkte jag lägga till ytterligare funktioner, som att förhindra SQL-injection. Tänkte också hasha lösenordet.

Visst har sweclockers bland dom trevligaste medlemmarna av alla svenska forum, men det finns fula fiskar överallt.
Det är öppet för SQL-injections och du har klart och tydligt skrivit ut vad din tabell heter

Permalänk
Medlem

Jag skulle nog påstå att det nästan är viktigare att skydda mot SQL-injections än att kunna logga in. Det säger jag av erfarenhet

Visa signatur

11600K@5.1 GHz + 32GB Corsair Vengeance RGB PRO 3200@3400 MHz + MSI RTX 2080 Super Gaming X Trio +
WDC Blue SN550 1TB + Black OEM SN730 500GB + Kingston A1000 480GB + A2000 500GB + NV2 1TB + 2TB R10 + RGB most of THE THINGS! + Corsair 4000D Airflow + 2*ZyXEL NSA326 2*3TB @ R1 + Netgear RN2100 4*3TB @ R10 + RN204 4*4TB @ R5 + Synology DS216j 2*4TB @ SHR R1 + DS418 4*8TB @ SHR R6