Compilation Failed!!

sh0x

Erfahrenes Mitglied
Liebe PHP-Profis,

habe ein Formular erstellt. Wenn ich nun jedoch ein Backslash in das Textfeld setze und das Formular abschicke, dann verdoppelt PHP die Backslashes.

Ich habe Addslashes und Trim auf das POST-Array angewandt.

Wenn man jetzt immer wieder auf Absenden klickt, so erhöht sich immer mehr die Anzahl der Backslashes in dem eigentlich auf 10 Zeichen begrenzten Textfeldes. Und zwar solange, bis die folgende Fehlermeldung 100fach erscheint:

Code:
Warning: preg_match(): Compilation failed: regular expression too large at offset 0 in /var/www/http01/docs/temp/suchen.inc.php on line 55

Weiß jemand, wie ich sinnvoll die Formulareingaben überprüfen kann, ohne dass Fehler dieser Art entstehen können? Und dass das Formular sicher gegen XSS-Attacken und Hijacking ist?
Folgend mein bisheriger Code:
Code:
  $check_titel = (isset($_POST['check_titel']) ? $_POST['check_titel'] : '');
  $titel = (isset($_POST['titel']) && $_POST['titel']!='') ? addslashes(trim($_POST['titel'])) : '';
  $check_text = (isset($_POST['check_text']) ? $_POST['check_text'] : '');
  $text = (isset($_POST['text']) && $_POST['text']!='') ? addslashes(trim($_POST['text'])) : '';

$check_titel und $check_text sind Checkboxen. $titel und $text sind normale Textfelder, die ich per HTML auf 10 bzw 30 Zeichen begrenzt habe.

Vielen Dank für jegliche Hilfe :)
Any help would be appreciated ;)
 
wohl besser bei checkboxen:
$check_titel = ($_POST['check_titel']=='value') ? 'value' : 'othervalue';

Text-Eingaben limitiere ich immer nach oben hin (strlen()) und schreib sie mit mysql_real_escape_string() in die Datenbank

$check_titel und $check_text sind Checkboxen. $titel und $text sind normale Textfelder, die ich per HTML auf 10 bzw 30 Zeichen begrenzt habe.
Darauf ist aber nicht verlass... man könnte dein Formular nachbauen und beliebige Werte dieser Felder an dein script übertragen...
 
em-ix hat gesagt.:
wohl besser bei checkboxen:
$check_titel = ($_POST['check_titel']=='value') ? 'value' : 'othervalue';

Ich weiß nicht, was besser ist. Ich schreibe einen leeren Wert rein, wenn die Variable nicht existiert und prüfe dann per:
Code:
if((empty($check_titel) || empty($titel)) && (empty($check_text) || empty($text))) { ...
Wenn das Feld "empty", also leer ist, war es also nicht vernünftig gesetzt.
Oder meinst du, dass es geschickter und besser wäre, wenn ich
Code:
$check_titel = ($_POST['check_titel']=='1') ? '1' : '0';
machen würde und dann per
Code:
if($check_titel) {
abfragen würde?
Weil wenn check_titel=1 ist, dann zählt das ja als true, oder?

Das mit Strlen probiere ich mal aus. Also erst "trimmen" und dann die Sonderzeichen escapen. Danach dann die Länge mit strlen prüfen. Wenn alles passt, dann halt in Datenbank schreiben oder weiterverarbeiten. Habe ich dich da richtig verstanden?


em-ix hat gesagt.:
wohl besser bei checkboxen:
Darauf ist aber nicht verlass... man könnte dein Formular nachbauen und beliebige Werte dieser Felder an dein script übertragen...
Danke, leuchtet mir ein. :)
 
sh0x hat gesagt.:
Ich weiß nicht, was besser ist. Ich schreibe einen leeren Wert rein, wenn die Variable nicht existiert und prüfe dann per:
[...]
Wenn das Feld "empty", also leer ist, war es also nicht vernünftig gesetzt.
Das ist schon ok... aber du musst ja auch aufpassen was passiert, wenn das Feld einen Wert bekommt. Eigentlich sollte das dann ja ein eindeutiger Wert sein. Aber wie gesagt, das musst du trotzdem prüfen.

sh0x hat gesagt.:
Weil wenn check_titel=1 ist, dann zählt das ja als true, oder?
Kommt drauf an was du damit anfangen willst:
Wenn du ein mysql-Feld füllst, kannst du ja gleich der Variable die Werte geben, die du auch in die Datenbank schreiben willst, also zB:
$check=($_POST[..]=='1') ? 'active' : 'disabled';
 
Ich arbeite hier garnicht mit MYSQL sondern nur mit Arrays. Brauche also nur die Überprüfung, ob es gesetzt ist oder nicht.

Und mein wichtigster Punkt:
Das mit Strlen probiere ich mal aus. Also erst "trimmen" und dann die Sonderzeichen escapen. Danach dann die Länge mit strlen prüfen. Wenn alles passt, dann halt in Datenbank schreiben oder weiterverarbeiten. Habe ich dich da richtig verstanden?
 
Kommt natürlich drauf an.. die escap'te Fassung ist oft länger... ist es so, dass der Benutzer maximal 20 Zeichen eintippen darf, oder ist es so, dass maximal 20 Zeichen dem script zum Arbeiten weitergegeben dürfen...
 
Der Benutzer soll nur 20 Zeichen eingeben können und nur diese 20 Zeichen sollen vom System verarbeitet werden.
 
Habe es nun hinbekommen.
Und zwar folgendermaßen:
Code:
$check_titel = isset($_POST['check_titel']) && $_POST['check_titel'] == '1' ? '1' : '0';
  $titel = isset($_POST['titel']) && $_POST['titel']!='' ? addslashes(trim($_POST['titel'])) : '';
  $check_text = isset($_POST['check_text']) && $_POST['check_text'] == '1' ? '1' : '0';
  $text = isset($_POST['text']) && $_POST['text']!='' ? addslashes(trim($_POST['text'])) : '';
  
  if(strlen($titel)>$grenzwert || strlen($text)>$grenzwert) {
    die('Achtung: Ein Fehler ist aufgetreten, weil der &uuml;bergebene String zu lang ist. Bitte nutzen sie keine Sonderzeichen innerhalb des Formulars.<br><a href="javascript:history.back();">Zur&uuml;ck zur Bibliothek</a>');  
  }

Wenn ihr Anregungen oder Verbesserungen parat habt, höre sowas gern :)
 
Zurück