Hallo,

Ik wou jullie even mijn PHP script laten controleren (als jullie tijd hebben). Ik heb de laatste tijd veel doorgenomen bij w3schools.com en andere php informatie websites. Zouden jullie even willen kijken of mijn script veilig is? Kwa SQL-injections etc. (bruteforce protection zit erop :-), en al uitgetest)


<?php
if (date("d-m-Y") <= "26-03-".date("Y"))
{
  $_SERVER['unix'] = strtotime("UTC");
}

if (date("d-m-Y") >= "26-03-".date("Y"))
{
    $_SERVER['unix'] = strtotime("UTC +1 hour");
}

function loggedIn()
{
  if (!empty($_SESSION['id']) && is_numeric($_SESSION['id']))
  {
    return true;
  }
  else
  {
    return false;
  }
}

function getIpadress()
{
  if (!empty($_SERVER['HTTP_CLIENT_IP']))
  {
    $_SERVER['ip'] = $_SERVER['HTTP_CLIENT_IP'];
  }
  elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR']))
  {
    $_SERVER['ip'] = $_SERVER['HTTP_X_FORWARDED_FOR'];
  }
  else
  {
    $_SERVER['ip'] = $_SERVER['REMOTE_ADDR'];
  }
}

function checkWrongAttempts() {
  include($_SERVER['DOCUMENT_ROOT'].'/paneel/includes/init.php');

  getIpadress();
  $ip = sha1($_SERVER['ip']);
  $datum = $_SERVER['unix'];

  $searchForWrongAttempts = $link->query("SELECT * FROM `paneel_foutepogingen` WHERE `ip`='$ip' ORDER BY `datum_foutepoging` DESC");
  if (!$searchForWrongAttempts)
  {
    echo '0+Er is een fout opgetreden, kom later terug';
    exit();
  }
  else
  {
    if ($searchForWrongAttempts->num_rows > 3)
    {
      $wrongAttempts = $searchForWrongAttempts->fetch_assoc();
      if ($_SERVER['unix'] <= strtotime('+15 minutes', $wrongAttempts['datum_foutepoging']))
      {
        $searchForLoginLog = $link->query("SELECT * FROM `paneel_logs` WHERE `ip`='$ip' AND `bericht`='Te veel foute pogingen achter elkaar om in te loggen/registreren/wachtwoord veranderen' ORDER BY `datum_log` DESC");
        if (!$searchForLoginLog)
        {
          echo '0+Er is een fout opgetreden, kom later terug';
          exit();
        }
        else
        {
          $loginLog = $searchForLoginLog->fetch_assoc();

          if ($_SERVER['unix'] >= strtotime('+15 minutes', $loginLog['datum_log']) || $searchForLoginLog->num_rows === 0)
          {
            $insertLog = $link->query("INSERT INTO `paneel_logs` (`ip`, `bericht`, `plaats`, `datum_log`) VALUES ('$ip', 'Te veel foute pogingen achter elkaar om in te loggen/registreren/wachtwoord veranderen', 'index', '$datum')");
            if (!$insertLog)
            {
              echo '0+Er is een fout opgetreden, kom later terug';
              exit();
            }
            else
            {
              echo '0+Er is een fout opgetreden, kom later terug';
              exit();
            }
          }
          else
          {
            echo '0+Er is een fout opgetreden, kom later terug';
            exit();
          }
        }
      }
      else
      {
        $deleteWrongAttempts = $link->query("DELETE FROM `paneel_foutepogingen` WHERE `ip`='$ip'");
        if (!$deleteWrongAttempts)
        {
          echo '0+Er is een fout opgetreden, kom later terug';
          exit();
        }
      }
    }
  }
}

function login($gebruikersnaam, $wachtwoord)
{
  include($_SERVER['DOCUMENT_ROOT'].'/paneel/includes/init.php');

  checkWrongAttempts();
  getIpadress();
  $ip = sha1($_SERVER['ip']);
  $datum = $_SERVER['unix'];
  $gebruikersnaam = $link->real_escape_string($gebruikersnaam);

  $searchForUser = $link->query("SELECT * FROM `leden` WHERE `gebruikersnaam`='$gebruikersnaam'");
  if (!$searchForUser)
  {
    $insertWrongLogin = $link->query("INSERT INTO `paneel_foutepogingen` (`ip`, `datum_foutepoging`) VALUES ('$ip', '$datum')");
    if (!$insertWrongLogin)
    {
      echo '0+Probeer het later opnieuw om in te loggen';
    }
    else
    {
      echo '0+Probeer het later opnieuw om in te loggen';
    }
  }
  else
  {
    if ($searchForUser->num_rows === 1)
    {
      $userDetails = $searchForUser->fetch_assoc();

      if (password_verify($wachtwoord, $userDetails['wachtwoord']))
      {
        $updateUserAccount = $link->query("UPDATE `leden` SET `laatst_online`='$datum' WHERE `gebruikersnaam`='$gebruikersnaam'");
        if (!$updateUserAccount)
        {
          echo '0+Probeer het later opnieuw om in te loggen';
        }
        else
        {
          $_SESSION['id'] = $userDetails['id'];
          echo '1+Je bent succesvol ingelogd';
        }
      }
      else
      {
        $insertWrongLogin = $link->query("INSERT INTO `paneel_foutepogingen` (`ip`, `datum_foutepoging`) VALUES ('$ip', '$datum')");
        if (!$insertWrongLogin)
        {
          echo '0+Probeer het later opnieuw om in te loggen';
        }
        else
        {
          echo '0+Er zijn foute log in gegevens ingevuld';
        }
      }
    }
    else
    {
      $insertWrongLogin = $link->query("INSERT INTO `paneel_foutepogingen` (`ip`, `datum_foutepoging`) VALUES ('$ip', '$datum')");
      if (!$insertWrongLogin)
      {
        echo '0+Probeer het later opnieuw om in te loggen';
      }
      else
      {
        echo '0+Deze gebruiker kan niet worden gevonden';
      }
    }
  }
}

function register($gebruikersnaam, $wachtwoord, $wachtwoordher, $emailadres)
{
  include($_SERVER['DOCUMENT_ROOT'].'/paneel/includes/init.php');

  checkWrongAttempts();
  getIpadress();
  $ip = sha1($_SERVER['ip']);
  $datum = $_SERVER['unix'];
  $gebruikersnaam = $link->real_escape_string($gebruikersnaam);
  $wachtwoord = $link->real_escape_string($wachtwoord);
  $emailadres = $link->real_escape_string($emailadres);

  $searchForUser = $link->query("SELECT * FROM `leden` WHERE `gebruikersnaam`='$gebruikersnaam'");
  if (!$searchForUser)
  {
    $insertWrongLogin = $link->query("INSERT INTO `paneel_foutepogingen` (`ip`, `datum_foutepoging`) VALUES ('$ip', '$datum')");
    if (!$insertWrongLogin)
    {
      echo '0+Probeer het later opnieuw om te registreren';
    }
    else
    {
      echo '0+Probeer het later opnieuw om te registreren';
    }
  }
  else
  {
    $userDetails = $searchForUser->fetch_assoc();

    if (strlen($gebruikersnaam) >= 2 && strlen($gebruikersnaam) <= 15)
    {
      if ($searchForUser->num_rows === 0)
      {
        if ($wachtwoord === $wachtwoordher)
        {
          if (preg_match('/\A(?=[\x20-\x7E]*?[A-Z])(?=[\x20-\x7E]*?[a-z])(?=[\x20-\x7E]*?[0-9])[\x20-\x7E]{6,}\z/', $wachtwoord) && strlen($wachtwoord) > 8)
          {
            if (filter_var($emailadres, FILTER_VALIDATE_EMAIL))
            {
              $checkPostedEmail = $link->query("SELECT * FROM `leden` WHERE `emailadres`='$emailadres'");
              if (!$checkPostedEmail)
              {
                echo '0+Probeer het later opnieuw om te registreren';
              }
              else
              {
                $wachtwoord = password_hash($wachtwoord, PASSWORD_DEFAULT);

                $createUserAccount = $link->query("INSERT INTO `leden` (`gebruikersnaam`, `wachtwoord`, `emailadres`, `ip`, `registratie_datum`) VALUES ('$gebruikersnaam', '$wachtwoord', '$emailadres', '$ip', '$datum')");
                if (!$createUserAccount)
                {
                  echo '0+Probeer het later opnieuw om te registreren';
                }
                else
                {
                  echo '1+Je account is aangemaakt, je kan nu inloggen';
                }
              }
            }
            else
            {
              $insertWrongLogin = $link->query("INSERT INTO `paneel_foutepogingen` (`ip`, `datum_foutepoging`) VALUES ('$ip', '$datum')");
              if (!$insertWrongLogin)
              {
                echo '0+Probeer het later om te registreren';
              }
              else
              {
                echo '0+Dit emailadres is niet geldig';
              }
            }
          }
          else
          {
            $insertWrongLogin = $link->query("INSERT INTO `paneel_foutepogingen` (`ip`, `datum_foutepoging`) VALUES ('$ip', '$datum')");
            if (!$insertWrongLogin)
            {
              echo '0+Probeer het later opnieuw om te registreren';
            }
            else
            {
              echo '0+Je wachtwoord moet bestaan uit kleine en grote letters, nummers, symbolen en grote zijn dan 8 tekens';
            }
          }
        }
        else
        {
          $insertWrongLogin = $link->query("INSERT INTO `paneel_foutepogingen` (`ip`, `datum_foutepoging`) VALUES ('$ip', '$datum')");
          if (!$insertWrongLogin)
          {
            echo '0+Probeer het later opnieuw om te registreren';
          }
          else
          {
            echo '0+De wachtwoorden komen niet overeen';
          }
        }
      }
      else
      {
        $insertWrongLogin = $link->query("INSERT INTO `paneel_foutepogingen` (`ip`, `datum_foutepoging`) VALUES ('$ip', '$datum')");
        if (!$insertWrongLogin)
        {
          echo '0+Probeer het later opnieuw om te registreren';
        }
        else
        {
          echo '0+Deze gebruiker helaas bestaat al';
        }
      }
    }
    else
    {
      $insertWrongLogin = $link->query("INSERT INTO `paneel_foutepogingen` (`ip`, `datum_foutepoging`) VALUES ('$ip', '$datum')");
      if (!$insertWrongLogin)
      {
        echo '0+Probeer het later opnieuw om te registreren';
      }
      else
      {
        echo '0+De gebruikersnaam moet tussen de 2 en 15 tekens bestaan';
      }
    }
  }
}
?>

Ik hoor graag verbeter punten! :D

[size=xsmall]Toevoeging op 12/03/2017 18:41:16:[/size]

TOEVOEGING:
IP adres wordt gehasht met SHA1 om de volgende reden: Voor het spel waar ik dit voor maak, controleren ze op of ik ips, keyloggers etc. achterhaal. Dus van hun moest ik IP doen met SHA1 of een andere hash.




Kan je een duidelijke topictitel meegeven die je probleemstelling / vraag vermeldt?

[size=xsmall]Toevoeging op 12/03/2017 23:15:06:[/size]

Ik heb het even doorgebladerd.....

Wie bepaalt dat de zomertijd altijd op 26 maart ingaat? Verder zou elke server automatisch gelijk moeten lopen, dus ik snap de controle niet waarbij je op UTC controleert. Waarom niet gewoon op de huidige tijdzone?

- Foutmeldingen beëindigen met een exit() is niet netjes. Waarom zou je jouw script willen afsluiten? Lekker netjes afmaken, zou ik zeggen.

- Je controleert op foute pogingen, en dan laat je een melding zien dat het e-mailadres niet geldig is. Die logisca ontgaat me. filter_var() is de enige beste functie die controleert of een mailadres goed gevalideerd is qua opbouw.

"Wie bepaalt dat de zomertijd altijd op 26 maart ingaat? Verder zou elke server automatisch gelijk moeten lopen, dus ik snap de controle niet waarbij je op UTC controleert. Waarom niet gewoon op de huidige tijdzone?"
Zomertijd heb ik opgezocht (wel elk jaar weer aanpassen), en als ik UTC gewoon pak, of mijn huidige tijdzone, heeft die steeds 1 uur te weinig...

" Foutmeldingen beëindigen met een exit() is niet netjes. Waarom zou je jouw script willen afsluiten? Lekker netjes afmaken, zou ik zeggen."
Dan laat hij een dubbele error zien want dan voert hij de rest van het script uit, dus krijg je 2 errors..

"Je controleert op foute pogingen, en dan laat je een melding zien dat het e-mailadres niet geldig is. Die logisca ontgaat me. filter_var() is de enige beste functie die controleert of een mailadres goed gevalideerd is qua opbouw."
Waar ziet u dit staan? Dan kan ik het even aanpassen

Maar voor de rest is het wel groten deels goed gemaakt toch?
>> Zomertijd heb ik opgezocht (wel elk jaar weer aanpassen), en als ik UTC gewoon pak, of mijn huidige tijdzone, heeft die steeds 1 uur te weinig...
[php]date_default_timezone_set[/php] of een [php]ini_set[/php] op date.timezone.

>> Dan laat hij een dubbele error zien want dan voert hij de rest van het script uit, dus krijg je 2 errors..
Dan is de rest van het script niet goed opgebouwd.

Verder: je vervuilt je SERVER variabele, wat niet handig is. Je hebt een vage unix variabele die in principe niet meer is dan het resultaat van de [php]time[/php] functie. Je bepaling van het IP is op zijn minst gezegd vreemd en strict genomen zelfs fout. Je bent geinteresseerd in het IP, niet in andermans representatie daarvan. REMOTE_ADDR en alleen REMOTE_ADDR doet wat jij wilt. Behalve als je er een specifieke reden voor hebt, zoals een reverse proxy die je voor je webserver geplaatst hebt.

Je doet includes binnen functies waardoor je dus de potentie hebt om meerdere keren hetzelfde te includen. Of dat erg is hangt af van de bestanden die je includet. Netjes is het in ieder geval niet.

Je hebt ook draken van if constructies. Zodra je meer dan 2 ifs in elkaar hebt moet je je al gaan afvragen of een andere methode niet beter is, zoals een early return strategie. In de register functie bijvoorbeeld zou het een stuk leesbaarder worden als je gewoon op de negatieven controleert en gewoon zegt nee sorry dit is niet goed ipv op het eerste oog 5 controles in elkaar te nesten.
>> Zomertijd heb ik opgezocht (wel elk jaar weer aanpassen), en als ik UTC gewoon pak, of mijn huidige tijdzone, heeft die steeds 1 uur te weinig...

Denk je echt dat makers van websites dat ieder jaar gaan opzoeken en aanpassen? Natuurlijk niet. De juiste timezone instellen, en gebruikmaken van functies die daar rekening mee houden (hint, date() doet dat niet en daarom gaat het bij jou mis).

>> Maar voor de rest is het wel groten deels goed gemaakt toch?

Je bent nog maar pas bezig met programmeren, en dat is ook te merken. Zoals hier boven al is gezegd ... al die if's en else's achter elkaar (geneste constructies) is eerlijk gezegd nogal een puinhoop. Totaal onoverzichtelijk en totaal niet beheersbaar als je iets moet wijzigen of aanvullen.

Eerlijk gezegd snap ik niet waarom je alles zo snel wil doen, zonder dat je de basis onder de knie hebt. Als iemand mij zulke code zou aanleveren zou ik echt niet blij zijn.
je realiseert je dat

if (date("d-m-Y") <= "26-03-".date("Y"))

betekent dat het op 01-04-2017 weer kleiner dan is.
en dat op 26-04-2017 deze string (string en niet datum) weer groter is....

ALS je dat als zo wilt oplossen, doe het dan met 2017-03-26 als volgorde
"date_default_timezone_set of een ini_set op date.timezone."
Hiermee werkt de unix time nog steeds niet naar behoren? Hij blijft een uur achter lopen...

[size=xsmall]Toevoeging op 13/03/2017 19:04:53:[/size]

Kan iemand misschien een goed werkend voorbeeld geven hoe ik een goede UNIX TIME krijg? Alvast bedankt :D
Dan stel je een andere timezone in. De enige reden dat hij achter zou lopen is als de tijd sowieso al verkeerd staat. Als je kunstgrepen moet uithalen om op de juiste tijd uit te komen is er iets mis met de configuratie. Dat los je niet op door je script aan te passen maar door de configuratie te corrigeren.

Verder was dit uiteraard niet het ergste, je hebt een mooie waslijst om door te werken. Het advies zou zijn om gewoon opnieuw te beginnen en niet van alles bij elkaar te copy pasten zonder begrip van wat het doet en waarom het doet wat het doet. Functies hebben return values. Gebruik deze en vervuil scopes die je niet hoort te vervuilen niet is een belangrijke.
Ik heb niet gecopyd pasted, alles zelf getypt, niet opgzocht.
Probeer eerst eens een opzet te maken met het basaalste. Formulier, controle op het versturen ervan, en bouw daarop opnieuw verder.
Maar misschien ben ik nu een beetje dom, wat is er nu dan mis met mijn script?

[size=xsmall]Toevoeging op 13/03/2017 19:28:17:[/size]

Tijden werken btw al

Reageren