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();
}
}
?>
[/PHP]
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.";
}
?>
Brukernavn:
Passord:
Email:
[/PHP]
Itillegg kan jeg legge til at dette er koden som blir brukt for å utføre selve logg inn prosessen, fra, head.php:
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”;[/php]
med
[php]
$sql = “SELECT * FROM forum_users WHERE username=‘$username’ AND password=‘$password’ LIMIT 1”;
[/php]
Husk å krypter passordene, aldri lagre med klartekst, og ikke bruk md5 algoritme, den er for svak
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å.
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
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.
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);[/php]
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.
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.
Men skal absolutt se nærmere på tipsene dere ga meg, og prøve å få laget en litt mer sikker løsning for forumet