Sicherheitskonzept für Eingaben?

BartTheDevil89

Devilution Media
ID: 87739
L
2 Mai 2006
3.960
103
Hi,

bin gerade dabei für ein System ein Sicherheitskonzept neu zu überarbeiten, weil das bisher nicht wirklich funktioniert hat.

Aber irgendwie hänge ich da grad fest. Also ich fass mal zusammen wie ich damit arbeite:

1. Zahlen
Bsp: 1,3,4,5,494894
Bearbeite ich einfach mit intval(), denn damit sollte ich ja jeglichen Manipulationen vorbeugen.

2. Begriffe
Bsp: send,delete
Wird mittels str_replace(' ','',$value); einfach alle Leerzeichen entfernt. Damit sollten ja alle Sicherheitsbedenken weg sein, oder?

3. Eingabefeld mit Leerzeichen
Bsp: Ich bin ein Titel mit ö ä und durchaus auch nem text ala "> oder sowas.
Bisher hab ich folgendes gemacht:

- Im Formular bei Fehlerausgabe oder so: htmlentities($value);
- Zum Speichern: Insert into... set spalte = 'addslashes($value)'....
- Beim Anzeigen: -

4. Textarea
Bsp: Halt normales Textfeld mit allem, was so geht, auch HTML, etc. wie beispielsweise hier im Textfeld vom Forum.
Bisher hab ich folgendes gemacht:

- Im Formular bei Fehlerausgabe oder so: htmlentities($value);
- Zum Speichern: Insert into... set spalte = 'addslashes($value)'....
- Beim Anzeigen: -

Ist mit sicherheit nicht vollständig, aber hoffe ihr könnt mir da noch auf die Sprünge helfen. :p
Danke
 
1. Zahlen
Bsp: 1,3,4,5,494894
Bearbeite ich einfach mit intval(), denn damit sollte ich ja jeglichen Manipulationen vorbeugen.
Alternativ kannst du hier mit is_numeric() prüfen, ob das was in nem String ist einer Zahl entspricht (ist somit auch nicht auf Integer beschränkt).

- Zum Speichern: Insert into... set spalte = 'addslashes($value)'....
Um Usereingaben sicher in Mysql-Querys einzubauen gibts die Funktion mysql_real_escape_string().

- Beim Anzeigen: -
Inwiefern Anzeigen? Wenn du es im HTML-Kontext anzeigen willst, würde ich hier auch htmlentities() drauf loslassen.

Gruß
Claudi
 
Weitere Möglichkeit bei POST oder GET Werten:

alles was über GET und POST kommen kann, wird in einem
$_post, $_get = array();

$_post = $_POST;
$_get = $GET;

unset( $_POST, $_GET );

$chk_p = array( "delete", "..." , ...); //post
$chk_g = array( "bla", "bar", "foo" ); //get

und dann prüfen mit in_array( $_get[$value], $chk_g ) oder so

Somit können keine unerwünschten werte über get oder post benutzt werden, um irgendwas auszutesten!
 
bin gerade dabei für ein System ein Sicherheitskonzept neu zu überarbeiten, weil das bisher nicht wirklich funktioniert hat.
Never Trust the Input !

Was du in deinem Ansatz beschreibst ist ein Blacklist-Ansatz, du versuchst böse Eingaben zu löschen, das Problem dabei ist aber, dass der Ansatz schon vom Grundansatz löchrig ist.
Was du wirklich tun musst ist einen Whitelist-Ansatz zu verfolgen, du prüfst also ob die Eingabe nur genau das beinhaltet, was es auch sein darf.

Zusätzlich musst du natürlich auch die Daten sicher an andere Subsysteme (Ausgabe, Datenbank, Email) weiterleiten und dabei dafür sorgen, dass kein schadhafter Content ausgeliefert wird.
Also mysql_real_escape_string oder Prepared Statements, htmlspecialchars (mit Charset-Angabe!) usw

PHP-Sicherheit: PHP/MySQL-Webanwendungen sicher programmieren kaufen und lesen, Sicherheit ist ein komplexes Thema und sollte nie halbherzig betrieben werden.
 
Ich besitze beide ;)

Also das PHP-Sicherheit geht wirklich auf sehr viele genaue Details zu PHP ein, das Buch sichere Webanwendungen ist dabei allgemeiner und geht mehr auf generelle Web-Sicherheitsbedenken ein, also erstmal zum 1. greifen und danach erst das 2.