Beste PHP'ers,

Ik heb hetvolgende script:

<?php
function login($naam, $wachtwoord, $action) {
$output = '';
if ($action == "inloggen") {
if (isset($_COOKIE["hash"])) {
$_COOKIE["hash"]=mysql_real_escape_string($_COOKIE["hash"]);
$qry = 'SELECT * FROM gebruikers WHERE hash = "'.$_COOKIE['hash'].'" AND ip = "'.$_SERVER['REMOTE_ADDR'].'"';
if ( !($result=mysql_query($qry)) ) {
$output .= '<br />Error: '.mysql_error();
}
else {
if (mysql_num_rows($result) == 1) {
$output .= '<br />U bent reeds ingelogd.';
$niet_ingelogd=0;
}
else {
$niet_ingelogd=1;
}
}
}
else {
$niet_ingelogd=1;
}
if (isset($naam) && isset($wachtwoord) && $niet_ingelogd == 1) {
$naam=mysql_real_escape_string($naam);
$wachtwoord=mysql_real_escape_string($wachtwoord);
$hash=md5(time());
$sql = 'SELECT * FROM gebruikers WHERE gebruikersnaam = "'.$naam.'" AND wachtwoord = "'.md5($wachtwoord).'"';
if ( !($result = mysql_query($sql)) ) {
$output .= '<br />Error: '.mysql_error();
}
else {
if (mysql_num_rows($result) == 0) {
$output .= '<br />U heeft een verkeerde naam en/of wachtwoord ingevuld.';
}
else {
$output .= '<br />U bent succesvol ingelogd!';
if ( !(mysql_query('UPDATE gebruikers SET hash = "'.$hash.'", ip = "'.$_SERVER['REMOTE_ADDR'].'" WHERE gebruikersnaam = "'.$naam.'" AND wachtwoord = "'.md5($wachtwoord).'"')) ) {
$output .= '<br />Error: '.mysql_error();
}
else {
setcookie('hash', $hash);
}
}
}
}
elseif ($niet_ingelogd == 1) {
$output .= '<br />Error, u heeft geen naam en of wachtwoord ingevuld!';
}
}
$output = preg_replace('(<br />)', '', $output, 1);
return $output;
}
function check($hash, $ip) {
$output = '';
if (isset($hash)) {
$hash=mysql_real_escape_string($hash);
$ip=mysql_real_escape_string($ip);
$qry = 'SELECT * FROM gebruikers WHERE hash = "'.$hash.'" AND ip = "'.$ip.'"';
if ( !($result=mysql_query($qry)) ) {
$output .= '<br />Error: '.mysql_error();
}
else {
if (mysql_num_rows($result) == 1) {
while ($row = mysql_fetch_assoc($result)) {
$output .= 'Welkom op uw eigen gedeelte '.$row["gebruikersnaam"].'!';
}
}
else {
$output .= 'U bent niet ingelogd, klik <a href="index.php?action=inloggen">hier</a> om in te loggen of <a href="index.php?page=registreer">hier</a> om gratis een account aan te maken';
}
}
}
else {
$output .= 'U bent niet ingelogd, klik <a href="index.php?action=inloggen">hier</a> om in te loggen of <a href="index.php?page=registreer">hier</a> om gratis een account aan te maken';
}
$output = preg_replace('(<br />)', '', $output, 1);
return $output;
}
function uitloggen($hash, $ip) {
$output = '';
if (isset($hash)) {
$hash=mysql_real_escape_string($hash);
$ip=mysql_real_escape_string($ip);
$qry = 'SELECT * FROM gebruikers WHERE hash = "'.$hash.'" AND ip = "'.$_SERVER['REMOTE_ADDR'].'"';
if ( !($result = mysql_query($qry)) ) {
$output .= '<br />Error: '.mysql_error();
}
else {
if (mysql_num_rows($result) == 1) {
$output .= '<br />U bent succesvol uitgelogd!';
setcookie('hash', '', time() - 3600);
}
else {
$output .= 'U bent niet ingelogd, en kan dus ook niet uitloggen...';
}
}
}
else {
$output .= 'U bent niet ingelogd, en kan dus ook niet uitloggen...';
}
$output = preg_replace('(<br />)', '', $output, 1);
return $output;
}
?>

En:

<?php
include("pages/check_login.php");
if (isset($_GET["action"])) {
if ($_GET["action"] == "inloggen" || $_GET["action"] == "checken" || $_GET["action"] == "uitloggen") {
if ($_GET["action"] == "inloggen") {
if (isset($_POST["name"]) && isset($_POST["pass"])) {
if (isset($_GET["action"])) {
$action=$_GET["action"];
}
else {
$action='inloggen';
}
$user = login($_POST["name"], $_POST["pass"], $action);
echo $user;
}
else {
echo '<form name="form" method="post" action="?action=inloggen">';
echo 'Name <input type="text" name="name"> ';
echo 'Pass <input type="password" name="pass"><input type="submit" value="submit" alt="login" name="login">';
echo '</form>';
}
}
if ($_GET["action"] == 'checken') {
$checken = check($_COOKIE["hash"], $_SERVER['REMOTE_ADDR']);
echo $checken;
}
if ($_GET["action"] == 'uitloggen') {
if (isset($_COOKIE["hash"])) {
$uitloggen = uitloggen($_COOKIE["hash"], $_SERVER['REMOTE_ADDR']);
echo $uitloggen;
}
else {
echo 'U bent niet ingelogd, en kan dus ook niet uitloggen... ';
}
}
}
else {
echo 'Er is een onbekende actie meegegeven!';
}
}
?>

Is het idee veilig genoeg ??
Ik heb nog niet echt inhoudelijk gekeken maar de eerste twee minpunten die ik zie is dat je nog steeds mysql_ gebruikt en ik zie geen enkele regel commentaar met wat je nu waar doet.
Je kijkt niet naar het aantal pogingen en hebt geen vertraging of iets, dus bruteforcen is mogelijk. Of je zet in een sessie/database hoe vaak er al ik geprobeerd in te loggen, of je zet ergens een sleep van bijvoorbeeld 3 seconden (erg gebruikers onvriendelijk).
Mark schreef op 03.09.2009 17:41
Ik heb nog niet echt inhoudelijk gekeken maar de eerste twee minpunten die ik zie is dat je nog steeds mysql_ gebruikt en ik zie geen enkele regel commentaar met wat je nu waar doet.


Uhm, wat zou jij anders doen qua mysql_* dan ?
Ik vind hem onduidelijk,
1- Je verteld niet wat je doet dmv commentaar (Wat mark ook al zei)
2- Je hebt echt geen 1 wit regel waardoor alles op elkaar licht
3- Er is ook geen spatie te bekennen tussen bijv $action=$_GET["action"];
dit vind ik persoonlijk moeilijk te lezen, dus ik zou zoiezo dat eerst veranderen en dan is het tijd voor de code....

vind ik
Uhm, waarom zou ik er commentaar tussen stoppen ? lijkt me duidelijk wat er gebeurd toch......
Verder, het is een script voor mijzelf (niet voor script lib of voor een ander) dus punt 2 en 3 vind ik niet van toepassing, mijn vraag is gewoon: is het veilig....
Kijk eens naar mysqli of pdo. Met MySQL is niets mis integendeel zelfs maar je manier van aanroepen is verouderd.

Commentaar in een script is handig als je er over een tijdje er iets aan wilt veranderen. Ja je kan een script zonder commentaar lezen maar met is veel gemakkelijker.
Okee, maar behalve bruteforcen is dit script wel veilig voor gebruik ??
En waar zet je de content van de site? Kan je niet gewoon langs de inlog?
Content is er gewoon altijd, alleen sommige acties zijn alleen beschikbaar voor degene die ingelogd zijn.

Maar hiervoor gebruik ik dit stukje code om dit te controleren: $checken = check($_COOKIE["hash"], $_SERVER['REMOTE_ADDR']);
/home/joost schreef op 03.09.2009 19:10

$checken = check($_COOKIE["hash"], $_SERVER['REMOTE_ADDR']);

En hoe staat dat dan in je script?
En wat staat er dan onder voor regel?

Reageren