Sichere PHP Anwendung

Hallo,

hab schonmal bisschen rumgegoogelt zu dem Thema.

Wollte dennoch mal ein bisschen rumfragen,
wie man seine PHP Anwendungen inkl. Userverwaltung & Login programmiertechnisch & Konfigurationstechnisch dicht gegen XSS, SQL Injection, Datendiebstahl/identitätsklau und anderen Angriffe macht.

1. würde ich jede Get/Post-Eingabe durch diese Funktion schicken:

Code:
function secure_form($data) {
	 return strip_tags(mysql_real_escape_string(trim(stripslashes($data))));
}

2. jede Ausgabe aus einer Datenbank mit htmlspecialchars() versehen.

3. Dateien nicht "direkt" includen, sondern über Aliase mit Switch/Case Anweisung.

4. Loginpasswörter nicht im Klartext, sondern gehasht speichern

5. Loginsystem etc. über $_Session[]

6. SSL Verschlüsselt

7. http://www.heise.de/security/Grundsicherung-fuer-PHP-Software--/artikel/96564/3

8. Allgemein so wenig wie möglich Daten beim Client speichern


Setzt die Liste fort ;)
Würdet ihr in der Funktion bei 1. noch was hinzufügen, was ich vergessen habe?

Danke für eure Hilfe
 
ich arbeite mit nem ganzen haufen vhosts im apache, und da override ich gerne noch ein paar php sachen damit ich die nicht global setzen muss. kleines beispiel:

<VirtualHost *:80>
ServerName a.b.c
DocumentRoot /a/b/c
php_admin_flag allow_url_fopen off
php_admin_value open_basedir /a/b/c
php_admin_flag safe_mode on
php_admin_flag safe_mode_gid on
</VirtualHost>

Eventuell kannst du damit noch was anfangen (auch wenns nicht ganz zum thema gehört isses manchmal praktisch ^^)
 
Warum nicht (1) und (2) zusammenfassen:
Code:
function secureDataFromUnsecureSource($data) {
  $data=trim(htmlentities($data,ENT_QUOTES));
  if(!get_magic_quotes_gpc())$data=mysql_real_escape_string($data);
  return $data;
}

- Du könntest strike Typen nutzen. D.h. wenn das Datenbankfeld einen Integer-Wert benötigt, übergibst du ihm nur einen Integerwert. Stichwort ist hier casten: $intWert=(int)$charWert;

- Desweiteren wären PHP Data Objects für Datenbankabfragen interessant, da man hier über Bindparam auch relativ einfach absichern kann

- Eine weitere Möglichkeit wäre die Nutzung von mod_secure gegen unzulässige Eingaben.
 
Ich benutze folgende Zeilen gegen SQL-Injection :

Code:
$ArrayList = array("_GET", "_POST");
foreach($ArrayList as $gblArray) {
	$keys = array_keys($$gblArray);
	foreach($keys as $key) {
		mysql_escape_string(${$gblArray}[$key]);
		strip_tags(${$gblArray}[$key]);
		@$$key = trim(${$gblArray}[$key]);
	}
}
 
@xeno: Danke, naja sowas in die Richtung habe ich schon auch mit gemeint =)

Original von fetzer
Warum nicht (1) und (2) zusammenfassen:
Code:
function secureDataFromUnsecureSource($data) {
  $data=trim(htmlentities($data,ENT_QUOTES));
  if(!get_magic_quotes_gpc())$data=mysql_real_escape_string($data);
  return $data;
}

das wäre schon auch möglich,
allerdings kann man die Daten aus der Datenbank ja dann nicht mehr ohne weiteres außerhalb von der Webapplikationen verwenden.
Zum Beispiel in einem C/C++ Programm.
Kommt dann halt darauf an, ob man das muss.

Danke schonmal für die schnellen Antworten,
immer weiter so ;)
 
hier nochmal der Link zu meinem Vortrag, den ich neulich in Internet Technologie gehalten habe:
http://studium.cs-bergann.de/inet/phpsecurity/

dort sind ein paar Szenarien aufgezählt (unsicherer Code + Kommentare, wie sich der Code ausnutzen lässt + Tipps, wie man sowohl programmier-technisch als auch konfig-technisch mehr Sicherheit erreichen kann)

es ist zwar auch nur ganz an der Oberfläche gekratzt (man könnte ja über jede PHP-Konfiguration und ihre Auswirkungen oder über jeden Angriffs-Typ etc. jeweils nen Vortrag halten...), aber vieleicht hilft's dir oder dem ein oder anderem...
 
Wären die Funktionen nicht alle außer Kraft gesetzt wenn man Zeichensätze verwendet,
die von den Funktionen nicht unterstützt werden?

Das wäre zwar am Ende ne ziemliche Frickelarbeit, aber es gibt ja genug Leute mit viel Zeit =)

Kann man mit PHP einen bestimmten Eingabe-Zeichensatz erzwingen bzw. konvertieren?
 
Original von boehmi
Gibt es eigentlich mittlerweile einen offiziellen Release-Termin für PHP6 ?
Ich konnte nirgends verlässliche Angaben finden.
Mit PHP6 sollten diese Zeichensatz-Probleme ja eigentlich gelöst sein.

Was haltet ihr hiervon?:
http://www.hardened-php.net/home.8.html

Was für Zeichensatz Probleme? Bitmuncher hat doch alles gesagt.

Suhosin läuft mittlerweile auch bei mir auf dem Server und es tut seinen Dienst.
Wie man es richtig installiert wurde mir hier im Habo schon erklärt siehe Boardsuche.

LG,weau
 
1. würde ich jede Get/Post-Eingabe durch diese Funktion schicken:

Code:
function secure_form($data) {
	 return strip_tags(mysql_real_escape_string(trim(stripslashes($data))));
}
viel userstörendes sinnloses. nimm strip_tags raus. ob stripslashes trotz mysql_real_escape_string wirklich nützlich ist, weiß ich nicht.
2. jede Ausgabe aus einer Datenbank mit htmlspecialchars() versehen.
Jopp. Wie gesagt: Um Speicher zu sparen erst bei der ausgabe!
3. Dateien nicht "direkt" includen, sondern über Aliase mit Switch/Case Anweisung.

4. Loginpasswörter nicht im Klartext, sondern gehasht speichern
Für Anfänger die das genauer haben wollen: md5() und sha1() helfen ;)
5. Loginsystem etc. über $_Session[]
Mache ich auch, obwohl ich mittlerweile einen (auch wenns evtl. unsinnig ist) Loginhash aus Zeit, Username und anderen Daten in Session/Cookie und Datenbank speichere und dann gegenprüfe. Da kann der User den Hash ruhig sehen, soller doch den Algorythmus erraten :P
6. SSL Verschlüsselt
Bietet leider nicht jeder Server.
Schöner Artikel!
8. Allgemein so wenig wie möglich Daten beim Client speichern
Kommt finde ich auf die Daten an
 
Zurück
Oben