Hallo!

Ik wou graag enige bruteforce protection op mijn website maken waarbij als je 3 keer foute login hebt gedaan, je 50 minuten niet kan inloggen etc., en ik had het volgende:


<?php
function checkWrongAttempts($ip, $plaats)
{
  $settings = parse_ini_file($_SERVER['DOCUMENT_ROOT'].'/../datafile.ini');
  include($_SERVER['DOCUMENT_ROOT'].$settings['path'].'paneel/includes/init.php');
  $datum = strtotime('UTC');

  $searchWrongAttemptsSql = $link->query("SELECT * FROM `".$settings['path']."foutepogingen` WHERE `ip`='".sha1($ip)."' AND `plaats`='".$link->real_escape_string($plaats)."' ORDER BY `datum` DESC");

  if ($searchWrongAttemptsSql && $searchWrongAttemptsSql->num_rows >= 3)
  {
    $wrongAttempt = $searchWrongAttemptsSql->fetch_assoc();

    if ($datum <= strtotime('+5 minutes', $wrongAttempt['datum']))
    {
      return false;
    }
  }
}

function insertWrongAttempt($ip, $plaats)
{
  $settings = parse_ini_file($_SERVER['DOCUMENT_ROOT'].'/../datafile.ini');
  include($_SERVER['DOCUMENT_ROOT'].$settings['path'].'paneel/includes/init.php');
  $datum = strtotime('UTC');

  $insertWrongAttempt = $link->query("INSERT INTO `".$settings['prefix']."foutepogingen` (`ip`, `plaats`, `datum`) VALUES ('".sha1($ip)."', '".$link->real_escape_string($plaats)."', '".$link->real_escape_string($datum)."')");

  if ($insertWrongAttempt)
  {
    return true;
  }
}

function login($gebruikersnaam, $wachtwoord)
{
  $settings = parse_ini_file($_SERVER['DOCUMENT_ROOT'].'/../datafile.ini');
  include($_SERVER['DOCUMENT_ROOT'].$settings['path'].'paneel/includes/init.php');
  $datum = strtotime('UTC');

  if (checkWrongAttempts(getIp(), 'index') != true)
  {
    $searchUserSql = $link->query("SELECT `id`, `wachtwoord` FROM `leden` WHERE `gebruikersnaam`='".$link->real_escape_string($gebruikersnaam)."'");

    if ($searchUserSql && $searchUserSql->num_rows === 1)
    {
      $userDetails = $searchUserSql->fetch_assoc();

      if (!password_verify($wachtwoord, $userDetails['wachtwoord']))
      {
        if (insertWrongAttempt(getIp(), 'index') === true)
        {
          return false;
        }
      }
    }
    else
    {
      if (insertWrongAttempt(getIp(), 'index') === true)
      {
        return false;
      }
    }
  }
  else
  {
    return false;
  }
}
?>

Maar hij blijft hierbij het gehele script uitvoeren, terwijl ik al 25 keer foute login heb gedaan.. Zelf denk ik dat het probleem bij het checken ligt, maar ik dit lukt mij niet om te debuggen Alvast bedankt voor de hulp!
- Waarom gebruik je nog steeds de procedurele functies van mysqli?
- En die() is niet netjes.
"Waarom gebruik je nog steeds de procedurele functies van mysqli?"
Moet ik dan mysqli->real_escape_string() etc. gebruiken?

" En die() is niet netjes."
Zal het even aanpassen
Wellicht als je interesse heb om landen toe te staan:


$ip = $_SERVER['REMOTE_ADDR'];
$ipLocation= json_decode(file_get_contents("http://ipinfo.io/{$ip}"));
echo $ipLocation->country;
//Dit geeft landcide terug, o.a. NL BE DE FR enz.


Dit zou je kunnen gebruiken om hele landen te 'whitelisten' of 'blacklisten'
Het is wel heel moeilijk om ALLE ipranges en ISP's te whitelisten, vandaar ;-)
Dennis, bedankt! Dit had ik eerder ook, maar ben het helemaal vergeten! Even aanpassen
- Rob - op 18/03/2017 15:47:26

"Waarom gebruik je nog steeds de procedurele functies van mysqli?"
Moet ik dan mysqli->real_escape_string() etc. gebruiken?

Jep, alles in objecten, als je het netjes wilt doen.

[size=xsmall]Toevoeging op 18/03/2017 15:59:24:[/size]

Dennis WhoCares op 18/03/2017 15:48:36

Wellicht als je interesse heb om landen toe te staan:


$ip = $_SERVER['REMOTE_ADDR'];
$ipLocation= json_decode(file_get_contents("http://ipinfo.io/{$ip}"));
echo $ipLocation->country;
//Dit geeft landcode terug, o.a. NL BE DE FR enz.


Dit zou je kunnen gebruiken om hele landen te 'whitelisten' of 'blacklisten'
Het is wel heel moeilijk om ALLE ipranges en ISP's te whitelisten, vandaar ;-)

http://ipinfo.io/{$ip}
Die URL geeft geen JSON terug?

<?php
class User
{
    protected $_mysqli;

    public function __construct()
    {
      $this->_mysqli = new Database();
    }

    public function login($username, $password)
    {
        $mysqli = $this->_mysqli;
        $ip = $_SERVER['REMOTE_ADDR'];
        $ipInfo = json_decode(file_get_contents("http://ipinfo.io/$ip"));
        $country = $ipInfo->country;

        if ($country === "NL" || $country === "BE")
        {
            $searchUserSql = mysqli_query($mysqli, "SELECT `id`, `wachtwoord` FROM `leden` WHERE `gebruikersnaam`='".mysqli_real_escape_string($username)."'");

            if ($searchUserSql && isset(mysqli_num_rows($searchUserSql))) // Hier komt dus een error
            {
                $userDetails = mysqli_fetch_assoc($searchUserSql);

                if (password_verify($password, $userDetails['wachtwoord']))
                {
                    $updateUserAccount = mysqli_query($mysqli, "UPDATE `leden` SET `laatst_online`='".time()."' WHERE `gebruikersnaam`='".mysqli_real_escape_string($username)."'");
                    $_SESSION['id'] = $userDetails['id'];
                    echo '1+De ingevulde gegevens zijn goed.';
                }
                else
                {
                    echo '0+De ingevulde gegevens zijn niet goed.';
                }
            }
            else
            {
                echo '0+De ingevulde gegevens zijn niet goed.';
            }
        }
        else
        {
            echo '0+Alleen de landen Nederland en Belgie zijn toegestaan tot het paneel.';
        }
    }
}
?>


Ik heb alles even aangepast, maar bij mysqli_num_rows($searchForUser); krijg ik een error. Deze error kan ik helaas niet zien, er komt alleen 500 Internal Server Error te staan. Wat is het probleem?
Iets met procedureel v.s. object-georiënteerd. Zie mijn vorige post.
Je weet het verschil tussen beiden inmiddels?
"Iets met procedureel v.s. object-georiënteerd. Zie mijn vorige post.
Je weet het verschil tussen beiden inmiddels?"

O oops heb 't door elkaar gehaald ;S
Maar dan wat ik had, was al goed toch?
Dennis WhoCares op 18/03/2017 16:21:16

oops sorry iets teveel weg gelaten :)
http://ipinfo.io/IPADRESHIER/json

Much better!
Houdt wel rekening dat dit geen garantie geeft voor de juiste locaties.

[size=xsmall]Toevoeging op 18/03/2017 16:25:59:[/size]

- Rob - op 18/03/2017 16:23:11

O oops heb 't door elkaar gehaald ;S
Maar dan wat ik had, was al goed toch?

Waarom gebruik je niet de OO-variant?
$db->query(.....)

Reageren