[PHP] Einen String effektiv filtern

CPU

Lieutenant
Registriert
Jan. 2006
Beiträge
704
Hallo,

meine Frage ist recht einfach: Wie kann ich mit PHP die Benutzereingaben am effektivsten filtern vor Injections etc.?

Wie kann ich außerdem noch dafür sorgen, dass HTML-Quelltext, der in eine Datenbank eingetragen wird effektiv geschützt wird, aber nicht der Inhalt verändert wird?

CPU

P.S.: Hat jemand eine Ahnung, wo man eine (aktuelle) Bad-Word-Liste herbekommt bzw. eine Liste mit den (bekanntesten) anstößigen Seiten für einen URL/Text Filter?
 
Wie kann ich mit PHP die Benutzereingaben am effektivsten filtern vor Injections etc.?

So pauschal kann man das nicht beantworten. Das kommt halt immer auf die Situation an. Wenn in ein Feld bspw. nur Zahlen eingegeben werden sollen, dann überprüfst du mit PHP, ob wirklich nur Zahlen eingegeben wurden oder ob da einer nicht vllt einen SQL-Befehl oder sonstwas "durchschmuggeln" möchte. Nur man kann jetzt ja auch nicht sagen, alle Felder darauf überprüfen, dass nur Zahlen eingegeben wurde. :D Du musst halt immer selbst überleben, was sinnvoll ist und wie man evtl. das System ausnützen könnte.

Wie kann ich außerdem noch dafür sorgen, dass HTML-Quelltext, der in eine Datenbank eingetragen wird effektiv geschützt wird, aber nicht der Inhalt verändert wird?

Was? Bitte nochmal neu formulieren. Wenn du ein sicheres PW, Benutzernamen, sichere Sicherheitseinstellungen, etc. hast, dann sind die Inhalte in der DB recht sicher, wenn nicht, nicht.

Hat jemand eine Ahnung, wo man eine (aktuelle) Bad-Word-Liste herbekommt

Am besten eine selbst schreiben. Jeder hat einfach andere Vorstellungen. Manche Leute zensieren bspw. ficken, andere finden das nicht allzu schlimm und lassen es durchgehen. Schreib doch einfach alle Wörter nieder, du du nicht hören willst. Ansonsten könntest du dir mal ne kostenlose Forensoftware runterladen und da in den Dateien stöbern. Dort sind meistens solche Listen enthalten.
 
CPU schrieb:
meine Frage ist recht einfach: Wie kann ich mit PHP die Benutzereingaben am effektivsten filtern vor Injections etc.?

wenn du z.b. nur zahlen verlangst, kannst du sie nach int casten, somit ist sichergestellt, dass wirklich nur zahlen enthalten sind. genauso geht das mit dem datentyp bool. bei strings allerdings kannst nur du wissen, was enthalten sein soll. schau dir z.b. mal html_entities() an. vor mysql-injections kann man sich z.t. auch durch mysql_real_escape_string() schützen.

CPU schrieb:
Wie kann ich außerdem noch dafür sorgen, dass HTML-Quelltext, der in eine Datenbank eingetragen wird effektiv geschützt wird, aber nicht der Inhalt verändert wird?

was heißt effektiv geschützt wird und inhaltlich nicht verändern? text ist text, die frage ist was du damit machen willst. willst du den html-code 1:1 übernehmen ohne irgendwelche konvertierungen oder wie?
 
CPU (ich) schrieb:
Wie kann ich außerdem noch dafür sorgen, dass HTML-Quelltext, der in eine Datenbank eingetragen wird effektiv geschützt wird, aber nicht der Inhalt verändert wird?

Also: Ich habe mit einem Editor einen HTML-Quelltext bearbeitet! Nun speichere ich diesen und er wird in die Datenbank geschrieben! So. Nun möchte ich jedoch den Inhalt nochmals filtern (bevor er in die Datenbank geschrieben wird) auf evt. Injections etc.. Wenn der Inhalt gefiltert wurde hat er sich doch verändert, oder? Aus "\\\" ist z.B. "\\\\" geworden. Diese Änderungen könnten sich ja noch anders auswirken und die HTML-Seite sieht dann anders aus!
Und da frage ich mich, was ich da machen soll!

@Eingabevalidierung
In meinem System wird der SQL-Code eigenst geparst. Ich habe eine Unit entworfen, die mir SQL Code generiert. Dabei werden die dynamischen Inhalte u.a. durch die Funktion "mysql_real_escape_string()" gejagt.

Nun mache ich es aber so, dass alle Benutzereingaben (jedes Stück Text - also alles - , dass vom Client an den Server gesendet wird) durch eine Funktion "gereinigt" werden soll (z.B. Formulareingaben, GET-Variablen etc.).

Die Funktion sieht so aus (derzeit):
PHP:
function clean_string($string) {
	$Result = "";
	$Result = stripslashes(htmlspecialchars($string));
	return $Result;
}

Was haltet Ihr von dieser Funktion??

CPU
 
Was haltet Ihr von dieser Funktion??

Gar nichts, die ist irgendwie schwachsinnig. Wie ich oben schon geschrieben habe, eine pauschale Lösung gibt es hier nicht. Wieso sollte jede Eingabe durch htmlspecialchars geschickt werden? Bsp. Kontaktformular: Benutzer gibt eine Nachricht ein, seine Eingabe wird durch htmlspecialchars geschickt. Danach wird die Eingabe in einer Nur-Text-Email verschickt. Dann stehen in der E-Mail u.U. lauter kryptische Zeichen. Also wie gesagt, Pauschalität ist hier fehl am Platze.

Btw: Sag mal konkret was du vorhast. Im Moment hört sich das alles ziemlich komisch an.
 
CPU schrieb:
Wenn der Inhalt gefiltert wurde hat er sich doch verändert, oder?
Ist das nicht der Sinn des ganzen?
Aus "\\\" ist z.B. "\\\\" geworden. Diese Änderungen könnten sich ja noch anders auswirken und die HTML-Seite sieht dann anders aus!
Klingt so als würde da noch eine von diesen schrecklichen magic_quotes_* Sachen dazwischenfunken.
 
@Sag mal konkret was du vorhast.

Also: Ich habe ein selbst programmiertes CMS! Nun möchte ich das CMS vor Angriffen wie z.B. Injections schützen.

Also, zunächst habe ich mir Gedanken gemacht, was für Daten vom Client zum Server laufen:
  • z.B. GET-Variablen mit der aktuellen Seiten id
  • Eingaben des Benutzers in ein Login-Feld bzw. Formular (Feedback etc.)
  • Eingaben von HTML-Quellcode für Management Benutzer

Und nun wollte ich eine Funktion schreiben, durch die die Daten geschickt werden und dannach "clean" sind!

CPU
 
>> Und nun wollte ich eine Funktion schreiben, durch die die Daten geschickt werden und dannach "clean" sind!

Aber es gibt kein universelles "clean" und deshalb auch keine universelle Funktion. Zu erwähnst ein Feedback-Formular. Wenn du jetzt in allen Eingaben "special html chars" durch ihre Entities ersetzt und die Feedback-Nachricht danach per E-Mail an dich (den Admin) schickst, dann würden in der E-Mail komische Zeichen stehen, da eine E-Mail normalerweise nicht geparst wird - es sei denn zu erzeugst extra eine HTML-Mail, was in diesem Fall allerdings dumm wäre. Du sieht nun hoffentlich, dass htmlspecialchars() an dieser Stelle nicht nur unnötig, nein sogar schädlich wäre. Also nun zum dritten Mal: Es gibt keine universelle Funktion zum "Cleanen". Du musst halt je nach Situation nachdenken, gegen was du dich schützen musst. Pauschal alle Strings durch htmlspecialchars() zu jagen ist jedenfalls nicht die Lösung.

>> z.B. GET-Variablen mit der aktuellen Seiten id

Hier musst du bspw. überprüfen, ob ID ein numerischer String ist - denn nur das darf er sei! htmlspecialchars() würde dir hier nichts nützen, wenn jemand bspw. "id=45;CREATE+DATABASE+egal" eingeben würde. Denn in dieser SQL-Injection kommen gar keine special html chars vor.

>> Eingaben von HTML-Quellcode für Management Benutzer

Das verstehe ich nicht. HTML-Code wird doch von den Betreibern der Seite eingegeben. Irgendwie unsinnig, dass jemand seine eigene Seite infiltriert.
 
CPU schrieb:
  • z.B. GET-Variablen mit der aktuellen Seiten id

je nachdem wie du das ausgelegt hast, ist hier mehr oder weniger notwendig. wenn alles über die index.php geschickt wird, würde ich hier eine einfache liste von bereichen erstellen und diese damit vergleichen. bei keinem treffer wird auf die startseite weitergeleitet. wenn du zahlen anstatt strings verwendest, reicht es wie gesagt nach int zu casten und dieses zu verwenden.

CPU schrieb:
  • Eingaben des Benutzers in ein Login-Feld bzw. Formular (Feedback etc.)

siehe letzten beiden absätze. andere sachen so gut wie möglich escapen bzw. direkt entfernen wenn sie nicht gebraucht werden.


CPU schrieb:
  • Eingaben von HTML-Quellcode für Management Benutzer

hier würde ich lediglich sql-injections abfangen, den rest würde ich so lassen wie er ist. mit reinem html kann es manchmal zu ziemlichen problemen führen. und solange leute daran sitzen die wissen was sie machen (wenn sie es nicht wissen, dann haben sie mmn keine berechtigung dafür), würde ich persönlich nichts filtern.

edit:

bb code reicht vollkommen aus, du müsstest halt nur positionierungen und alles das selbst realisieren. reine html daten können auch eine ziemliche lücke sein.

CPU schrieb:
Und nun wollte ich eine Funktion schreiben, durch die die Daten geschickt werden und dannach "clean" sind!

mit einer einzigen funktion bist du da nicht aus dem schneider, jede eingabe hat ein anderes "format". login daten sind z.b. nur kurze strings ohne jegliche syntax. bei html sieht das dann schon ganz anders aus, hier zählt nämlich die syntax und wenn die 1 mal durcheinander gebracht wurde (z.b. weil du " escaped hast) ist so gut wie alles hinüber, außer man ändert wieder alles manuell in die richtige form um.

bei logins kannst du z.b. die zeichen beschränken, was so viel heißt wie: keine zeichen die für irgendwelche angriffe ausgenutzt werden - da fallen mir z.b. ' " $ ein. wenn du so etwas von vorn herein unterdrückst und dementsprechend dann herausfilterst bzw escapest, dann hast du schon mal ein großes loch weniger.
 
Zuletzt bearbeitet:

Ähnliche Themen

Zurück
Oben