PHP - mySQL - Injections, Schadcode verhindern?
Hallo zusammen,
ich beschäftige mich gerade ein wenig mit php und mysql.
Überall sind zwar nette Tutorials, aber irgendwie fehlt mir da noch ein "Klick".
Es geht sich am Ende um Sicherheitsaspekte, Injectionverhinderung und sowas.
Habe da einiges gelesen von mysql_real_escape_string und stripslashes, aber irgendwie komm ich mit der Anwendung nicht ganz klar.
Minimieren wir mal mein Problem auf folgendes:
Bitte haut mich jetzt nicht, wenn ich irgendwo etwas syntaktisch falsch habe, es ist mehr oder weniger pseudo-code
Es gibt eine Tabelle mit Artikeln und Preisen (beide Felder sind vom typ varchar):
Produkt A 1,50 €
Produkt B 2,95 €
...
mit
SELECT name, preis FROM artikelliste
bekomme ich die Liste aller Produkte und kann mir diese darstellen
Über ein normales Formular lassen sich neue Artikel einfügen
<form accept-charset="utf-8" action="'.$_SERVER['PHP_SELF'].'" Method="post">
Name: <input type="text" name="name"><br>
Preis: <input type="text" name="preis"><br>
<input type="submit" value="Eintragen">
</form>
-->
INSERT INTO artikelliste (name, preis)
VALUES ('$_POST['name']', '$_POST['preis']')
klappt prima.
(ähnlich mit dem UPDATE von artikeln, für Namens und/oder Preisänderungen)
Da es jetzt hier ein Eingabefeld für Benutzereingaben gibt, benötige ich doch etwas, um die Benutzereingaben zu "filtern", um Schaden zu vermeiden?
Jetzt dehne ich das mal ein wenig aus und verlasse diese simple Liste und denke u.a. an Eingaben, die sql-code enthalten oder andere scripte, oder alleine schon Hochkommata, wodurch diverser weiterer Code fehlerhaft werden könnte.
Klar, das ist jetzt kein Login, wo man mittels injection sich Zugriff erschleichen könnte, aber es ist ein Eingabeformular.
Welche Funktionen (mysql_real_escape_string, stripslashes, htmlentities oder ähnliches) muss ich jetzt WANN und AN WELCHER STELLE genau am besten einsetzen?
Ich steh da ein wenig auf dem Schlauch, vielleicht könnt ihr mir ja schon recht simpel helfen.
Schöne Grüße
ich beschäftige mich gerade ein wenig mit php und mysql.
Überall sind zwar nette Tutorials, aber irgendwie fehlt mir da noch ein "Klick".
Es geht sich am Ende um Sicherheitsaspekte, Injectionverhinderung und sowas.
Habe da einiges gelesen von mysql_real_escape_string und stripslashes, aber irgendwie komm ich mit der Anwendung nicht ganz klar.
Minimieren wir mal mein Problem auf folgendes:
Bitte haut mich jetzt nicht, wenn ich irgendwo etwas syntaktisch falsch habe, es ist mehr oder weniger pseudo-code
Es gibt eine Tabelle mit Artikeln und Preisen (beide Felder sind vom typ varchar):
Produkt A 1,50 €
Produkt B 2,95 €
...
mit
SELECT name, preis FROM artikelliste
bekomme ich die Liste aller Produkte und kann mir diese darstellen
Über ein normales Formular lassen sich neue Artikel einfügen
<form accept-charset="utf-8" action="'.$_SERVER['PHP_SELF'].'" Method="post">
Name: <input type="text" name="name"><br>
Preis: <input type="text" name="preis"><br>
<input type="submit" value="Eintragen">
</form>
-->
INSERT INTO artikelliste (name, preis)
VALUES ('$_POST['name']', '$_POST['preis']')
klappt prima.
(ähnlich mit dem UPDATE von artikeln, für Namens und/oder Preisänderungen)
Da es jetzt hier ein Eingabefeld für Benutzereingaben gibt, benötige ich doch etwas, um die Benutzereingaben zu "filtern", um Schaden zu vermeiden?
Jetzt dehne ich das mal ein wenig aus und verlasse diese simple Liste und denke u.a. an Eingaben, die sql-code enthalten oder andere scripte, oder alleine schon Hochkommata, wodurch diverser weiterer Code fehlerhaft werden könnte.
Klar, das ist jetzt kein Login, wo man mittels injection sich Zugriff erschleichen könnte, aber es ist ein Eingabeformular.
Welche Funktionen (mysql_real_escape_string, stripslashes, htmlentities oder ähnliches) muss ich jetzt WANN und AN WELCHER STELLE genau am besten einsetzen?
Ich steh da ein wenig auf dem Schlauch, vielleicht könnt ihr mir ja schon recht simpel helfen.
Schöne Grüße
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 288703
Url: https://administrator.de/contentid/288703
Ausgedruckt am: 22.11.2024 um 14:11 Uhr
3 Kommentare
Neuester Kommentar
Moin,
Am besten gewöhnst du dir das direkt verwenden von $_POST und $_GET wieder ab und machst in etwa sowas
und verwendest ab da dann nur noch $SAFE_POST und $SAFE_GET
Oder du verwendest PDO - das ist die modernere Lösung
Zusätzlich kann ich dir auch noch das hier als Lektüre empfehlen.
lg,
Slainte
Welche Funktionen (mysql_real_escape_string, stripslashes, htmlentities oder ähnliches) muss ich jetzt WANN und AN WELCHER STELLE genau am besten einsetzen?
Am besten gewöhnst du dir das direkt verwenden von $_POST und $_GET wieder ab und machst in etwa sowas
foreach($_POST as $key => $value) {
$SAFE_POST[$key]=mysql_real_escape_string($value))
}
foreach($_GET as $key => $value) {
$SAFE_GET[$key]=mysql_real_escape_string($value))
}
Oder du verwendest PDO - das ist die modernere Lösung
Zusätzlich kann ich dir auch noch das hier als Lektüre empfehlen.
lg,
Slainte
Welche Funktionen muss ich jetzt WANN und AN WELCHER STELLE genau am besten einsetzen?
mysql_real_escape_string
IMMER vor dem Insert in die Datenbank, weil es gegen SQL Injection schützt.stripslashes
NIE, außer dein PHP ist so alt, dass es noch mit DM rechnet htmlentities
IMMER vor dem Ausgeben an den Browser, weil es gegen XSS schützt.Aber
mysql_real_escape_string
solltest du dir lieber auch erst gar nicht angewöhnen, die Funktion ist nämlich (wie alle mysql_*
funktionen) deprecated und mit Prepared Statements lässt sich das Problem viel unkomplizierter, mit geringerem Aufwand, lesbarer und sicherer lösen.Klar, das ist jetzt kein Login, wo man mittels injection sich Zugriff erschleichen könnte, aber es ist ein Eingabeformular.
Versuch erst gar nicht abzuschätzen, was jemand vielleicht damit erreichen könnte – es kommt immer schlimmer, wenn eine Injection-Lücke erstmal da ist.
Mein Lieblingsbeispiel ist da Stefan Esser, der über eine SQL-Injection Lücke, mit der man die Sortierung der Kommentare in einer Blog-Software beeinflussen konnte, alle Passwörter aus der Datenbank geklaut hat.
Zitat von @DeeJayBee:
Klar, das ist jetzt kein Login, wo man mittels injection sich Zugriff erschleichen könnte
Klar, das ist jetzt kein Login, wo man mittels injection sich Zugriff erschleichen könnte
Sicher?
Es kommt auch darauf an mit welchen Rechten der Benutzer für das Formular ausgestattet ist.
Hat der Benutzer in der DB alle Rechte, dann Gute Nacht!
PS: Ich beschäftige mich nämlich auch gerade mit diesem Thema.