ubuntuusers.de

PHP & MySQL: SQL-Injections

Status: Gelöst | Ubuntu-Version: Ubuntu 11.04 (Natty Narwhal)
Antworten |

Glocke

Avatar von Glocke

Anmeldungsdatum:
1. März 2009

Beiträge: 880

Wohnort: Thüringen

Hi,

leider gibt es auf funpic.de imho keine PDO-Unterstützung für PHP Anwendungen. Welche Möglichkeiten habe ich, dennoch Prepared Statements zu verwenden? Prinzipiell habe ich auch mit dem Gedanken gespielt, die MySQL-bezogenen Dinge in einer separaten Klasse zu kapseln. Nur kann ich mir nicht vorstellen, dass mysql_real_escape_string() ausreichender Schutz gegen SQL-Injections darstellt. Hat jemand Erfahrungen damit?

LG

/EDIT: sicherlich ist das folgende sehr blauäugig, aber mir fehlt einfach die Erfahrung mit SQL-Injections

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
<?php

$i = secure($_GET["i"]);
$d = secure($_GET["d"]);
$s = secure($_GET["s"]);

function secure($parameter) {
    if (!is_numeric($parameter)) {
        return mysql_escape_string($parameter);
    }

    if ((int)$parameter == $parameter) { return (int)$parameter; }
    if ((double)$parameter == $parameter) { return (double)$parameter; }
}

print "<pre>";
print $i . ' (' . gettype($i) . ")\n";
print $d . ' (' . gettype($d) . ")\n";
print $s . ' (' . gettype($s) . ")\n";
print "</pre>";

?>

Als Beispiel-URL habe ich mal http://localhost/secure?i=14&d=28.14&s=Hallo'Welt probiert und keine probleme festgestellt... kp ..

btw habe ich hier nur mysql_escape_string verwendet, da die andere imho eine mysql verbindung benötigt (im eigentlichen code würde ich dann zur genannten funktion umschwenken).

1
2
3
14 (integer)
28.14 (double)
Hallo\'Welt (string)

JuergenF

Anmeldungsdatum:
22. Oktober 2004

Beiträge: 2009

Wohnort: FFM

Moin

Vorweg zur Entspannung: http://xkcd.com/327/

leider gibt es auf funpic.de imho keine PDO-Unterstützung für PHP Anwendungen.

Worauf basierst Du Deine bescheidene Meinung denn? Immerhin versprechen die in ihrer FAQ volle PHP-Unterstützung und dass man beliebige CMS und alles mögliche andere dort hosten kann - ich würde mal vermuten dass bei recht vielen derartigen Anwendungen auch die PDO genutzt werden. Frag doch mal in deren Forum, die scheinen da auch nett zu sein ☺

Nur kann ich mir nicht vorstellen, dass mysql_real_escape_string() ausreichender Schutz gegen SQL-Injections darstellt.

Ich bin da kein Experte, aber m.W. basiert so eine Injection doch immer darauf, einen von Dir begonnenen String 'vorzeitig' durch ein Anführungszeichen in der Benutzereingabe zu beenden. Diese werden durch die Funktion ja ordentlich maskiert.

Natürlich bewahrt Dich diese Funktion nicht vor Dummheiten, wie z.B. aus Versehen eine Text-Benutzereingabe ausserhalb von Anführungszeichen zu setzen. Das könntest Du aber, wie ja schon angedacht, mit ein paar eigenen sorgfältig getesteten Klassen zumindest unwahrscheinlicher werden lassen.

Glocke

(Themenstarter)
Avatar von Glocke

Anmeldungsdatum:
1. März 2009

Beiträge: 880

Wohnort: Thüringen

Hi,

xkcd ftw ^^

meine Aussage bzgl. PDO und funpic stüzt sich auf diversen Google-Ergebnissen wie diesem. Ich kann mir nicht vorstellen, dass sich seit April daran etwas verändert hat.

Was die Injections angeht ist das auch meine Sichtweise ... tja da sind sich zwei nicht-Experten einig 😀

LG und schönen Abend!

Glocke

(Themenstarter)
Avatar von Glocke

Anmeldungsdatum:
1. März 2009

Beiträge: 880

Wohnort: Thüringen

*push*

robbe13

Avatar von robbe13

Anmeldungsdatum:
22. Oktober 2007

Beiträge: 53

Strings die durch Eingaben des Benutzers verändert werden können/eingegeben werden müssen mit mysql_real_escape_string() escaped werden.
Zahlen durch intval() oder floatval(). Damit sollten SQL-Injections vermieden werden, wenn ich mich nicht täusche.

DiBo33

Anmeldungsdatum:
16. Juni 2006

Beiträge: 1827

Wenn du nachfolgenden Artikel nebst folgendem beherzigst, ist das Thema SQL-Injections bereits mit abgedeckt.

http://wiki.selfhtml.org/wiki/Artikel:Kontextwechsel

Glocke

(Themenstarter)
Avatar von Glocke

Anmeldungsdatum:
1. März 2009

Beiträge: 880

Wohnort: Thüringen

robbe13 schrieb:

Zahlen durch intval() oder floatval(). Damit sollten SQL-Injections vermieden werden, wenn ich mich nicht täusche.

Effektiv machen die doch nichts anderes als typecasts, oder?

DiBo33

Anmeldungsdatum:
16. Juni 2006

Beiträge: 1827

Glocke schrieb:

robbe13 schrieb:

Zahlen durch intval() oder floatval(). Damit sollten SQL-Injections vermieden werden, wenn ich mich nicht täusche.

Effektiv machen die doch nichts anderes als typecasts, oder?

ja

TheDarkRose

Avatar von TheDarkRose

Anmeldungsdatum:
28. Juli 2010

Beiträge: 3459

Also mysqli sollte bei Funpic schon vorhanden sein. Damit ist es auch möglich Prepared Statements zu verwenden. http://de3.php.net/manual/de/mysqli-stmt.prepare.php

Antworten |