Geparametriseerde query
Hieronder staat een stukje script die niet veilig is.
Ik moet deze herschrijven om het SQLI veilig te maken.
Ik heb het geprobeerd met escapen, maar dat houdt alleen bepaalde karakters tegen.
Het script moet ook beveiligd worden tegen bv OR 1=1.
Ik heb het geprobeerd met wat tutorials, maar snap niet precies hoe een geparametriseerde query werkt.
Ik ben nieuw op dit forum en hoop dat ik hier goed zit, anders hoor ik het graag.
Ik vraag niet voor een quick fix, want daar leer ik zelf niets van.
Ik heb de code geplaatst, zodat het makkelijker is om te zien waar ik het over heb.
Alvast bedankt voor de moeite.
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
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
<?php
mysql_connect("localhost", "cms", "cms");
mysql_select_db("cms_nl");
if (!isset($_GET['cmd'])) {
header("Location: ?cmd=show&id=1");
exit;
}
switch($_GET['cmd']) {
case "show":
if (isset($_GET['id'])) {
print getPage(mysql_real_escape_string($_GET['id']));
}
break;
case "search":
if (isset($_GET['query'])) {
print search(mysql_real_escape_string($_GET['query']));
}
break;
}
function getPage($id) {
$result = mysql_query("SELECT title, body FROM pages WHERE id = $id");
$res = mysql_fetch_assoc($result);
print "<h1>" . $res['title'] . "</h1>" . $res['body'];
}
function search($query) {
$result = mysql_query("SELECT title FROM pages WHERE title like '%$query%' OR body like '%$query%'");
print "<ul>";
while($res = mysql_fetch_assoc($result)) {
print "<li>" . $res['title'] . "</li>";
}
print "</ul>";
}
?>
mysql_connect("localhost", "cms", "cms");
mysql_select_db("cms_nl");
if (!isset($_GET['cmd'])) {
header("Location: ?cmd=show&id=1");
exit;
}
switch($_GET['cmd']) {
case "show":
if (isset($_GET['id'])) {
print getPage(mysql_real_escape_string($_GET['id']));
}
break;
case "search":
if (isset($_GET['query'])) {
print search(mysql_real_escape_string($_GET['query']));
}
break;
}
function getPage($id) {
$result = mysql_query("SELECT title, body FROM pages WHERE id = $id");
$res = mysql_fetch_assoc($result);
print "<h1>" . $res['title'] . "</h1>" . $res['body'];
}
function search($query) {
$result = mysql_query("SELECT title FROM pages WHERE title like '%$query%' OR body like '%$query%'");
print "<ul>";
while($res = mysql_fetch_assoc($result)) {
print "<li>" . $res['title'] . "</li>";
}
print "</ul>";
}
?>
- Aar -:
Gelieve in het vervolg bij code de [code][/code]-tags gebruiken.
Hier kan je meer lezen over de mogelijke opmaakcodes.
Alvast bedankt!
Hier kan je meer lezen over de mogelijke opmaakcodes.
Alvast bedankt!
Gewijzigd op 16/01/2015 12:42:00 door - Ariën -
Ik zou zo niet zien waarom dit niet veilig is. Je kunt die query omzetten in een mysqli_query of een PDO query. real escape zorgt er voor dat er bijvoorbeeld geen single quotes gebruikt kunnen worden waardoor je argument in de query open wordt gebroken.
de url is https://ditisdesite.com/sql/fbe1b52c33b6fe10b2ebbe068749c1c1/index.php?cmd=show&id=1
het script wordt gecontroleerd met sql injectie met id = 2234 OR 1=1
Code (php)
1
2
3
2
3
<?php
$result = mysql_query('SELECT title, body FROM pages WHERE id = ' . (int)$id);
?>
$result = mysql_query('SELECT title, body FROM pages WHERE id = ' . (int)$id);
?>
Hier heeft mysql_real_escape_string() geen zin: je zoekt niet naar een string, dus maak er gewoon een integer van.
Verder kun je (of eigenlijk: moet je) beter overstappen op MySQLi of PDO.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
<?php
function getPage($id) {
if(is_numeric($id)){
$result = mysql_query("SELECT title, body FROM pages WHERE id = $id");
$res = mysql_fetch_assoc($result);
print "<h1>" . $res['title'] . "</h1>" . $res['body'];
}else{
//404 error of iets dergelijks, geen php foutmeldingen in ieder geval
}
}
?>
function getPage($id) {
if(is_numeric($id)){
$result = mysql_query("SELECT title, body FROM pages WHERE id = $id");
$res = mysql_fetch_assoc($result);
print "<h1>" . $res['title'] . "</h1>" . $res['body'];
}else{
//404 error of iets dergelijks, geen php foutmeldingen in ieder geval
}
}
?>
edit: bracket vergeten...
Gewijzigd op 16/01/2015 13:49:01 door Henk de Vriep
Ook hier kun je beter (int)$id in de query steken.
Ward van der Put op 16/01/2015 12:45:09:
Dan wordt de query echter ook uitgevoerd bij een float zoals 1.2.
Ook hier kun je beter (int)$id in de query steken.
Ook hier kun je beter (int)$id in de query steken.
scherp inderdaad, niet zo gauw aan gedacht!
Henk de Vriep op 16/01/2015 12:32:41:
Wat ik ook wel eens doe is het volgende gecombineerd met jou voorbeeld:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
<?php
function getPage($id) {
if(is_numeric($id)){
$result = mysql_query("SELECT title, body FROM pages WHERE id = $id");
$res = mysql_fetch_assoc($result);
print "<h1>" . $res['title'] . "</h1>" . $res['body'];
else{
//404 error of iets dergelijks, geen php foutmeldingen in ieder geval
}
}
?>
function getPage($id) {
if(is_numeric($id)){
$result = mysql_query("SELECT title, body FROM pages WHERE id = $id");
$res = mysql_fetch_assoc($result);
print "<h1>" . $res['title'] . "</h1>" . $res['body'];
else{
//404 error of iets dergelijks, geen php foutmeldingen in ieder geval
}
}
?>
Als ik dit gebruik krijg ik "Error HTTP Error 500: Internal Server Error"
dit is een error van het geautomatiseerde systeem wat de integriteit van de pagina controleert.
Er ontbreekt een } in } else {.
nu nog met deze foutmelding aan de slag gaan.
MISLUKT: controleren op sql injectie met query = bla' OR 1=1 #
maar jullie hebben mij al enorm geholpen!
ontzettend bedankt.
Code (php)
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
<?php
function search($query) {
$result = mysql_query("SELECT title FROM pages WHERE title like '%$query%' OR body like '%$query%'");
print "<ul>";
while($res = mysql_fetch_assoc($result)) {
print "<li>" . $res['title'] . "</li>";
}
print "</ul>";
}
?>
function search($query) {
$result = mysql_query("SELECT title FROM pages WHERE title like '%$query%' OR body like '%$query%'");
print "<ul>";
while($res = mysql_fetch_assoc($result)) {
print "<li>" . $res['title'] . "</li>";
}
print "</ul>";
}
?>
Dat kun je bijvoorbeeld zo oplossen:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?php
function search($query) {
// We hebben een niet-lege string nodig
if (!is_string($query) || empty($string)) {
return false;
}
// String escapen
$query = mysql_real_escape_string($query);
$result = mysql_query("SELECT title FROM pages WHERE title like '%$query%' OR body like '%$query%'");
if (mysql_num_rows($result) > 0) {
echo '<ul>';
while ($res = mysql_fetch_assoc($result)) {
echo '<li>' . $res['title'] . '</li>';
}
echo '</ul>';
}
}
?>
function search($query) {
// We hebben een niet-lege string nodig
if (!is_string($query) || empty($string)) {
return false;
}
// String escapen
$query = mysql_real_escape_string($query);
$result = mysql_query("SELECT title FROM pages WHERE title like '%$query%' OR body like '%$query%'");
if (mysql_num_rows($result) > 0) {
echo '<ul>';
while ($res = mysql_fetch_assoc($result)) {
echo '<li>' . $res['title'] . '</li>';
}
echo '</ul>';
}
}
?>
Gewijzigd op 16/01/2015 15:55:08 door Ward van der Put
mysql_escape_string($query); => mysql_real_escape_string($query);
Dank je, SanThe, ik heb het voorbeeld aangepast.
als ik het laatste script gebruik, krijg ik de foutmelding dat de pagina niet gelijk is gebleven.
deze foutmelding kreeg ik niet bij het eerste script van Ward:
Code (php)
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
<?php
function search($query) {
$result = mysql_query("SELECT title FROM pages WHERE title like '%$query%' OR body like '%$query%'");
print "<ul>";
while($res = mysql_fetch_assoc($result)) {
print "<li>" . $res['title'] . "</li>";
}
print "</ul>";
}
?>
function search($query) {
$result = mysql_query("SELECT title FROM pages WHERE title like '%$query%' OR body like '%$query%'");
print "<ul>";
while($res = mysql_fetch_assoc($result)) {
print "<li>" . $res['title'] . "</li>";
}
print "</ul>";
}
?>
Toevoeging op 20/01/2015 10:26:15:
oefening is opgelost met jullie hulp.
Bij $id heb ik de oplossing gebruikt van Henk.
Bij $query de eerste oplossing van Ward.
Samen werkte perfect.
Nu op mijn gemak bekijken hoe het script precies werkt.
Bedankt voor jullie hulp en tijd.
Gewijzigd op 20/01/2015 10:17:48 door Alex Bakker