Ben ik beschermd tegen SQL injection?

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Ventilatiesysteem Productontwikkelaar HBO WO Verwa

Samengevat: Zij bieden flexibele ventilatiematerialen, geluidsdempers, rookgasafvoer producten en industrieslangen. Ben jij een technisch productontwikkelaar? Heb jij ervaring met het ontwikkelen van nieuwe producten? Vaste baan: Technisch Productontwikkelaar HBO WO €3.000 - €4.000 Zij bieden een variëteit aan flexibele ventilatiematerialen, geluiddempers, rookgasafvoer producten, industrieslangen en ventilatieslangen voor de scheepsbouw. Met slimme en innovatieve materialen zorgen wij voor een gezonde en frisse leefomgeving. Deze werkgever is een organisatie die volop in ontwikkeling is met hardwerkende collega's. Dit geeft goede ontwikkelingsmogelijkheden. De branche van dit bedrijf is Techniek en Engineering. Functie: Voor de vacature als Technisch Productontwikkelaar Ede Gld HBO WO ga

Bekijk vacature »

Pagina: « vorige 1 2 3 volgende »

Ronald brt

Ronald brt

16/12/2014 15:24:33
Quote Anchor link
De ID van het record die je wil verwijderen.

Voorbeeld,

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
//Hier wel de record gegevens uit je database halen..

foreach ($record as $record){
$record_name = $record['name']; // de namen van gezochte personen
$record_id = $record['id']; // ID die bij de gezochte naam hoort

echo "Namen: $record_name <br>
      <input type=submit name=delete value=delete record />
      //EN DAN EVENTUEEL ID MET HIDDEN MEESTUREN ZODAT JE OP ID RECORD VERWIJDERD
      <input type=hidden name=id value=$record_id />
";
}

En vervolgens de rest met een if statement de gewenste ID te verwijderen.

Ik neem aan dat dit ermee wordt bedoeld.
Gewijzigd op 16/12/2014 15:26:52 door Ronald brt
 
PHP hulp

PHP hulp

18/04/2024 21:40:55
 
Michael Desmadril

Michael Desmadril

16/12/2014 15:56:30
Quote Anchor link
Perfect..., thx Ronald.

Eerste proef is compleet, veilig en werkt...

Het tweede -> met een zoekveld mijn items gaan ophalen ->

Ik zit wat vast vrees ik:

Dit heb ik:

De dbconnectie maak ik langsboven op mijn pagina
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
if(isset($_POST['updb'])){

        $stmtup = $db_con->prepare("SELECT * FROM customers WHERE Voornaam = ?");

        $stmtup->bind_param("s",$zoekterm);

        $zoekterm = $_POST['search'];
        $stmtup->execute();

    
        $rows = $zoekterm->num_rows;

        for($i=0; $i < $rows; $i++){
            $row = mysqli_fetch_array($zoekterm,MYSQLI_ASSOC);
            $voornaam = $row['Voornaam'];
            $achternaam = $row['Achternaam'];
        }



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
<table class="table_form">
      <form method="POST" action="homes.php">
        <tr>
            <td>Zoekterm:</td><td><input type="text" name="search" value="Search" /></td>
            <td><input type="submit" name="updb" value="Bevestigen" /></td>
        </tr>
        <tr>
            <td>Voornaam:</td><td><?php echo $voornaam ?></td>
        </tr>
        <tr>
            <td>Achernaam:</td><td><?php echo $achternaam ?></td>
        </tr>
      </form>
    </table>


Ik wil gewoon mijn search veld ook beschermen tegen sql injection...ik zoek wss gewoon iets fout?
Gewijzigd op 16/12/2014 15:57:36 door Michael Desmadril
 
- SanThe -

- SanThe -

16/12/2014 17:05:27
Quote Anchor link
Hier bestaat $zoekterm nog niet:
$stmtup->bind_param("s",$zoekterm);

Hier dus wel:
$zoekterm = $_POST['search'];

En waarom zou $zoekterm hier opeens een object zijn?
$rows = $zoekterm->num_rows;
Gewijzigd op 16/12/2014 17:05:59 door - SanThe -
 
Michael Desmadril

Michael Desmadril

17/12/2014 13:41:20
Quote Anchor link
Kzit helaas vast, Ik heb er nochtans goed zitten op zoeken.

Ik heb een zoekveld <input type ="text" value ="zoeken" name="zoek" />

Daaronder heb ik in mijn form nog 3 tekstvelden, maar laat ons nu 1 als voorbeeld gebruiken. Namelijk, Voornaam: <input type="text" name="voornaam" />
<input type="submit" name="Zoeken" />
Ik wil dat wanneer ik bijvoorbeeld "Alain" invul bij zoek er bij het veld "Voornaam" Alain komt. Kortom, opvragen van klanten.

Zoals hierboven reeds mijn vraag was, wil ik dit uiteraard leren veilig doen....dus met prepared statements.

Bij mijn voorbereiding ga ik als volgt te werk:

$stmtup = $db_con->prepare("SELECT * FROM customers WHERE Voornaam = ?");

dus ik ga niet klakkeloos mijn zoekveld onbeveiligd laten...

Vanaf daar zit ik wat vast, ik weet hoe ik alles moet ophalen etc.... maar om mijn resultaten in het juiste veld te krijgen op mijn html, daar zit ik wat vast!


Schiet me niet neer als ik een dwaze vraag stel :)
 
Ward van der Put
Moderator

Ward van der Put

17/12/2014 13:53:45
Quote Anchor link
>> Ik wil dat wanneer ik bijvoorbeeld "Alain" invul bij zoek er bij het veld "Voornaam" Alain komt. Kortom, opvragen van klanten.

Naast SQL-injectie heb je dan nog een beveiligingsprobleem van een geheel andere orde: iemand kan zo achterhalen welke klanten er allemaal in de database zitten.

Zou je hiermee bijvoorbeeld een autocomplete maken die na twee letters suggesties toont, dan heb je maar 26 = 26 = 676 pogingen nodig om alle voornamen uit de database te hengelen.

Bezint eer ge begint...
 
Michael Desmadril

Michael Desmadril

17/12/2014 13:55:15
Quote Anchor link
....wat stel je dan voor?

Toevoeging op 17/12/2014 13:56:50:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
if(isset($_POST['zoeken'])){

        $stmt = $db_con->prepare="SELECT * FROM customers WHERE Voornaam = ?";
        $stmt->bind_param("s", $zoeknaam);
            $zoeknaam = $_POST['Voornaam'];

        $stmt->execute();

        echo $zoeknaam;



    }



Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
<table class="table_form">
              <form method="POST" action="test.php">
                  <tr>
                      <td>Zoeken</td><td><input type="text" name="Voornaam" /></td>
                  </tr>
                  <tr>
                      <td>Bevestigen</td><td><input type="submit" name="zoeken" /></td>
                  </tr>

              </form>
      </table>


Om toch iets te tonen...
 
Ward van der Put
Moderator

Ward van der Put

17/12/2014 14:01:58
Quote Anchor link
Nou, in elk geval niet ingevoerde namen automatisch corrigeren op basis van de namen die al in de database voorkomen. Is ook nergens voor nodig: dankzij de autocomplete van browsers worden eerder ingevulde gegevens toch al aangedragen.

Als er echt een controle nodig is, zou ik dat inbouwen in de admin. Laat de webmaster eventueel de namen van nieuwe inschrijvingen controleren en corrigeren.

Verder kun je, als gebruikers toch al een account hebben, hen ook de mogelijkheid bieden om hun gebruikersgegevens te corrigeren. Log daarbij dan de wijzigingen, zodat iemand bijvoorbeeld niet als Jan Jansen bestelt en vervolgens zijn naam wijzigt in Piet Pietersen zonder dat je dat in de gaten hebt.

Ik ken, o horror, één openbare medische website waarin je kunt inloggen met geboortedatum plus postcode. Lekker slim: als je wat personalia van iemand weet, kun je in de database kijken. Daar heeft ook iemand dus het woord "handig" in gedachten gehad maar niet doorgedacht.
 
Michael Desmadril

Michael Desmadril

17/12/2014 14:05:37
Quote Anchor link
Ik denk dat we elkaar wat foutief begrepen hebben...

Neem nu een winkel, die heeft 30 klanten, die 30 klanten staan allemaal in de databank.

Een klant komt langs en zegt, ik wil het op mijn account zetten maar weet mijn id nummer niet meer. Ik wil dus zijn gegevens gaan opvragen.

Ik ga naar mijn zoekveld en vul daar in: "Alain".

Het volgende dat ik wil zien zijn de resultaten met alle "Alain's" in mijn databank, mooi gesorteerd in een veld met daar zijn adres, id, telefoon,etc...

Ik wil dus gewoon SQL injectie voorkomen via mijn zoekveld.

Daar komt het op neer :)
 
Ward van der Put
Moderator

Ward van der Put

17/12/2014 14:17:27
Quote Anchor link
Is dat zoekveld openbaar toegankelijk? Of alleen voor de admin?
Dat is nogal een verschil.

Met SQL-injectie heeft deze beveiligingsissue niets te maken. Ga er vooral niet van uit dat SQL-injectie je enige beveiligingsprobleem is: als je alleen de SQL-injectie dichttimmert, liggen nog steeds de klantgegevens op straat.

Je kunt zoeken met de algoritme van Levenshtein:

http://php.net/levenshtein

Of direct in MySQL:

http://stackoverflow.com/questions/13909885/how-to-add-levenshtein-function-in-mysql

Hiermee tel je het aantal mutaties dat nodig is om een string te veranderen in een andere string. Met andere woorden: je kunt hiermee een gesorteerde lijst maken van namen die veel t/m weinig op de input "Alain" lijken.
 
Michael Desmadril

Michael Desmadril

17/12/2014 14:41:47
Quote Anchor link
...ik ga daar niet van uit...ik wou gewoon weten wat er mis is in mijn code.

Demotiveert wel een stuk trouwens als je begint met SQL en PHP en je het ene na het andere moet afsluiten om dan achterna nogmaals te horen dat je het toch nog net niet helemaal hebt afgesloten tegen hackers.

Wanneer is genoeg genoeg....nooit zal wel het antwoord zijn denk ik...
 
Ward van der Put
Moderator

Ward van der Put

17/12/2014 14:44:57
Quote Anchor link
Eerder omgekeerd: je moet niet allerlei blingbling toevoegen die leuk lijkt maar waarvan je de werking nog niet helemaal begrijpt.

Begin bij de basis: PHP-input opschonen plus valideren en SQL-injectie uitsluiten. Ga daarna verder.
 
Michael Desmadril

Michael Desmadril

17/12/2014 15:31:38
Quote Anchor link
Ik dacht dat mijn PHP-input redelijk proper was en ik reeds SQL-injectie had uitgesloten?...validatie heb ik inderdaad nog niet gedaan. Ik wil nu eerst gewoon mijn data uitlezen via een zoekveld EN daarbij sql-injectie via het zoekveld uitsluiten :)
 
Erwin Zenden

Erwin Zenden

17/12/2014 15:46:43
Quote Anchor link
Ik heb ook altijd mijn database altijd ongeveer hetzelfde zoals jij het aanroept aangeroepen.
Ik dacht dat dit altijd best veilig was alleen echo ik altijd de informatie vanuit mijn database inplaats van de $_POST.

Wat jij doet is,
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

if(isset($_POST['zoeken'])){

        $stmt = $db_con->prepare="SELECT * FROM customers WHERE Voornaam = ?";
        $stmt->bind_param("s", $zoeknaam);
            $zoeknaam = $_POST['Voornaam'];

        $stmt->execute();

        echo $zoeknaam;



    }


En ik doe dit altijd gebaseerd op $_POST.. zoals dit.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
$zoeknaam = $_POST['Voornaam'];
$stmt = $db_con->prepare("SELECT * FROM customers WHERE Voornaam=?");
$stmt->bindParam(1, $zoeknaam);
$stmt->execute();

vervolgens pak ik ze met een foreach functie uit de database..
Ik hoor ook graag wat een betere manier is hiervoor..
Gewijzigd op 17/12/2014 15:52:43 door Erwin Zenden
 
Michael Desmadril

Michael Desmadril

17/12/2014 15:53:59
Quote Anchor link
Zo zou het beter moeten gaan, maar het werkt helaas niet

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
$zoeknaam = $_POST['Voornaam']; // declare the input here
$stmte = $db_con->prepare("SELECT * FROM customers WHERE Voornaam = ?");
$stmte->bind_param("s", $zoeknaam); // then use inside here
$stmte->execute();

if($stmte->num_rows > 0) {
    $results = $stmte->get_result();
    while($row = $results->fetch_assoc()) {
        echo $row['Voornaam'] . '<br/>';
        echo $row['Achternaam'] . '<br/>';
        // and other columns
    }
}
 
Ward van der Put
Moderator

Ward van der Put

17/12/2014 16:21:29
Quote Anchor link
Op regel 1 gebruik je $_POST['Voornaam'] maar je noemt twee andere controles niet: wordt er wel een POST gebruikt (en bijvoorbeeld geen GET) en bestaat $_POST['Voornaam'] wel?
 
Michael Desmadril

Michael Desmadril

17/12/2014 16:23:50
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
<?php
    
    require_once 'login.php';
    $db_con= new mysqli($db_host, $db_username, $db_password, $db_database);
    $db_con->set_charset("utf8");
    if($db_con->connect_error) die ("(" . $db_con->connect_error . " Error during connection");

    if(isset($_POST['zoeken'])){


    $zoeknaam = $_POST['Zoek']; // declare the input here
    $stmte = $db_con->prepare("SELECT * FROM customers WHERE Voornaam = ?");
    $stmte->bind_param("s", $zoeknaam); // then use inside here
    $stmte->execute();


    $rows = $stmte->num_rows;

    if($stmte->num
        _rows > 0) {
    $results = $stmte->get_result();
    while($row = $results->fetch_assoc()) {
    
    echo $row['Achternaam'] . '<br/>';
        // and other columns
  
}



?>

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
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="utf-8">
    <title>title</title>
    <link rel="stylesheet" href="style.css">
    <link href='http://fonts.googleapis.com/css?family=Raleway:200' rel='stylesheet' type='text/css'>
    <script src="script.js"></script>
  </head>
  <body>
 <table class="table_form">
              <form method="POST" action="test.php">
                  <tr>
                      <td>Zoeken</td><td><input type="text" name="Zoek" /></td>
                  </tr>
                  <tr>
                      <td>Bevestigen</td><td><input type="submit" name="zoeken" /></td>
                  </tr>

              </form>
      </table>

<div class="field">
<?php
  require_once 'issset.php';
?>

</div>
 </body>
</html>


Kijk, zo heb ik het nu...ik krijg geen fouten, maar ik krijg ook geen resultaten.
 
Ward van der Put
Moderator

Ward van der Put

17/12/2014 16:29:24
Quote Anchor link
Bij regel 19 op Enter gedrukt:

if($stmte->num
_rows > 0) {
 
Michael Desmadril

Michael Desmadril

17/12/2014 16:33:35
Quote Anchor link
Ja, is op deze pagina gebeurd, staat juist in mijn editor. Werkt niet....

Misschien een domme vraag maar kan het liggen aan het feit dat ik PHP Version 5.3.1 heb?

Toevoeging op 17/12/2014 16:33:36:

Ja, is op deze pagina gebeurd, staat juist in mijn editor. Werkt niet....

Misschien een domme vraag maar kan het liggen aan het feit dat ik PHP Version 5.3.1 heb?
 
Ward van der Put
Moderator

Ward van der Put

17/12/2014 16:36:34
Quote Anchor link
Schoon de code eens op en post dan het échte resultaat?

We moeten anders maar raden hoe het origineel er zou kunnen uitzien.
Gewijzigd op 17/12/2014 16:36:58 door Ward van der Put
 
Michael Desmadril

Michael Desmadril

17/12/2014 16:42:21
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
<?php
    
    require_once 'login.php';
    $db_con= new mysqli($db_host, $db_username, $db_password, $db_database);
    $db_con->set_charset("utf8");
    if($db_con->connect_error) die ("(" . $db_con->connect_error . " Error during connection");

    if(isset($_POST['zoeken'])){


    $zoeknaam = $_POST['Zoek']; // declare the input here
    $stmte = $db_con->prepare("SELECT * FROM customers WHERE Voornaam = ?");
    $stmte->bind_param("s", $zoeknaam); // then use inside here
    $stmte->execute();


    $rows = $stmte->num_rows;

    if($stmte->num_rows > 0) {
    $results = $stmte->get_result();
    while($row = $results->fetch_assoc()) {
    
    echo $row['Achternaam'] . '<br/>';
        // and other columns
  
}
}
}



?>


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
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="utf-8">
    <title>title</title>
    <link rel="stylesheet" href="style.css">
    <link href='http://fonts.googleapis.com/css?family=Raleway:200' rel='stylesheet' type='text/css'>
    <script src="script.js"></script>
  </head>
  <body>
 <table class="table_form">
              <form method="POST" action="test.php">
                  <tr>
                      <td>Zoeken</td><td><input type="text" name="Zoek" /></td>
                  </tr>
                  <tr>
                      <td>Bevestigen</td><td><input type="submit" name="zoeken" /></td>
                  </tr>

              </form>
      </table>

<div class="field">
<?php
  require_once 'issset.php';
?>

</div>
 </body>
</html>



Voila
 

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.