Ben ik beschermd tegen SQL injection?
Pagina: « vorige 1 2 3 volgende »
Voorbeeld,
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
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 />
";
}
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
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)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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'];
}
$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)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
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>
<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
$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 -
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 :)
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...
Toevoeging op 17/12/2014 13:56:50:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
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;
}
$stmt = $db_con->prepare="SELECT * FROM customers WHERE Voornaam = ?";
$stmt->bind_param("s", $zoeknaam);
$zoeknaam = $_POST['Voornaam'];
$stmt->execute();
echo $zoeknaam;
}
Code (php)
1
2
3
4
5
6
7
8
9
10
11
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>
<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...
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.
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 :)
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.
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...
Begin bij de basis: PHP-input opschonen plus valideren en SQL-injectie uitsluiten. Ga daarna verder.
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 :)
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)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
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)
1
2
3
4
2
3
4
$zoeknaam = $_POST['Voornaam'];
$stmt = $db_con->prepare("SELECT * FROM customers WHERE Voornaam=?");
$stmt->bindParam(1, $zoeknaam);
$stmt->execute();
$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
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
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
}
}
$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
}
}
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?
Code (php)
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
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
}
?>
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)
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
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>
<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.
if($stmte->num
_rows > 0) {
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?
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
Code (php)
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
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
}
}
}
?>
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)
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
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>
<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