zum Thema Sicherheit
Das wichtigste vorweg, ich traue nie den Daten die du von User erhältst. Aber das solltest ihr ja schon wissen.
Also was sicher gefiltert werden muss sind HTML und SQL Elemente also grösser und kleiner als und Anführungzeichen, am besten gleich ersetzten mit < > usw.
Ich hoffe GN kann die ganzen Zeichen auch alle richtig darstellen.
Ich habe es bei mir so gelöst. Alle Daten welche vom Benutzer übergeben werden. Egal ob GET POST COOKIE oder SESSION durchlaufen erst einen Filter der genau diese Zeichen rausholt.
Das ist eine Grundfunkion welche ich immer direkt nach dem setzen er Headerdaten aufrüfe:
Wenn man keine Sessions oder Cookies verwendet kann man den ganzen Teil dazu natürlich auch weglassen.
while (list($key,$value) = each($_GET)) {
$_GET[$key] = filterbase($_GET[$key]);
}
while (list($key,$value) = each($_POST)) {
$_POST[$key] = filterbase($_POST[$key]);
}
while (list($key,$value) = each($_SESSION)) {
$_SESSION[$key] = filterbase($_SESSION[$key]);
}
while (list($key,$value) = each($_COOKIE)) {
$_COOKIE[$key] = filterbase($_COOKIE[$key]);
}
Die Filterfunktion sieht so aus (Ich übergebe Teils auch Array Sessions, daher der Array Zusatz):
function filterbase($value) {
$trans = array ("<" => "<", ">" => ">", "\\'" => "'", "\\\"" => """, "&" => "&");
if(is_array($value)){ //Prüft ob Array
while (list($key,$avalue) = each($value)) { //Alle Arrayelemente einzeln Filtern
$value[$key] = strtr($value[$key], $trans); //Zeichen ersetzen
}
}
else{
$value = strtr($value, $trans); //Zeichen ersetzen
}
return $value;
}
Ohne diese Zeichen ist ein JS, HTML oder mySQL Angriff doch nur schwer möglich? Und in Texten die der User schreibt werden diese dann trotzdem vom Browser richtig dargestellt.
Einziges Manko ist, Text kann so in den Datenbankfeldern mehr Platz brauchen. Also ein Nickname Sak'Kra würde dann 13 statt 7 Zeichen lang. Ich lasse aber eh keine Sonderzeichen in Nicknamen zu von daher ist dies kein Problem bei mir.
Zusätzlich verwendete bis jetzt immer addslashes zum implementieren in SQL Statmends. Ich habe aber dies wegen dieses Threads nun in mysql_real_escape_string geändert.
Reicht diese Sicherheitsmassnahmen oder was meint Ihr?