Angst vor SQL-Injection

kar_sten

Mitglied
Hallo!

Ich will die User in ein Textfeld eine Nachricht eingeben lassen können, die dann in einer Datenbank abgespeichert wird. Doch wenn ich einfach die Eingabe ungeprüft in den mysql-Befehl einarbeite, laufe ich natürlich Gefahr, denn SQL-Injections sind dadurch möglich.

Gibt es nun eine php-Funktion, die all diese gefährlichen Zeichen einfach rauslöscht, so dass ich mich um nichts mehr kümmern muss?
 
Habe das jetzt so gemacht und habe auch schon gleich wieder ein Problem damit. Beim Eintragen eines Datensatzes, indem zum Beispiel ein " vorkommt, wird dieser als zwei Zeichen also als ein \ und ein " eingetragen. Damit habe ich beim wieder ausgehen ein \ davor.

Das heißt er fasst es gar nicht als escaptes Zeichen auf. Wie kommt das?
 
Wie ist denn die Einstellung von magic_quotes_gpc?

Die Probleme rühren wahrscheinlich von dieser Einstellung.
Entweder den Hoster bitten zu deaktiveren oder versuchen es selbst zu machen, siehe unten.
 
Zuletzt bearbeitet:
Hi,

Wie ist denn die Einstellung von magic_quotes_gpc?

Die Probleme rühren wahrscheinlich von dieser Einstellung.
Entweder den Hoster bitten zu deaktiveren oder versuchen es selbst zu machen mit:

PHP:
set_magic_quotes_runtime(0);

magic_quotes_runtime und magic_quotes_gpc sind aber zwei verschiedene Paar Schuhe. magic_quotes_gpc bezieht sich auf GET-, POST-, und COOKIE-Daten, während magic_quotes_runtime bewirkt, das Rückgabewerte von Funktionen, die externe Quellen (Datenbanken und Textdateien eingeschlossen) lesen, maskiert werden, wobei das Manual an dieser Stelle etwas schwammig ist, bzgl. der betroffenen Funktionen. Beide Einstellungen sind übrigens als deprecated eingestuft.

Ich würde mich nicht lange damit aufhalten, den Hoster zu kontaktieren. Frag einfach mit get_magic_quotes_gpc ab, ob diese Einstellung aktiviert ist. Wenn ja, wende stripslashes() auf die geposteten Daten an und maskiere beim Eintragen in die Datenbank mit mysql_real_escape_string(). Du kannst vorher nochmal mit phpinfo() prüfen, ob magic_quotes_runtime auch angeschaltet ist, obwohl mir das bis jetzt noch nicht über den Weg gelaufen ist.

Wenn Du die Daten auf Deiner Seite wieder ausgeben willst, maskiere sie mit htmlspecialchars(). Es gibt noch andere Sicherheitslücken als SQL-Injections ;).

LG
 
Du könntest ja auch mit bsp.
PHP:
if(isset($_POST["absenden"]))
{
    if(!eregi("^[a-zA-Z0-9_äöüÄÖÜ]+$",$_POST["nachricht"]))
    {
        // Optional nee Fehlerseite etc.
        die;
    }
    // hier der eintag usw..
Arbeiten.., ich weiß ja nicht genau was du vor hasst.. in den bsp.. sind alle Sonderzeichen icl. ;:,. usw.. gesperrt. evtl. Hilft das Dir ja auch schon weiter einzelne sachen wie . , kannst du ja nach beliben hinzufügen solange du nicht <> "" oder ' ' erlaubst müsstest du auf der sicheren Seite sein.

mfg Spikaner
 
Hi,

Danke, aber was willst du mit diesem letzten Satz sagen?

genau das, was da steht. Wenn Du das mit den Quotes hinbekommen hast, kannst Du ja mal spaßeshalber Folgendes in Dein Textfeld eingeben

<script type="text/javascript">alert("Oops!");</script>

und schauen, was passiert. Das Beispiel ist natürlich harmlos aber wenn Du das, was Deine Benutzer eintragen, unbehandelt wieder ausgibst, ist es z.B. möglich, fremden Javascript-Code in Deine Seite zu integrieren. Dieses Problem kannst Du umgehen, wenn Du htmlspecialchars() verwendest. Schau Dir die Funktion mal an.

LG
 
Hi,



genau das, was da steht. Wenn Du das mit den Quotes hinbekommen hast, kannst Du ja mal spaßeshalber Folgendes in Dein Textfeld eingeben

<script type="text/javascript">alert("Oops!");</script>

und schauen, was passiert. Das Beispiel ist natürlich harmlos aber wenn Du das, was Deine Benutzer eintragen, unbehandelt wieder ausgibst, ist es z.B. möglich, fremden Javascript-Code in Deine Seite zu integrieren. Dieses Problem kannst Du umgehen, wenn Du htmlspecialchars() verwendest. Schau Dir die Funktion mal an.

LG

Das ist klar. Es ging ja nur um das Einfügen in die Datenbank, nicht um das wieder ausgeben.
 
Zurück