deejaybee
Goto Top

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

Content-ID: 288703

Url: https://administrator.de/contentid/288703

Ausgedruckt am: 22.11.2024 um 14:11 Uhr

SlainteMhath
SlainteMhath 18.11.2015 um 15:52:59 Uhr
Goto Top
Moin,

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))
}
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
dog
dog 20.11.2015 um 21:49:04 Uhr
Goto Top
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 face-wink

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.
Oli-nux
Oli-nux 28.07.2016 um 13:47:22 Uhr
Goto Top
Zitat von @DeeJayBee:
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. face-wink
Hat der Benutzer in der DB alle Rechte, dann Gute Nacht!

PS: Ich beschäftige mich nämlich auch gerade mit diesem Thema. face-cool