PHP/MySQL Security-Frage - reicht das an Sicherheit?

x3008x

Mitglied
Hallo an mein Lieblingsboard (ja ich weiß Schleimer und so aber es ist wirklich mein Lieblingsboard)

Beschäftige mich doch seit letzter Zeit was mehr mit dem Thema Sicherheit...
Also die größten Themen die mir dazu einfallen sind eigentlich XSS-Angriffe und SQL-Injections...

So nun habe ich mit vielen Funktionen und Codes (also Scripte) meine Seite getestet.
Klar was raus kam war natürlich dass meine Seite angreifbar war, weil ich nur die SQL-Abfragen per mysql_real_escape_string(xxx) gesichert hatte.
Dass man aber zb. nur durch ein Input welches als Value den eigenen Inhalt enthält Javascript ausführen kann war mir garnicht bewusst.
Also habe ich viel ausprobiert wie htmlentites usw...

Meine Endlösung für das Thema ist jetzt eigentlich eine komplett eigene Funktion die alle möglichen Zeichen in den HTML-Code &#..; umwandelt...

zum beispiel < in &lt;
Insgesamt habe ich wirklich alle Zeichen umgewandelt...
Also ! " § $ % & / ( ) = ? ` ´ * # ' ; usw.......
Diese Funktion habe ich auf ALLE POST und GET Werte gesetzt. Und unter anderem auch auf $_SERVER['HTTP_USER_AGENT'] usw... Denn man kann ja eigene Werte für die Browser-Identifikation benutzen (in manchen Browsern)

Mein Resultat:
Alle getesteten Codes wurden entschärft... das gute daran ist dass der code optisch, zb. als input value sich nicht verändert (durch den html-code).

-- An dieser Stelle möchte ich auch andere PHP-Programmierer auffordern die eigene Seite zu testen --

Die folgenden Codes könnt ihr auf eurer Seite testen, entweder in ein input Feld (zb. Kontakt-Formular) oder als GET-Werte, zb. meineseite.de/artikel?id=2 (statt 2 dann halt einen code):
<script>alert('XSS')</script>
oder
';alert(String.fromCharCode(88,83,83))//\';alert(String.fromCharCode(88,83,83))//";alert(String.fromCharCode(88,83,83))//\";alert(String.fromCharCode(88,83,83))//--></SCRIPT>">'><SCRIPT>alert(String.fromCharCode(88,83,83))</SCRIPT>
oder
><script>alert('CSS Vulnerable')</script><b a=a
a></a><script>alert('CSS Vulnerable')</script>
\'><script>alert%28\'CSS Vulnerable\'%29</script><
(Diesen Code müsste man aber in eine Textarea schreiben (zb. Text bei Kontakt)
Mehr zum testen hier: http://ha.ckers.org/xss.html

SQL-Injection testen:
Beispiel-Code unsicherer Login:
PHP:
$name = $_POST['name']; $pw = $_POST['pw'];
SELECT * FROM users WHERE name = '$name' AND pw = '$pw'


Gibt man nun beispielweise folgende Daten ein würde man den Login umgehen:
Name: Egal
PW: ' OR 'test' = 'test

Klar wenn man beispielsweise das Passwort per sha1 oder sonst was verarbeitet geht es nicht, aber beispielsweise eine Abfrage per ID (die über GET übergeben wird) haben wir das gleiche Problem... denn statt eine ID könnte ein sql-code und/oder sogar javascript eingeben werden der die SQL-Abfrage ändert, im schlimmsten Fall zB. Tabelleneinträge löschen, oder sogar Cookies (JS) auslesen usw...

Thema Sicherheit (vor allem XSS und SQL-Injections):
- http://www.heise.de/security/artikel/84149
- http://www.heise.de/security/artikel/96564/Grundsicherung-fuer-PHP-Software
- http://de.wikipedia.org/wiki/SQL-Injektion
- http://www.bsi.de/literat/studien/websec/WebSec.pdf
- http://www.ibm.com/developerworks/opensource/library/os-php-secure-apps/index.html

-----------------------------------------


So zurück zu mir, abgesehen von meiner Funktion habe ich noch per htacces folgende Werte gesetzt:
register_globals 0
display_errors 0

open_basedi zb. ist schon von meinem Provider aus auf mein Verzeichnis gesetzt.

Zum Thema Sicherheit in Sessions weiß ich leider noch nicht viel.
Meine Sessions werden wie folgt gesetzt:
1. User loggt sich ein mit Name + PW(pw wird per sha1 "verschlüsselt")
2. Bei erfolgreichem Login bekommt er als Session-ID seine User-ID aus der Datenbank
mit dieser wird dann gearbeitet, zb. profil bearbeiten usw.

Nun (endlich^^) zu meiner Frage:
Dass man 100%ige Sicherheit nicht haben kann ist klar, aber meint ihr das reicht fürs grobe an Sicherheit? Oder habe ich noch wichtige Punkte übersehen?
Und vorallem wer hat noch einen Tipp in Bezug auf Sessions für mich, weil diese sind ja so noch nicht abgesichert.

Ich freue mich sehr über eure Antworten und danke euch schon jetzt dafür.
x3008x
 
Zuletzt bearbeitet:
Eine universelle Funktion gibt es nicht, da jede Sprache seine eigenen Metazeichen hat. Deine „universelle“ Funktion mag zwar die Metazeichen der jeweiligen Sprache durch „Ungefährliches“ ersetzen, doch neben diesen ebena auch noch eine Menge anderer Zeichen, die in der jeweiligen Sprache keine Metazeichen sind. Das Resultat ist dann eine Verfälschung der Werte.

PHP bietet eigentlich für die wichtigsten Sprachen Funktionen zur Ersetzung oder Maskierung der jeweiligen Metazeichen. Man muss nur wissen, wann welche einzusetzen ist.
 
@ Gumbo:
Alle eingaben die über den User erfolgen können ruhig wie du schreibst verfälscht werden, da vom user kein code (zb. html) gebraucht wird (bei einem Forum wäre das wieder was ganz anderes).
Ausser natürlich der Login, der braucht natürlich die Originalwerte, diese gehen dann nicht durch meine Funktion sondern durch htmlentities und mysql_real_escape_string.

@Loomes:
Ich speichere NUR die ID des Users per Session, also weder Name noch Passwort ;)
 
„Mehr hilft mehr.“ Das ist das typische Verhalten eines jemanden, der nicht genau weiß, was er macht oder wozu es gut sein soll.

So kommt es, dass nicht selten Konstrukte wie folgende zu sehen sind:
PHP:
$foobar = htmlentities(addshashes(mysql_real_escape_string(strip_tags(trim($_GET['foobar'])))));
Dabei hat der Autor vermutlich gar keine Ahnung, was dabei überhaupt mit den Werten passiert.
 
@Gumbo: Also so übertreiben würde ich dann aber doch nicht ;)

Hab mich mittlerweile auf 10 Zeichen beschränkt (Aus htmlspecialchars und mysql_real_escape_string + 2 oder 3 extra)
Und da ich genau weiß welche Zeichen es sind kann ich das falls nötig auch in der weiteren Programmierung berücksichtigen. Ich denke mal das ist ok...

Vielen Dank @ ALL !

x3008x
 

Neue Beiträge

Zurück