Allgemein: Wie PHP&MySQL sicher machen?
Chris
- php
Hi, ich habe einmal eine ganz allgemeine Anfrage.
Der Hintergrund ist, dass ich immer so für mich gearbeitet habe, wenig auf Sicherheit geachtet und mir dann plötzlich große Probleme eingefangen habe.
Daher möchte ich, bevor ich meine neuen Seiten online stelle, da doch vorher mal drüber nachgedacht haben ^^.
Mein Haupt"problem" ist, dass ich eine einzige PHP-Seite habe, die beim Aufruf und bei Links einfach unterschiedliche Parameter in der Adresszeile angehängt bekommt, und dann entsprechend reagiert und (!) Daten aus einer MySQL-Datenbank holt.
-> Was muss ich dabei beachten? Wo sind die Gefahren, wo kann man mein System angreifen? Habe mal gehört, dass es möglich sei, durch geschickte Parameterübergabe die ganze MySQL-DAtenbank zu löschen :-(
Wie mache ich das alles HAcker-Sicher??
Wäre auch über gute Links sehr sehr dankbar !!!
Greets & Thanks,
Chris
hi,
-> Was muss ich dabei beachten? Wo sind die Gefahren, wo kann man mein System angreifen?
Überall dort, wo es auf unerwartete Parameter trifft, bzw. gar nicht merkt, dass diese sich ausserhalb des "normalen" bewegen.
Also definiere dir vorher klipp und klar, welche Parameter du erwartest - und überlege dir, wie du die Werte darauf abprüfst, und alles andere dann ablehnst.
Habe mal gehört, dass es möglich sei, durch geschickte Parameterübergabe die ganze MySQL-DAtenbank zu löschen :-(
Das Stichwort, über dass du dich informierst, lautet SQL Injection.
gruß,
wahsaga
hi,
Das Stichwort, über dass du dich informierst, lautet SQL Injection.
kann man das nicht einfach durch 'htmlspecialchars()' unmöglich machen? man will ja sowieso kein html im passwort oder im username, und auch sonst nie html das der anwender eingegeben hat.
hab ich mich nur mal so gefragt...
Hallo Timon,
Das Stichwort, über dass du dich informierst, lautet SQL Injection.
kann man das nicht einfach durch 'htmlspecialchars()' unmöglich machen? man will ja sowieso kein html im passwort oder im username, und auch sonst nie html das der anwender eingegeben hat.
Nein, du musst mindestens auch noch mysql_real_escape_string() verwenden, wenn du Daten in eine MySQL-Datenbank einträgst. Schließlich könnte sonst SQL-Code in dem Text stehen und somit deine Datenbank manipuliert werden.
Die wichtigstens Dinge, die mir im Moment einfallen sind
* Alle Variablen vor der Verwendung instantiieren
* Traue keinen Daten, die du von einem Benutzer erhalten hast. Überprüfe immer, ob die Daten in der korrekten Form vorliegen. Du kannst dich nicht darauf verlassen, dass Angaben in HTML wie maxlength, etc. vom Benutzer nicht ignoriert werden.
* Escape Daten, bevor du sie an weitere Anwendungen (Datenbank) weiterreichst oder ausgibst (als HTML, etc.)
* Achte darauf, dass der Benutzer keinen Zugriff auf Daten bekommen kann, auf die er keinen Zugriff haben soll
Schöne Grüße,
Johannes
Hallo Timon
hallo,
was ist aber, wenn ich die daten so eintrage:
$pass = htmlspecialchars($_POST['passwort']);
$query = mysql_db_query(***,"insert into user (
passwort
) values (
'$pass'
)");
oder so abfrage:
$pass = htmlspecialchars($_POST['passwort']);
$query = mysql_db_query(***,"select * from user where passwort = 'pass'");
müsste der interpreter dann den string nicht unweigerlich als 1 string sehen? wo genau kann es da probleme geben? wie kann man sich da falsch einschleusen?
hab noch vergessen zu sagen, dass ich bei htmlspecialchars nooch ENT_QUOTES als zweites attribut einfüge.
echo $begrüßung;
was ist aber, wenn ich die daten so eintrage:
$pass = htmlspecialchars($_POST['passwort']);
$query = mysql_db_query(***,"insert into user (passwort) values ('$pass')");
Welche Zeichen behandelt htmlspecialchars() in der Form, in der du es verwendest? < > & "
Was ist mit ' ? Was ist, wenn Passwörter 8 Zeichen lang sein sollen, das Feld in der DB genau 8 Zeichen aufnehmen kann und du htmlspecialchars() auf einen String mit einem " anwendest? Dann bleiben noch genau zwei Zeichen übrig, der Rest wird abgeschnitten.
> oder so abfrage:
> ~~~php
$pass = htmlspecialchars($_POST['passwort']);
> $query = mysql_db_query(***,"select * from user where passwort = 'pass'");
müsste der interpreter dann den string nicht unweigerlich als 1 string sehen? wo genau kann es da probleme geben? wie kann man sich da falsch einschleusen?
' OR 1 OR '
ergibt dann select * from user where passwort = '' OR 1 OR ''
echo "$verabschiedung $name";
echo $begrüßung;
Welche Zeichen behandelt htmlspecialchars() in der Form, in der du es verwendest? < > & "
echo "$verabschiedung $name";
hallo,
htmlspecialchars ($derstring,ENT_QUOTES) ??? damit müsste es gehen,oder?
echo $begrüßung;
Welche Zeichen behandelt htmlspecialchars() in der Form, in der du es verwendest? < > & "
htmlspecialchars ($derstring,ENT_QUOTES) ??? damit müsste es gehen,oder?
Nein, damit geht es auch nicht, weil du noch weitere Zeichen übersehen hast, die in einem SQL-String nichts verloren haben. Warum willst du unbedingt mit htmlspecialchars() dein Passwort verunstalten, wenn es mit mysql_real_escape_string() wesentlich geeigneter und ohne Nebenwirkungen entschärft werden kann?
echo "$verabschiedung $name";
echo $begrüßung;
Das Stichwort, über dass du dich informierst, lautet SQL Injection.
kann man das nicht einfach durch 'htmlspecialchars()' unmöglich machen?
Nein, kann man nicht, da htmlspecialchars() im Normalfall kein ' kodiert und außerdem noch andere Zeichen nicht berücksichtigt, die in einem SQL-String-Wert besonders gekennzeichnet werden müssen. Außerdem ist es sehr ungünstig, beispielsweise ein " statt eines " in der Datenbank stehen zu haben, weil es Berechnungen wie die Ermittlung der String-Länge unmöglich macht. " hat 6 Zeichen, " ist nur eins. Außerdem sind die Daten dann nicht mehr geeignet, an andere Medien als HTML ausgegeben zu werden.
man will ja sowieso kein html im passwort oder im username, und auch sonst nie html das der anwender eingegeben hat.
Die Frage lautet: _Wo_ will man das HTML nicht haben? Im HTML-Code der eigenen Seite will man das nicht haben, weil das die Seite verunstaltet und zu XSS führen kann. Aber in der Datenbank ist HTML-Code unschädlich.
Generell ist es einfach und übersichtlich, solange wie möglich mit Rohdaten zu arbeiten und Kodierungen und Maskierungen erst dann vorzunehmen, wenn die Daten in einen anderen Kontext (in ein SQL-Statement, in HTML-Code, usw.) gebracht werden müssen. Dann sollte man aber die zum Kontext passende Kodierung/Maskierung verwenden.
echo "$verabschiedung $name";
Hi,
Das Stichwort, über dass du dich informierst, lautet SQL Injection.
Danke für den Tipp, das ist genau das, was ich suchte ! :)
Chris