Hochkomma ' per RegEx filtern?

S-lord

Mitglied
Hey, ich möchte gern, dass man in meiner Shoutbox auch sowas wie: Let's schreiben kann. Leider bekomme ich zwar die Meldung, dass der Eintrag erfolgreich übernommen wurde, wenn ein ' enthalten ist, aber übernommen wird er doch nicht. Bei allen Sonderzeichen wird der Eintrag je nach Einstellung übernommen und auch die Meldung, dass es übernommen wurde, passend ausgegeben.

Hier Codeschnipsel:

PHP:
$text = htmlspecialchars($_POST['text']);
$sql = "INSERT INTO shoutbox (id, date, name, text, ip) VALUES ('', '$time', '$name', '$text', '$ip')";
	if (isset($_POST['submit'])) {
    if ($name == '' or $text == '' or  $name == 'Benutzername' or $text == 'Kommentar') {
  		$fehler = 'Sie m&uuml;ssen alle Felder bef&uuml;llen!<br />';
      if(!empty($name)) {
        if (!preg_match("/^([\w\d\-öäüÖÄÜß[:space:]])+$/",$name)) {
          $fehler .= 'Im Namen d&uuml;rfen keine Sonderzeichen enthalten sein!<br />';
        }
      }
    }
    if(empty($fehler)) {
  		$ergebnis = mysql_query($sql, $verbindung);
  		$_SESSION['meldung'] = 'Ihr Shotboxeintrag wurde erfolgreich eingef&uuml;gt!';
      $_SESSION['farbe'] = 'positiv';
  	} else {
      $fehler .= 'Ihr Shoutbox wurde somit nicht &uuml;bernommen! Bitte versuchen Sie es erneut.';
      $_SESSION['meldung'] = $fehler;
      $_SESSION['farbe'] = 'negativ';
    }
  	mysql_close($verbindung);
  	header('Location: ../index.php');
  } else {
    header('Location: ../index.php');
  }

Hier mal die Seite, auf der das Script derzeit liegt:
http://gevierte.web263.server-drome.de/
Probiert ruhig mal mit dem Shoutbox Script rum, dann werdet ihr, wenn ihr bis jetzt noch nicht genau wisst, was ich meine, es schon rausbekommen.

Wäre ganz lieb, wenn mir jemand erklären könnte, wie die Shoutbox das Zeichen ' übernimmt und auch ausgibt.
 
Hey, ich möchte gern, dass man in meiner Shoutbox auch sowas wie: Let's schreiben kann [...]

PHP:
$text = htmlspecialchars($_POST['text']);
$sql = "INSERT INTO shoutbox (id, date, name, text, ip) VALUES ('', '$time', '$name', '$text', '$ip')";

[...]Wäre ganz lieb, wenn mir jemand erklären könnte, wie die Shoutbox das Zeichen ' übernimmt und auch ausgibt.

Das tut sie. SQL tut es aber nicht. Siehe Beispieltext "Let's":

PHP:
$time = $name = $ip = 0; // Zur Vollständigkeit für das Beispiel

$text = htmlspecialchars("Let's");
$sql = "INSERT INTO shoutbox (id, date, name, text, ip) VALUES ('', '$time', '$name', '$text', '$ip')";

/* Demnach:
  INSERT INTO shoutbox (
    id,
    date,
    name,
    text,
    ip
  ) VALUES (
    '',
    '0',
    '0',
    'Let's',
    '0'
  );
/*

Wie du siehst muss dieser Query zu einem Fehler führen. Abhilfe schaffen escape-Funktionen zu SQL. Falls du mysql_* benutzt wäre das zum Beispiel: http://de.php.net/manual/de/function.mysql-real-escape-string.php

Dein aktuelles Skript besitzt folgende (große) Sicherheitslücke: http://de.wikipedia.org/wiki/SQL-Injection
 
Zuletzt bearbeitet:
Eure Erklärungen und Hilfen klingen logisch, und nachdem ich die Zeile:
$text = htmlspecialchars($_POST['text']);
in:
$text = htmlspecialchars(mysql_real_escape_string(($_POST['text']));

geändert habe, wird es nicht eingetragen, wenn ein Hochkomma dabei ist, und die Fehlermeldung stimmt.

Ok, wäre eine Variante, aber ich möchte ja, dass es auch wirklich übernommen und ausgegeben wird.
Auf der Seite ist das erneuerte Script hochgeladen, für Testzwecke freigegeben.^^
 
Zuletzt bearbeitet:
Das mysql_real_escape_string hätte ich eher um das ganze getan statt innen, da die variable $text für SQL benötigt wird und nicht für die Ausgabe per HTML.
 
Es ist egal, was ich versuche, mit mysql_real_escape_string() zu beeinflussen.
Jedes mal wird dann nichts eingetragen. Wo da jetzt der Fehler liegen soll, weiß ich echt auch nicht.
 
Lasse mal nur das eine Wort eintragen und in deinem Skript fügst du folgendes hinzu, bevor der Query gesendet wird:
PHP:
var_dump($sql);

var_dump ist dein Freund ;) Es zeigt was in einer Variablen steht und daraus kann man dann schließen was intern passiert.
 
Lasse mal nur das eine Wort eintragen und in deinem Skript fügst du folgendes hinzu, bevor der Query gesendet wird:
PHP:
var_dump($sql);

var_dump ist dein Freund ;) Es zeigt was in einer Variablen steht und daraus kann man dann schließen was intern passiert.

Gesagt - getan:
string(91) "INSERT INTO shoutbox (id, date, name, text) VALUES ('', '1252852116', 'Thomas', '')"

Bei der Eingabe von:

Thomas
Noch ' ein ' verdammter ' test


Und der definition:
PHP:
	$text = mysql_real_escape_string(htmlspecialchars($_POST['text']));
Übrigens kommt beim Vertauschen der Funktionen mysql_real_escape_string() und htmlspecialchars() das Selbe dabei heraus.

Also iwie verschwinden die Werte. Extrem komisch.
Ansonsten wird die Variable $text ja nicht angerührt.
 
Zuletzt bearbeitet:
Drei Sachen:

- Prüfe ob du uns hier die Ausgabe im Browser zeigst (unnütz) oder die Ausgabe wie sie im Quelltext steht.

- Mache ein var_dump auf $test

- Mache eins auf $_POST['text']
 
Ich habs jetzt mit ereg_replace("'","\'"); provisorisch gelöst.
Warum provisorisch? Ich bin sicher, dass es eine deutlich bessere Lösung gibt, die ich aber leider nicht finde.
 
Zurück