script werkt niet voor bruteforce

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Pagina: « vorige 1 2 3 volgende »

Bart V B

Bart V B

18/03/2017 07:19:03
Quote Anchor link
Wat bedoel je met een andere class gebruiken?
Ik snap niet wat je bedoeld.
Wat mijn en Ben zijn voorbeeld doet, is een connectie maken met de database.
Daarin kan je van alles doen:

Je maakt een connectie met new database in de variabele $db.
Met die $db ga je verder met wat je wenst te doen.
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
<?php
// init je database classs
$db = new database('localhost', 'my_user', 'my_password', 'my_db');
// voer iets uit
$result = $db->query("SELECT * FROM users");
// sluit de database
$db->close();
?>
Gewijzigd op 18/03/2017 07:40:00 door Bart V B
 
PHP hulp

PHP hulp

18/12/2024 03:04:27
 
- Rob -

- Rob -

18/03/2017 07:58:08
Quote Anchor link
Met een andere class bedoel ik bv. dit:

class Bans extends Database
{
// hoe kan ik hier dan bv. een query uitvoeren
}
 
Bart V B

Bart V B

18/03/2017 08:14:41
Quote Anchor link
nee, zo werkt het niet.
De Database is geen onderdeel van Bans.
Als je in classes schrijft moet je natuurlijk wel het logisch aanpakken.
De database GEBRUIK je in je Bans class. Dat is een heel andere denkwijze.

Dus Zou je zoiets kunnen doen:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?php

class Bans {

    private $_db;

    public function __construct() {

        $this->_db = new Database('localhost', 'username', 'password', 'database');
    }


    public function Getbans()
    {

        $this->_db->query("SELECT * FROM bans");
    }
}

?>

Het is maar even een ranzig voorbeeld, maar zoals je ziet, de opties die je in je Database extends mysqli doet worden beschikbaar VANUIT de mysqli class. Maar de Database class weet op zijn beurt niet wat hij met de bans moet doen. En dat is goed. Immers die zelfde Database class kan ook opgezet worden in bijvoorbeeld een Register class o.i.d. Dus je moet wel goed nadenken hoe je je classes wil indelen.
 
- Rob -

- Rob -

18/03/2017 08:30:59
Quote Anchor link
Ik heb de database wel veranderd naar het volgende, zodat ik ik gewoon de query functie etc. kan aanroepen:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
<?php
class Database
{
    private $_port = '3306';
    private $_hostname = 'localhost';
    private $_username = 'novaraba';
    private $_password = '2QOOpcxTeZvL';
    private $_database = 'novaraba_website';

      protected $connection;

      public function __construct()
      {

            $this->connection = mysqli_connect(
              $this->_hostname,
              $this->_username,
              $this->_password,
              $this->_database,
              $this->_port
        );

          if (mysqli_connect_errno($this->connection))
          {

          ?>

          <!DOCTYPE html>
          <html lang="nl">
            <head>
              <meta charset="utf-8">
              <meta name="robots"       content="index, follow, all">
              <meta name="googlebot"    content="noodp">
              <title>Novara Bank - Onderhoud</title>
              <link rel="shortcut icon" type="image/png" href="https://static.afbeeldinguploaden.nl/1703/236459/ujg281Ct.png" />
              <link rel="stylesheet"    type="text/css"  href="/paneel/assets/css/index.css" />
              <link rel="stylesheet"    type="text/css"  href="/paneel/assets/css/overwrite.css" />
            </head>
            <body class="hold-transition login-page">
              <div class="login-box">
                <div class="login-logo">
                  <h3><a><b>Onderhoud</b></a></h3>
                </div>
                <div class="login-box-body">
                  We voeren een korte onderhoud uit.<br>
                  Kom later op de dag terug.
                </div>
              </div>
            </body>
          </html>
          <?php
          exit();
          }
      }


      public function __destruct()
      {

            return mysqli_close($this->connection);
      }


      public function query($query)
      {

            return $this->connection->query($query);
      }


      public function num_rows($result)
      {

            return mysqli_num_rows($result);
      }


      public function fetch_row($result)
      {

          return mysqli_fetch_row($result);
      }


      public function fetch_array($result)
      {

            return mysqli_fetch_array($result);
      }


      public function fetch_assoc($result)
      {

            return mysqli_fetch_assoc($result);
      }


      public function fetch_object($result)
      {

            return mysqli_fetch_object($result);
      }


      public function last_id()
      {

            return mysqli_insert_id($this->connection);
      }


      public function escape($data)
      {

            return mysqli_real_escape_string($this->connection,$data);
      }
}

?>

Maar bedankt voor de tip!

Bij de bans class ben ik eerst maar begonnen om te kijken of je hostnaam wel toegestaan is met de volgende code:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
<?php
class Bans
{
    public function canAccess($ip)
    {

      $whitelistHostnames = array(
        "ziggo",
        "telenet",
        "kpn",
        "onsbrabantnet",
        "tele2",
        "xs4all",
        "zeelandnet",
        "telfort",
        "planet",
        "caiway",
        "prioritytelecom",
        "upc",
        "chello",
        "belgacom",
        "direct-adsl",
        "online.nl",
        "hetnet.nl",
        "92.110", // IP reeks Ziggo
        "145.133", // IP reeks Ziggo
        "145.100", // IP reeks Ziggo
        "verixi.net",
        "mxposure", // xs4all
        "versatel",
        "introweb.nl",
        "belgacom.be",
        "schedom-europe.net",
        "open.net",
        "glasoperator.nl",
        "62.72.", // IP reeks Vodafone
        "62.140.", // IP reeks Vodafone
        "scarlet.be",
        "145.132.", // IP reeks Telfort (KPN)
        "143.177.", // IP reeks Tele2
        "62.205.", // IP reeks Telenet
        "stipte.nl",
        "proximus.be",
        "egcs.nl",
        "81.4.104.129", // RA4WVPN Alblasserdam IP
        "de-falkenstein.ra4wvpn.com",
        "62.235.", // IP reeks Scarlet (BE)
        "onenet.cw", // Curacao
        "netvisit.nl",
        "hotelschoolhasselt.be",
        "143.176.232", // Tele2
        "143.176.214", // Tele2
        "143.176.233", // Tele2
        "ddfr.nl",
        "dsl.cambrium.nl",
        "lombox",
        "solcon.nl",
      );


      $accessAllowed = false;

      foreach ($whitelistHostnames as $key => $value)
      {

          if (strpos(gethostbyaddr($ip), $value) !== false)
          {

              $accessAllowed = true;
              break;
          }
      }


      if ($accessAllowed === false)
      {

          die("Je hostnaam is niet toegestaan voor toegang tot het paneel. Indien je denkt dat dit een fout is, geef onderstaande door aan het de I.C.T.:<br />" . gethostbyaddr($ip));
      }
    }
}

?>


Heb ik dit dan wel goed opgebouwd?
 
Bart V B

Bart V B

18/03/2017 08:51:39
Quote Anchor link
Poeh...
Uhm, hoe ga ik dit in een positieve brengen.
Een woord: Spaghetti. :)
Leuk om te zien dat je zo enthousiast bezig bent, maar je moet denk ik even een stapje of 6 terug doen op de tekentafel.
Nogmaals ik bedoel dit om je te helpen en niet om je hele werk af te kraken he. Want dat is oprecht niet de bedoeling.

Laat ik beginnen met die database class:
Je mikt nu een berg html code in de class zelf.
Dat is heeel fout. De class zelf moet alleen php bevatten.
Dus die html moet daar uit, en zoals met de database moet je ergens een optie maken waarin je die html code gaat gebruiken. ik noem maar even wat:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
<?php

$db
= new database();
if( $db->mysqli_connect_errno() ) :
?>

<!DOCTYPE html>
          <html lang="nl">
            <head>
              <meta charset="utf-8">
              <meta name="robots"       content="index, follow, all">
              <meta name="googlebot"    content="noodp">
              <title>Novara Bank - Onderhoud</title>
              <link rel="shortcut icon" type="image/png" href="https://static.afbeeldinguploaden.nl/1703/236459/ujg281Ct.png" />
              <link rel="stylesheet"    type="text/css"  href="/paneel/assets/css/index.css" />
              <link rel="stylesheet"    type="text/css"  href="/paneel/assets/css/overwrite.css" />
            </head>
            <body class="hold-transition login-page">
              <div class="login-box">
                <div class="login-logo">
                  <h3><a><b>Onderhoud</b></a></h3>
                </div>
                <div class="login-box-body">
                  We voeren een korte onderhoud uit.<br>
                  Kom later op de dag terug.
                </div>
              </div>
            </body>
          </html>
<?php endif; ?>

De bans, dat is geen class, maar een ingepakte function met een array er in wat iets moet checken.
Daar kan je zoveel meer mee doen.
Dus denk eens even verder na of je die in zo'n zelfde opzet kunt maken zoals ik net in mijn voorbeeld aangeef. Overigens, is pseudo code, dus heb niet gekeken of de werking meteen goed is he.
Eigenlijk simpeler gezegd: je classes doen de dingen, en de html (VIEW) poept de dingen op het scherm.
Daar mag je wel wat code inzetten, maar nooit de hele functionaliteit van wat de classes kunnen doen.
Gewijzigd op 18/03/2017 08:53:10 door Bart V B
 
- Rob -

- Rob -

18/03/2017 09:06:40
Quote Anchor link
En als ik een apart html bestand aanmaak, met daarin de HTML code. En vervolgens die include, zou dit dan beter zijn?

Toevoeging op 18/03/2017 09:07:50:

En bij bans moet ik nog checkBanned() maken, daar ben ik atm. mee bezig.
 
Ward van der Put
Moderator

Ward van der Put

18/03/2017 10:05:19
Quote Anchor link
Wáárom doe je dit?
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
<?php
      public function fetch_assoc($result)
      {

            return mysqli_fetch_assoc($result);
      }

?>

Als je in een child class de gelijknamige methode gewoon weglaat, wordt automatisch de methode gebruikt van de parent die je extendt. Gewoon weglaten dus als je de oorspronkelijke methode niet wilt overschrijven.

Bovendien gebruik je nog steeds de procedurele vorm van MySQLi, niet de objectgeoriënteerde.

- Rob - op 18/03/2017 09:06:40:
En als ik een apart html bestand aanmaak, met daarin de HTML code. En vervolgens die include, zou dit dan beter zijn?

Nee, het beste is een exception gooien, zodat het script dat de databaseverbinding gebruikt kan bepalen hoe er op een fout moet worden gereageerd.

Het één na beste is een HTTP-serverfout genereren, bijvoorbeeld 503 Service Unavailable, zodat de client kan bepalen hoe er op de serverfout wordt gereageerd. Dat is bijvoorbeeld handig voor web apps, Ajax en API's voor web services.
 
- Rob -

- Rob -

18/03/2017 10:28:54
Quote Anchor link
Ik zal het aanpassen ;-)
 
- Ariën  -
Beheerder

- Ariën -

18/03/2017 11:19:01
Quote Anchor link
Het lijkt mij zinvoller om die whitelist in de database te plaatsen.
Dan kan je het makkelijk bijwerken. Ook die() moet je echt voorkomen in je scripts, en output hoort zeker niet in classes te worden gemaakt. Ikzelf zou daar een exception voor maken.
Gewijzigd op 18/03/2017 11:19:54 door - Ariën -
 
- Rob -

- Rob -

18/03/2017 14:49:16
Quote Anchor link
Ik heb het nu deels al veranderd, voor het inloggen heb ik nu de volgende code:

login.php
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<?php
session_start();
date_default_timezone_set('Europe/Amsterdam');
error_reporting(E_ALL);
ob_start();

include($_SERVER['DOCUMENT_ROOT'].'/paneel/includes/classes/database.class.php');
include($_SERVER['DOCUMENT_ROOT'].'/paneel/includes/classes/user.class.php');

if (isset($_POST['gebruikersnaam'], $_POST['wachtwoord']))
{

    $user = new User();

    if ($user->loggedIn() === false)
    {

        $user->login($_POST['gebruikersnaam'], $_POST['wachtwoord']);
    }

    else
    {
        echo '0+Je bent al ingelogd, laad de pagina opnieuw.';
    }
}

else
{
    header('Location: /');
}

?>


user class

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
<?php
class User
{
    protected $_mysqli;

    public function __construct()
    {

      $this->_mysqli = new Database();
    }


    public function loggedIn()
    {

        if (empty($_SESSION['id']))
        {

            return false;
        }

        else
        {
            return true;
        }
    }


    public function login($username, $password)
    {

        $mysqli = $this->_mysqli;
        $searchUserSql = $mysqli->query("SELECT `id`, `wachtwoord` FROM `leden` WHERE `gebruikersnaam`='".$mysqli->real_escape_string($username)."'");

        if ($searchUserSql && isset($searchUserSql->num_rows))
        {

            $userDetails = $searchUserSql->fetch_assoc();

            if (password_verify($password, $userDetails['wachtwoord']))
            {

                $updateUserAccount = $mysqli->query("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.';
        }
    }
}

?>


database class
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
<?php
class Database extends mysqli {
    public function __construct() {
        parent::__construct('localhost', 'root', '', 'oop');

        if (mysqli_connect_error()) {
            die('Fout met de verbinding');
        }
    }
}

?>


Ben ik zo al beter opweg?

Toevoeging op 18/03/2017 14:56:09:

empty is veranderd naar isset bij loggedIn() functie
Gewijzigd op 18/03/2017 14:52:25 door - Rob -
 
- Ariën  -
Beheerder

- Ariën -

18/03/2017 15:42:42
Quote Anchor link
- Waarom gebruik je nog steeds de procedurele functies van mysqli?
- En die() is niet netjes.
 
- Rob -

- Rob -

18/03/2017 15:47:26
Quote Anchor link
"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
 
Dennis WhoCares

Dennis WhoCares

18/03/2017 15:48:36
Quote Anchor link
Wellicht als je interesse heb om landen toe te staan:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
$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 ;-)
 
- Rob -

- Rob -

18/03/2017 15:49:27
Quote Anchor link
Dennis, bedankt! Dit had ik eerder ook, maar ben het helemaal vergeten! Even aanpassen
 
- Ariën  -
Beheerder

- Ariën -

18/03/2017 15:56:35
Quote Anchor link
- 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.

Toevoeging op 18/03/2017 15:59:24:

Dennis WhoCares op 18/03/2017 15:48:36:
Wellicht als je interesse heb om landen toe te staan:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
$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?
 
- Rob -

- Rob -

18/03/2017 16:14:43
Quote Anchor link
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
<?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?
 
- Ariën  -
Beheerder

- Ariën -

18/03/2017 16:18:37
Quote Anchor link
Iets met procedureel v.s. object-georiënteerd. Zie mijn vorige post.
Je weet het verschil tussen beiden inmiddels?
Gewijzigd op 18/03/2017 16:22:49 door - Ariën -
 
Dennis WhoCares

Dennis WhoCares

18/03/2017 16:21:16
Quote Anchor link
oops sorry iets teveel weg gelaten :)
http://ipinfo.io/IPADRESHIER/json
 
- Rob -

- Rob -

18/03/2017 16:23:11
Quote Anchor link
"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?
Gewijzigd op 18/03/2017 16:25:27 door - Rob -
 
- Ariën  -
Beheerder

- Ariën -

18/03/2017 16:25:02
Quote Anchor link
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.

Toevoeging op 18/03/2017 16:25:59:

- 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(.....)
Gewijzigd op 18/03/2017 16:36:15 door - Ariën -
 

Pagina: « vorige 1 2 3 volgende »



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.