Vraag over sql...
Op mijn site heb ik nu een gastenboek en een soort vraag en aanbod.
Bij het gastenboek kunnen de mensen zelf online iets neerzetten, en bij de vraag en aanbod kan iemand een advertentie plaatsen doormiddel van een formuliertje. En die gegevens worden dan in de database gezet, en ook weer uitgelezen op de vraag en aanbod pagina.
Maar ik zat allemaal te zoeken op websites etc.
Maar toen merkte ik op dat men via sql injection de site kan gaan vergallen.
Kunnen ze dat ook doen via mij vraag en aanbod en mij gastenboek?
Ik hoop dat jullie me kunnen helpen :)
Gewijzigd op 01/01/1970 01:00:00 door Stefan
HIER ook nog de nodige informatie
edit: link aangepast
Om uitsluitsel te geven is het wellicht handig als je wat code hier neerzet zodat we er is naar kunnen kijken. Verder staat hier edit: link aangepast
Gewijzigd op 01/01/1970 01:00:00 door Lissy Pixel
Die link geeft een error bij de gemiddelde PHPuser lissy;-) Ik begon hem al te wantrouwen toen ik de bestandsnaam zag: edittopic.php
Code (php)
1
2
3
4
2
3
4
<?php
// zonder spaties
if (preg_match('/[\r\n,;\'"]/', $_POST['Email']) or preg_match('/[\r\n,;\'"]/', $_POST['Bericht']))
?>
// zonder spaties
if (preg_match('/[\r\n,;\'"]/', $_POST['Email']) or preg_match('/[\r\n,;\'"]/', $_POST['Bericht']))
?>
Om te beginnen kan je uw INSTERT queries al afschermen door er '' rond de values te zetten.
zoals onderstaand voorbeeld
Code (php)
1
2
3
4
2
3
4
$sql2 = "INSERT INTO acteurs";
$sql2 .= " ( voornaam, achternaam )";
$sql2 .= " VALUES";
$sql2 .= " ( '".$voornaam."', '".$achternaam."' );";
$sql2 .= " ( voornaam, achternaam )";
$sql2 .= " VALUES";
$sql2 .= " ( '".$voornaam."', '".$achternaam."' );";
Als je mysql user kan aanmaken, maak je er ene aan met alleen SELECT lees rechten.
Die gebruik je voor de hele site en voor de adminpages gebruik je een login en als die succesvol is geef je ze meer rechten.
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
32
33
34
35
36
37
38
39
40
41
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
<?php
ob_start();
if($_SERVER['REQUEST_METHOD'] == "POST")
{
mysql_query("INSERT INTO vraagenaanbod (product,naam,plaats,telefoonnummer,email,bericht,prijs,soort,datum) VALUES('".$_POST['product']."','".$_POST['naam']."','".$_POST['plaats']."','".$_POST['telefoonnummer']."','".$_POST['email']."','".$_POST['bericht']."','".$_POST['prijs']."','".$_POST['soort']."','".$date."')") or die ( mysql_error() );
echo "Vraag/Aanbod geplaatst";
$afzender = "From: [email protected]";
mail($_POST['email'],'Plaatsing Advertentie','Je advertentie is geplaatst',$afzender);
}
else
{
echo "<B>Vraag/Aanbod plaatsen:</b><br><br>";
echo "<form name='veranderen' method='post'>";
echo "Product naam:<br>";
echo "<input type='text' name='product'><br>";
echo "Naam:<br>";
echo "<input type='text' name='naam'><br>";
echo "Plaats:<br>";
echo "<input type='text' name='plaats'><br>";
echo "Telefoonnummer:<br>";
echo "<input type='text' name='telefoonnummer'><br>";
echo "Email:<br>";
echo "<input type='text' name='email'><br>";
echo "Extra informatie:<br>";
echo "<textarea name='bericht' cols='40' rows='5'></textarea><br>";
echo "Prijs:<br>";
echo "<input type='text' name='prijs'><br>";
echo "Aangeboden/Gezocht:<br>";
echo "<select name='soort'><option value='Aangeboden'>Aangeboden</option><option value='Gezocht'>Gezocht</option></select><br>";
echo "<input type='submit' name='submit' value='Vraag/Aanbod plaatsen'></form>";
}
ob_end_flush();
?>
ob_start();
if($_SERVER['REQUEST_METHOD'] == "POST")
{
mysql_query("INSERT INTO vraagenaanbod (product,naam,plaats,telefoonnummer,email,bericht,prijs,soort,datum) VALUES('".$_POST['product']."','".$_POST['naam']."','".$_POST['plaats']."','".$_POST['telefoonnummer']."','".$_POST['email']."','".$_POST['bericht']."','".$_POST['prijs']."','".$_POST['soort']."','".$date."')") or die ( mysql_error() );
echo "Vraag/Aanbod geplaatst";
$afzender = "From: [email protected]";
mail($_POST['email'],'Plaatsing Advertentie','Je advertentie is geplaatst',$afzender);
}
else
{
echo "<B>Vraag/Aanbod plaatsen:</b><br><br>";
echo "<form name='veranderen' method='post'>";
echo "Product naam:<br>";
echo "<input type='text' name='product'><br>";
echo "Naam:<br>";
echo "<input type='text' name='naam'><br>";
echo "Plaats:<br>";
echo "<input type='text' name='plaats'><br>";
echo "Telefoonnummer:<br>";
echo "<input type='text' name='telefoonnummer'><br>";
echo "Email:<br>";
echo "<input type='text' name='email'><br>";
echo "Extra informatie:<br>";
echo "<textarea name='bericht' cols='40' rows='5'></textarea><br>";
echo "Prijs:<br>";
echo "<input type='text' name='prijs'><br>";
echo "Aangeboden/Gezocht:<br>";
echo "<select name='soort'><option value='Aangeboden'>Aangeboden</option><option value='Gezocht'>Gezocht</option></select><br>";
echo "<input type='submit' name='submit' value='Vraag/Aanbod plaatsen'></form>";
}
ob_end_flush();
?>
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
32
33
34
35
36
37
38
39
40
41
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
<?php
ob_start();
if($_SERVER['REQUEST_METHOD'] == "POST")
{
mysql_query("INSERT INTO vraagenaanbod (product,naam,plaats,telefoonnummer,email,bericht,prijs,soort,datum) VALUES('".htmlentities($_POST['product'])."','".htmlentities($_POST['naam'])."','".htmlentities($_POST['plaats'])."','".htmlentities($_POST['telefoonnummer'])."','".htmlentities($_POST['email'])."','".htmlentities($_POST['bericht'])."','".htmlentities($_POST['prijs'])."','".htmlentities($_POST['soort'])."','".$date."')") or die ( mysql_error() );
echo "Vraag/Aanbod geplaatst";
$afzender = "From: [email protected]";
mail($_POST['email'],'Plaatsing Advertentie','Je advertentie is geplaatst',$afzender);
}
else
{
echo "<B>Vraag/Aanbod plaatsen:</b><br><br>";
echo "<form name='veranderen' method='post'>";
echo "Product naam:<br>";
echo "<input type='text' name='product'><br>";
echo "Naam:<br>";
echo "<input type='text' name='naam'><br>";
echo "Plaats:<br>";
echo "<input type='text' name='plaats'><br>";
echo "Telefoonnummer:<br>";
echo "<input type='text' name='telefoonnummer'><br>";
echo "Email:<br>";
echo "<input type='text' name='email'><br>";
echo "Extra informatie:<br>";
echo "<textarea name='bericht' cols='40' rows='5'></textarea><br>";
echo "Prijs:<br>";
echo "<input type='text' name='prijs'><br>";
echo "Aangeboden/Gezocht:<br>";
echo "<select name='soort'><option value='Aangeboden'>Aangeboden</option><option value='Gezocht'>Gezocht</option></select><br>";
echo "<input type='submit' name='submit' value='Vraag/Aanbod plaatsen'></form>";
}
ob_end_flush();
?>
ob_start();
if($_SERVER['REQUEST_METHOD'] == "POST")
{
mysql_query("INSERT INTO vraagenaanbod (product,naam,plaats,telefoonnummer,email,bericht,prijs,soort,datum) VALUES('".htmlentities($_POST['product'])."','".htmlentities($_POST['naam'])."','".htmlentities($_POST['plaats'])."','".htmlentities($_POST['telefoonnummer'])."','".htmlentities($_POST['email'])."','".htmlentities($_POST['bericht'])."','".htmlentities($_POST['prijs'])."','".htmlentities($_POST['soort'])."','".$date."')") or die ( mysql_error() );
echo "Vraag/Aanbod geplaatst";
$afzender = "From: [email protected]";
mail($_POST['email'],'Plaatsing Advertentie','Je advertentie is geplaatst',$afzender);
}
else
{
echo "<B>Vraag/Aanbod plaatsen:</b><br><br>";
echo "<form name='veranderen' method='post'>";
echo "Product naam:<br>";
echo "<input type='text' name='product'><br>";
echo "Naam:<br>";
echo "<input type='text' name='naam'><br>";
echo "Plaats:<br>";
echo "<input type='text' name='plaats'><br>";
echo "Telefoonnummer:<br>";
echo "<input type='text' name='telefoonnummer'><br>";
echo "Email:<br>";
echo "<input type='text' name='email'><br>";
echo "Extra informatie:<br>";
echo "<textarea name='bericht' cols='40' rows='5'></textarea><br>";
echo "Prijs:<br>";
echo "<input type='text' name='prijs'><br>";
echo "Aangeboden/Gezocht:<br>";
echo "<select name='soort'><option value='Aangeboden'>Aangeboden</option><option value='Gezocht'>Gezocht</option></select><br>";
echo "<input type='submit' name='submit' value='Vraag/Aanbod plaatsen'></form>";
}
ob_end_flush();
?>
Link van Lissy:
Klik
@ Andries : bedankt voor de juiste link!!!
Door middel van die htmlentries is mijn script nu beveiligt?zodat de mensen niet kunnen rommelen als ze de gegevens naar de database worden gezet?
Thnx als dat zo is :D
Gewijzigd op 01/01/1970 01:00:00 door stefan
RedCrew:
Je kan dat op verschillende mannieren.
Om te beginnen kan je uw INSTERT queries al afschermen door er '' rond de values te zetten.
zoals onderstaand voorbeeld
Als je mysql user kan aanmaken, maak je er ene aan met alleen SELECT lees rechten.
Die gebruik je voor de hele site en voor de adminpages gebruik je een login en als die succesvol is geef je ze meer rechten.
Om te beginnen kan je uw INSTERT queries al afschermen door er '' rond de values te zetten.
zoals onderstaand voorbeeld
Code (php)
1
2
3
4
2
3
4
$sql2 = "INSERT INTO acteurs";
$sql2 .= " ( voornaam, achternaam )";
$sql2 .= " VALUES";
$sql2 .= " ( '".$voornaam."', '".$achternaam."' );";
$sql2 .= " ( voornaam, achternaam )";
$sql2 .= " VALUES";
$sql2 .= " ( '".$voornaam."', '".$achternaam."' );";
Als je mysql user kan aanmaken, maak je er ene aan met alleen SELECT lees rechten.
Die gebruik je voor de hele site en voor de adminpages gebruik je een login en als die succesvol is geef je ze meer rechten.
Dat lijkt leuk alleen dan kan iemand ook nooit een eigen item/bericht plaatsen
Hoe kan ik nu testen dat het daadwerkelijk werkt?
als je dingen in het database wilt plaatse gebruik:
strip_tags() en mysql_real_escape_string()
Als je het wilt weergeven gebruik:
htmlentities()
en dan de overige dingen zoals newline to break, ubbc ect.
Echter waneer ik nu bijvoorbeeld <a href="sgsg">sgfsgs</a> intyp bij naam.
Wordt het toch gewoon een link op de pagina.
Ik heb telkens de verkeerde script geupload :O
Wat ik nu dus krijg te zien is;
als iemand dit invult bij product
<a href="sgsg">sgfsgs</a>
Krijg ik bij product dit te zien
<a href="sgsg">sgfsgs</a>
En ik kan die niet aanklikken.
Dus het moet werken dan als het goed is :D
gebruik maken van strip_tags() en mysql_real_escape_string().
VALUES('".htmlentities strip_tags() ($_POST['product'])."
zo?
zo volgens mij en dan met alle variabelen.
alleen word het wel een lange regel.
dus ik stel voor om het zo te doen:
Code (php)
1
2
3
2
3
<?
$product = mysql_real_escape_string(strip_tags(htmlentities($_POST['product'])));
?>
$product = mysql_real_escape_string(strip_tags(htmlentities($_POST['product'])));
?>
Dus je maakt van alle dingen een variabelen aan.
en dan word je query zoiets als:
Code (php)
1
2
3
4
5
2
3
4
5
<?
mysql_query("INSERT INTO vraagenaanbod (product,naam,plaats,telefoonnummer,email,bericht,prijs,soort,datum) VALUES('".$product."','".$naam."','"$plaats."',
// ...... gaat verder ect.
'".$date."')") or die ( mysql_error() );
?>
mysql_query("INSERT INTO vraagenaanbod (product,naam,plaats,telefoonnummer,email,bericht,prijs,soort,datum) VALUES('".$product."','".$naam."','"$plaats."',
// ...... gaat verder ect.
'".$date."')") or die ( mysql_error() );
?>
Gewijzigd op 01/01/1970 01:00:00 door Benny Lava
Code (php)
1
2
3
2
3
<?php
VALUES('".htmlentities(strip_tags(mysql_real_escape_string($_POST['product'])))."')
?>
VALUES('".htmlentities(strip_tags(mysql_real_escape_string($_POST['product'])))."')
?>
Dit lijkt er meer op...
maar het is handiger als je het op deze manier doet
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?php
if(!empty($_POST['product']){
$product = htmlentities(striptags(mysql_real_escape_string($_POST['product'])));
}else{
echo 'U moet wel een product kiezen';
}
// en dan je sql
$sql = "INSERT INTO tabel_naam (producten) VALUES ('".$product."')";
$res = mysql_query($sql);
if($res){
echo 'Het is goed gegaan';
}else{
echo 'er is iets fout gegaan';
}
?>
if(!empty($_POST['product']){
$product = htmlentities(striptags(mysql_real_escape_string($_POST['product'])));
}else{
echo 'U moet wel een product kiezen';
}
// en dan je sql
$sql = "INSERT INTO tabel_naam (producten) VALUES ('".$product."')";
$res = mysql_query($sql);
if($res){
echo 'Het is goed gegaan';
}else{
echo 'er is iets fout gegaan';
}
?>
Gewijzigd op 01/01/1970 01:00:00 door Arian Stolwijk
Maar ik heb al verschillende dingen geprobeerd om dat toe te passen maar het lukt me maar niet.
En met dit;
Code (php)
1
2
3
2
3
<?php
VALUES('".htmlentities(striptags(mysql_real_escape_string($_POST['product'])))."')
?>
VALUES('".htmlentities(striptags(mysql_real_escape_string($_POST['product'])))."')
?>
Krijg in op de pagina te zien als ikhet wil plaatsen;
Fatal error: Call to undefined function: striptags() in (sitenaam) on line 6
Gewijzigd op 01/01/1970 01:00:00 door stefan
Kan ook, ik wist even de goeie volgorde niet.
Die error betekend dat de functie striptages() niet bestaat...
Het is strip_tags()
typfoutje...