Ik heb voor een opdracht een simpel loginsysteem gemaakt, maar omdat ik nog maar net begonnen ben met PHP en MySQL was ik benieuwd wat ik nog zou kunnen verbeteren.
Dit is de code die ik nu heb:
index.php
$resultc=mysql_query("select count(*) FROM users where username='$username' and password='$password' and password2='$password2' ") or die(mysql_error());
Met de rest natuurlijk ook. Waarom? Simpel. Stel je besluit nog iets te doen met alles wat je de database in schuift, dan hoef je alleen die functie aan te passen en dan word alles meteen goed gedaan. Hier maakt dat nog niet zoveel uit, maar als je heel veel dingen hebt, kun je die functie overal gebruiken, en dus heel snel alles veranderen door dat ene ding aan te passen
Dan doe je ook "$row = mysql_fetch_array". Je kunt beter 'array' vervangen door 'assoc'. Assoc is sneller, en dan gebruik je het zo:
$row['kolomnaam']. Hetzelfde als nu dus. als je 'array' heb, werkt $row[0] en $row[3] enzo ook, maar die gebruik je niet dus dat remt onnodig af
@martijn
dank je wel voor je reactie,
En is er misschien nog iets dat ik het beter kan beveiligen?? Had wel al het een en ander op internet opgezocht maar kon er niet echt goed uitkomen hoe ik het beter kan beveiligen.
edit,
Heb het nu toegepast, is nu het volgende geworden:
$resultc=mysql_query("select count(*) FROM users where username='".$username."' and password='".$password."' and password2='".$password2."' ") or die(mysql_error());
$result=mysql_query("SELECT * FROM users where username='".$username."' and password='".$password."' and password2='".$password2."' ") or die(mysql_error());
Er klopt iets niet; waarom sla je het wachtwoord twee keer op in de database, een keer met sha1 en een keer met md5? Als iemand al je database hackt en hij krijgt een van deze wachtwoorden (kleine kans) weet hij ze dus allebei. Waarom twee opslaan?
Edit:or die (mysql_error()); gebruiken in een live script is niet zo handig, dan kunnen de gebruikers meteen zien wat de error is en daar eventueel misbruik van maken.
Ik zou het vervangen door een eigen error_report functie:
mail('jouw_email','MySQL Error in Login.php',$logentry);
}
De mail-functie moet je even naar behoren aanpassen.
Wat dit doet is: Het schrijft de error en datum weg in het bestand sqllog.txt en mailt jou de error.
Je moet niet aan andere programmeurs vragen of je code beter kan. Namelijk, het kan altijd beter! Hoe goed je ook programmeert! Er is altijd wel 1 slimmerik die het net even beter weet;)
@D_O
Uit eindelijk is de code zo minimaal dat ie niet meer kleiner kan, en moeilijk te verbeteren is en dan snap ik er niks meer van XD
offtopic: Altijd als ik zelf een ledensysteem maak.. gebruik ik Sessies inplaats van coockies.. Maar wat raden jullie nou eigenlijk aan?? Ikzelf vind Sessies echt heelrijk lopen.. maar brengt dit nou eigenlijk problemen met zich mee??
Om hier een discussie te voorkomen.. gelieve me een PB te sturen =)
@TotempaaltJ
Dank je wel, ga ik zeker toepassen in me scripts, alleen waarom zou je het en mailen en opslaan in een .txt. Een hacker kan dan toch ook op zoek gaan naar me errorlogs? en hoe roep je jouw functie aan, gewoon zo: ReportSQLError(mysql_error());???
@D_O
Ik vraag of ik dit beter/anders kan doen omdat ik nog niet zo ervaren ben met php en ik graag wil weten hoe andere mensen dit doen.
@TotempaaltJ
Dank je wel, ga ik zeker toepassen in me scripts, alleen waarom zou je het en mailen en opslaan in een .txt. Een hacker kan dan toch ook op zoek gaan naar me errorlogs?
Je moet $file aanpassen naar een bestand dat niet in de home-directory van je website staat, dus als je website staat in /jasper56/http_files, hem bijv zetten in /jasper56/log.txt of /jasper56/logs/log.txt oid, dan kan een hacker er niet bij.
jasper56 schreef:
en hoe roep je jouw functie aan, gewoon zo: ReportSQLError(mysql_error());???
Jup, helemaal perfect
jasper56 schreef:
offtopic: Altijd als ik zelf een ledensysteem maak.. gebruik ik Sessies inplaats van coockies.. Maar wat raden jullie nou eigenlijk aan?? Ikzelf vind Sessies echt heelrijk lopen.. maar brengt dit nou eigenlijk problemen met zich mee??
Sessies, altijd! Cookies worden namelijk opgeslagen op de computer van de gebruiker en kan hij dus zomaar aanpassen en daarmee zichzelf bijv in Admin ofzo veranderen. Sessies worden, daarentegen, opgeslagen op de server en kan de gebruiker dus niet aanpassen.
Overigens maakt de sessie standaard ook gebruik van cookies, maar dan staat er maar een ding in: het unieke id van de sessie, zodat hij weet welke sessie hij moet hebben.
onjuist van de sessies sessie is ook een cookie. Alleen een heel stuk lastiger te bereiken. Iig niet voor de gemiddelde gebruiker
Een sessie is een cookie op de server. Dus niet precies hetzelfde
Voor mijn weten is sha1() het veiligst, en is dat nog niet gehackt, maar volgens mij is dat ook zo met md5...
md5 werkt perfect bij mij, dus waarom zou je 'm niet gebruiken...
Het is een codering die na mijn weten nog niet mogelijk is om de md5 hash te converten naar het oorspronlijke woord..
Om terug te komen op je code..
Het enigste wat je dan eventueel zou kunnen veranderen is een function maken zoals eerder is gezegt voor regel 10 t/m 12
@sessies
Ja dus sessies veiligst opzich.. maar het nare is dat de sessie variablen af en toe verkeerd behandeld bij mij.. Ik kan bijv. $_SESSIE['naam'] een nieuwe waarde geven, maar af en toe geeft hij toch nog de oude waarde weer.
<?php
/**
* @author Jasper van Oeffel
* @copyright 2010
*/
/**
* funtion to make database input safer
*/
function toDatabase($string){
$string = mysql_real_escape_string($string);
$string = strip_tags($string);
return $string;
}
/**
* function to repport MySQL error's to the webmaster
*/
function ReportSQLError($error) {
$file = 'sqllog.php';
$datetime = date("d/m/y H:i:s");
$logentry = "[".$datetime."] ".$error."\n";
file_put_contents($file, $logentry, FILE_APPEND);
mail('jasper@vanoeffelhaarlem.nl', 'MySQL Error in Login.php', $logentry);
return "There was an error with the MySQL database, the webmaster is informed";
}
/**
* function that setup's a connection to the MySQL database
*/
function setupDatabaseConnection(){
if((!mysql_connect(DB_SERVER, DB_USER, DB_PASS))||(!mysql_select_db(DB_NAME)))return false;
else return true;
}
/**
* function to secure the webpage
*/
function checkLogin($rights){
if(isset($_SESSION['id'])){
if($_SESSION['rights'] >= $rights) return true;
else return false;
}
else return false;
}
?>
Hmm, misschien kan je die beveiligde pagina ook nog loggen als er niet voldoende rights voor hebt, maar dan met een error als "Hacker Attempt by (ip-adres)". Dan zou je de ReportSQLError functie moeten veranderen in ReportError en nog een paar dingen daar moeten aanpassen (niet perse natuurlijk), maar het is altijd handig om zoveel mogelijk wat niet hoort te loggen; je zou in principe niet op die pagina moeten komen, dus dat is wss een hack poging
Verder vind ik het een heel mooi script, mooier dan wat ik maak XD