Sicherheitslücken finden & beheben

Cherrywine

Mitglied
Hallo,

mh, nachdem ich vor einiger Zeit angefangen habe, mich in PHP und MySQL einzuarbeiten, setze ich Einiges davon auf meiner Website ein und will diese nun natürlich so sicher wie möglich machen.

Neben vielem Gegoogle habe ich auch den entsprechenden festgepinnten Thread hier im Forum gelesen; ein paar Fragen stellen sich mir als PHP-Neuling dann doch, die ich über's Suchen nicht lösen konnte (bzw. wo mich das Gefundene dann mehr verwirrt hat, als dass es mir etwas gebracht hätte ;) ).

Meine Seite liegt bei allinkl.com, sodass ich keinen Zugriff auf die php.ini habe. Nun wollte ich den Support anschreiben, ob sie die register_globals sowie allow_url_fopen auf off stellen können - hat jemand Erfahrung, ob das bei allinkl einfach so möglich ist?
Sollten dort noch andere Einstellungen ggf. deaktiviert werden?
Was die korrekte Konfiguration von open_basedir angeht, bin ich mir nicht sicher, wie diese aussehen sollte (dies wurde in dem Artikel Writing Secure PHP erwähnt).

Die Verbindung zur DB stelle ich über eine Datei her, die dann jeweils includet wird.
Setze ich da ans Ende einfach ein
Code:
unset($a, $b, $c, $d);
(als Variable halt Name, PW etc.), oder kann man noch mehr tun, um dies sicherer zu machen?


LG
Cherrywine
 
Dadurch, dass bei all-inkl, sowie bei den meisten 'normalen' (also zu humanen Preisen) Anbietern mehrere User ihren Webspace auf einem Server teilen, werden sie wohl eher nicht diverse Einstellungen in der php.ini ändern, da sonst die 49 anderen User, die ihren Webspace dort liegen haben, evtl. anfangen zu meckern, warum das und das denn plötzlich nicht mehr geht.

Einzige Lösung wäre, seinen Webspace dort hinzulegen, wo man weiß, das man alleine auf dem Server ist. Das sind dann aber meistens Buissnes-Lösungen und dementsprechend auch um ein vielfaches teurer.

Du kannst bei all-inkl mach nachgucken, falls du nicht verstehst was ich mein ;)

unter http://all-inkl.de/?cna=webhosting siehst du die Paket-Vergleiche. Und dort die letzte Zeile vom ersten Absatz jeweils: "x Kunden je Server". Daran erkennst du das auch bei anderen Anbietern. Jedenfalls sollte das irendwo angegeben sein.
 
hej,

danke für deine Antwort. :)

Ja, ich weiß was du meinst, ich dachte halt, dass es evtl. mehrere Kunden mit so einem Wunsch gibt, sodass ein (oder mehrere) Server eben für solche "Extrawürste" ;) konfiguriert wird/werden und diese Kunden dort zusammengelegt werden.
Aber vermutlich lohnt sich das nicht.

Einen Server für mich alleine zu mieten, übersteigt dabei mein Budget --> arme Studentin. ;)

Hmm, danke auf jeden Fall.



LG
Cherrywine
 
also wenn du dein Projekt richtig codest, stelt auch register_globals und allow_url_fopen kein Problem dar ;)
schalte das Error-Reporting erstmal auf E_ALL sollten NIRGENDS notices über undefined variables kommen, gibt es auch mit register_globals on kein Problem ;)
Und gegen das andere Problem arbeitest du mit einer Whitelist so dass erst nichts von ausßerhalb included werden kann, wass ich auch sehr empfehlen kann bei Frontcontrollern nach dem Motto: index.php?art=main&step=home definieren dass main und home nur alphanumerisch sein dürfen, so ist ein remote-include zb überhaupt nicht möglich

Edit: was du an Problem von Sicherheitslücken beschrieben hast ist minimal ;) Da kommen ja noch XSS, SQL-Injection, Remote-File-Inclusion etc etc etc hinzu
Zum finden kann ich von Mayflower (einer der bekanntesten deutschen PHP-Firmen) den Chorizo-Scanner empfehlen, aber nur mit der Morcilla-Extension ist der wirklich richtig gut und genau
 
Zuletzt bearbeitet:
Ich würde die Datenbank-Variablen als Konstante mit define("Name", "Wert"); verwenden. So kann die niemand mehr überschreiben durch Cross-Site-Scripting!
 
Gerade bei all-inkl gefunden, unter "gut zu wissen":

Kann ich „php_flag register_globals“ in der php.ini auf „off“ setzen?

Einen Zugriff auf die php.ini Datei haben Sie nicht. Es besteht aber die Möglichkeit, dass Sie durch das Eintragen in die .htaccess-Datei (diese muss im Hauptverzeichnis der Domain abgelegt werden) bestimmte Vorgaben der php.ini für Ihre Domain überschreiben lassen. Der entsprechende Eintrag lautet: php_flag register_globals off

;) Linaloya
 
register_globals ist doch eigentlich von hause aus auf "off" *glaub*

Zum Thema Seite absichern:
traue NIEMANDEM, wenn Du über $_GET und/oder $_POST Daten empfängst.
Am besten, Du versuchst soviel wie möglich auf konstante Werte zu setzen,
indem Du am Funktions-Beginn eine $_GET/$_POST variable erstmal "zerpflückst"
bzw erwartete Werte Definierst.

Beispiel:
Du erwartest ein include im Sinne von "socialbookmarking.php", an dieses File könnte man (vorrausgesetzt jemand weiss, was Du für Variablen-Namen nutzt) einen weiteren Query-String anhängen und somit Daten manipulieren.
DAS kannst Du zB umgehen, indem Du vordefinierst, was Dich dort erwarten könnte:

PHP:
$file = isset($_GET['url']) ? $_GET['url'] : NULL;
$ok = NULL;
switch ( $file ) {
  case "socialbookmarking.php": $ok=1; break;
  case "schriftarten.php": $ok=1; break;
}

if( $ok ) {
  include_once($file);
}
else
  include_once('error.php');

Zahlenwerte wandelst Du am besten IMMER mit intval($_GET['id']) um, damit Du auch hier sicher sein kannst, dass keine Zeichenkette gesendet wurde.
Ist aber jetzt nur die Grundidee - natürlich kann man das noch etwas mehr ausbauen

#### EDIT
Dein Email-Kontakt wird nicht auf Leere Eingaben geprüft,
im IMPrint steht Deine blanke Mail-Addi, diese solltest Du besser in ein Bild packen oder gegen einen ASCII-HEX-Code austauschen, da es sehr viele Bots gibt, die Webseiten nach Adressen zukm spammen durchsuchen. Wie das geht erfährst Du auf http://gulli.com
 
Zuletzt bearbeitet:
hallo,

danke für eure Antworten! :)

Die Sache mit der blank angegeben Emailadresse und dem Überprüfen auf leere Eingaben im Kontaktmailer habe ich gefixt, hat mir soweit auch eingeleuchtet, wie das zu bewerkstelligen war.

@ Linaloya:
danke :)

@ tobias_petry:
SQL-Injections und XSS sind afaik bei mir nicht möglich, da ich den Usern nirgendwo die Möglichkeit biete, irgendetwas in die DB einzutragen. Oder liege ich da falsch, geht das trotzdem?

(als Übersicht:
PHP setze ich momentan ein, um im Kontaktmailer Daten per Mail an mich zu schicken (läuft also nicht über die DB), um die Header- und Footerdateien (also den sich auf allen Seiten gleichbleibenden Teil) in den einzelnen Unterseiten zu includen, um die Inhalte der einzelnen Bereiche zu zählen sowie die Klicks auf einzelner Unterseiten.)

Die Variablen der DB habe ich versucht, via define() sicherer zu machen, das hat noch nicht ganz geklappt, aber da bin ich noch dran. ;)

@ andy72:
da blicke ich jetzt zugegebenermaßen nicht ganz durch.
In dem von dir geposteten Code müsste ich dann als Case doch entweder _nur die socialbookmarking.php aufführen (wenn ich das bei jedem einzelnen Include so einzeln festlege), oder _sämtliche Unterseiten (wenn ich das generell für die komplette Seite festlege). Oder? ?(



LG
Cherrywine
 
So gesehen ja -du müsstest in jedem Case die datei angeben. Umden Schutz jedoch besser zu gestalten, könntest Du anstelle des Querstrings "url=dateiname" lieber "url=1","url=2" etc schreiben - somit weiss keiner,was auf deinem Server passiert.

in den Case-Anweisungen machst Du das dann so:
case 1: include_once('datei1.php'); break;
case 2: include_once('datei2.php'); break;

Somit kann keiner versuchen,deine Include-Files zu attackieren.
 
Zurück