Problem med login.php

KingHansen

New Member
Hei, jeg er ny på dette forumet, og ganske nybegynner når det gjelder PHP. Jeg holder nå på å lage et forum, men har fått litt problemer når det gjelder å registrere brukere og å få logget inn.
Problemet mitt er at jeg får registrert brukerne, uten problemer. Men jeg får ikke logget inn med brukeren. Men hvis jeg derimot registrerer brukeren manuelt via php myAdmin, så kan jeg logge inn med brukeren. Da ligger jo passordet i klar tekst i databasen, så har en mistanke om at det er en feil som gjør at hashede passord ikke blir hentet riktig eller noe slikt.
Her er koden som utgjør login scriptet:

PHP:
<?php session_start(); 
include_once("connect.php");

// Sjekk om username tekstboksen er utfyllt
if (isset($_POST['username'])) {

	$username = $_POST['username'];
	$password = $_POST['password'];

	$sql = "SELECT * FROM forum_users WHERE username='".$username."' AND password='".$password."' LIMIT 1";

	$res = mysql_query($sql) or die(mysql_error());

	if (mysql_num_rows($res) == 1) {

		$row = mysql_fetch_assoc($res);

		$_SESSION['uid'] = $row['id'];
		$_SESSION['username'] = $row['username'];
		header("Location: index.php");
		exit();
	} else {
		echo "Ugyldig innloggings informasjon. Vennligst returner til forrige side.";
		exit();
	}
}

?>

Og her er koden for å registrere en bruker:

PHP:
<?php include 'connect.php'; ?>

<?php include 'head.php'; ?>
<?php include 'menu.php'; ?>

<?php 
//include("db.php"); 
if (isset($_POST['username']) && isset($_POST['password']) && isset($_POST['email'])) {
	$username = mysql_real_escape_string($_POST['username']); 
	$email = mysql_real_escape_string($_POST['email']);
	$password = md5($_POST['password']); 
	$sql = mysql_query("SELECT username FROM forum_users WHERE username = '".$username."'");
	
if (mysql_num_rows($sql)>0) 
{ 
die ("Brukernavn er allerede tatt."); 
} 
 
mysql_query("INSERT INTO forum_users (username, password, email) VALUES ( '$username', '$password', '$email')") or die (mysql_error()); echo "Kontoen er opprettet.";
 
} 
?>

<html></html>

<form action="register.php" method="post">
<table width="200" border="0">
  <tr>
    <td>Brukernavn:</td>
    <td> <input name="username" type="text" /></td>
  </tr>
  <tr>
    <td>Passord:</td>
    <td> <input type="password" name="password" /></td>
  </tr>
  <tr>
    <td>Email:</td>
    <td> <input name="email" type="text" /></td>
  </tr>
  <tr>
    <td><input formaction="register.php" type="submit" value="Submit" /></td>
  </tr>
</table>

</form>

Itillegg kan jeg legge til at dette er koden som blir brukt for å utføre selve logg inn prosessen, fra, head.php:


PHP:
<?php
if (!isset($_SESSION['uid'])) {
	echo "<form action='login_parse.php' method='post'>
	Brukernavn: <input type='text' name='username' />&nbsp;
	Passord: <input type='password' name='password' />&nbsp;
	<input formaction='login_parse.php' type='submit' name='submit' value='Logg inn' />
	";
} else {
	echo "<p>You are logged is as ".$_SESSION['username']." &bull; <a href='logout_parse.php'>Logout</a>";
}
?>
 

kek91

Webutvikler
Hei, for det første så hasher ikke innloggingsfunksjonen passordet, den sender bare videre med klartekst. Derfor fungerer det ikke hvis passordet er hasha i databasen.

For det andre, så må du bytte denne linjen:
PHP:
$sql = "SELECT * FROM forum_users WHERE username='".$username."' AND password='".$password."' LIMIT 1";
med
PHP:
$sql = "SELECT * FROM forum_users WHERE username='$username' AND password='$password' LIMIT 1";

Husk å krypter passordene, aldri lagre med klartekst, og ikke bruk md5 algoritme, den er for svak :)
 

KingHansen

New Member
Aah, selvfølgelig. Tusen takk for hjelpen :)

Er klar over at md5 er en veldig svak algoritme, men dette er for et veldig lite nettsted der jeg tviler på at sikkerheten vil bli noe stort problem. Men selvfølgelig, man skal jo alltid sikre brukerne. Så jeg har prøvd meg på å bruke md5 + salt nå, om du hadde giddet å se om det blir brukt på riktig måte hadde det vært flott, ettersom jeg har vært veldig lite borti denne typen sikring av passord tidligere :) Jeg får hvertfall logget inn med brukerne nå.

Utdrag fra register.php:

PHP:
$salt = "u#¤%£€$€@gh#%¤T56t5htrj454#%";
$password = md5($_POST['password'] + $salt);

Og utdrag fra login.php

PHP:
$username = $_POST['username'];
$password = md5($_POST['password'] + $salt);
 

xdex

Medlem
MD5 skal man ikke bruke, og det finnes ingen argumenter for å bruke det heller, det er rett og slett pinling og svært useriøst. Ta gjerne en titt på dette, hvis du ikke allerede har skjønt problemet: Peter Selinger: MD5 Collision Demo

Dersom du ikke helt skjønner deg på salting av passord, bør du lese denne artikkelen som går gjennom endel grunnleggende og kreative måter og beskytte brukerne sine på Understanding Hash Functions and Keeping Passwords Safe | Nettuts+

Kan også nevne at jeg hadde klart å logge meg inn på den siden der, uten noe som helst form for bruker, hva med å erstatte

PHP:
$username = $_POST['username']; 
$password = $_POST['password'];

med

PHP:
$username = mysql_real_escape_string($_POST['username']); 
$password = mysql_real_escape_string($_POST['password']);

Ser også ut som du bruker "mysql_connect" og ville kanskje prøvd å gjøre dette på en annen måte, som PHP.net selv sier:

Use of this extension is discouraged. Instead, the MySQLi or PDO_MySQL extension should be used. See also MySQL: choosing an API guide and related FAQ for more information. Alternatives to this function include:

mysqli_connect()
PDO::__construct()

Dette ble kanskje mye på en gang, men bedre å lære seg den rette måten til å begynne med.

Du skal også ta en titt på PHP: session_regenerate_id - Manual ser ikke at du bruker dette noe sted, og derfor "security issue" med mindre du har en annen løsning liggende ett sted.
 
Sist redigert:

kek91

Webutvikler
Utdrag fra register.php:

PHP:
$salt = "u#¤%£€$€@gh#%¤T56t5htrj454#%";
$password = md5($_POST['password'] + $salt);

Og utdrag fra login.php

PHP:
$username = $_POST['username'];
$password = md5($_POST['password'] + $salt);
Hyggelig å kunne hjelpe :)
Som Roaa sier, så er det mye du burde endre på, men ta 1 ting om gangen og ikke stress deg gjennom alt så lærer du det.

mysqli_connect er absolutt en bedre metode å bruke ja.

Jeg vil bare nevne at når du skal binde to variabler sammen må du bruke punktum og ikke pluss.
Altså:
PHP:
$password = md5($_POST['password'] . $salt);

Så fort du lærer deg hvordan unike salt nøkler fungerer og leser litt om krypteringsalgoritmer, så finner du ut at det er ganske lett, og det tar bare 1 minutt ekstra å sette det opp enn å bruke md5. md5 knekkes på et par minutter, men en avansert hash med unik salt og gjerne SHA 512bits kryptering krever litt lengre tid, mildt sagt.
Jeg sleit litt i begynnelsen jeg og, så jeg har skrevet en guide om det her med PHP eksempler

Anbefaler også å "vaske" variabler som fylles ut av brukere. Som Roaa nevnte så var det mulig å hacke innloggingsformen din til å logge inn uten bruker. mysql_real_escape_string() er en fin funksjon fordi den endrer alle ' til \' (legger på en backslash) slik at man ikke kan utføre SQL kommandoer direkte i skrivefeltet/adresselinja.
preg_replace og lignende funksjoner brukes ofte for å vaske user inputs for å viske vekk "farlige" tegn osv.
 

KingHansen

New Member
Tusen takk for mye konstruktiv tilbakemeldinger fra dere begge. Ble litt mye på en gang, men som du sa er det bedre å lære seg å gjøre ting riktig jo før jo bedre. Så får bare prøve å ta en ting om gangen :)

Så må jeg bare få sagt at flere av de tingene som du påpeker Roaa, det er faktisk ting som faglæreren min i Webprogrammering lærte meg for ca. et halvt år siden, blant annet bruk av md5 og mysql_connect. Og bruk av Salt lærte vi ikke av han. Så ser jo nå hvor "flink" han læreren egentlig var. :p

Men skal absolutt se nærmere på tipsene dere ga meg, og prøve å få laget en litt mer sikker løsning for forumet :)
 
Topp