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.




Volgensmij snap ik het,


function loggedIn()
{
  if (isset($_SESSION['id']))
  {
    return true;
  }
  else
  {
    return false;
  }
}

naar dit:


function loggedIn()
{
  if (!isset($_SESSION['id']))
  {
    return false;
  }
}

en dan dit toepassen:


if (loggedIn() != false)
{
  header('Location: '.$settings['path'].'paneel/');
  exit();
}


[size=xsmall]Toevoeging op 16/03/2017 17:18:01:[/size]

En dan nog 1 laatste vraag, als ik password_hash() gebruik, is het dan nog nodig om deze te escapen met real_escape_string?
Je snapt blijkbaar dus niet wat er gezegd wordt. Dat, of je wil het niet snappen. Je past het voorbeeld op compleet andere code toe. Dan heeft verdere uitleg ook geen zin.

>> En dan nog 1 laatste vraag, als ik password_hash() gebruik, is het dan nog nodig om deze te escapen met real_escape_string?

Voor de consistentie: ja zeker.
>> En dan nog 1 laatste vraag, als ik password_hash() gebruik, is het dan nog nodig om deze te escapen met real_escape_string?

Voor de consistentie: ja
Voor de beveiliging: nee
<?php
function loggedIn()
{
if (isset($_SESSION['id']))
{
return true;
}
else
{
return false;
}
}
?>
Kan gewoon zo:
<?php
function loggedIn()
{
return isset($_SESSION['id']);
}
?>

Reageren