Chat2: Gruppen-Chatraum mit PHP, jQuery und einer Text Datei

Avatar of Chris Coyier
Chris Coyier am

DigitalOcean bietet Cloud-Produkte für jede Phase Ihrer Reise. Starten Sie mit 200 $ kostenlosem Guthaben!

Dies ist ein Update zum ursprünglichen Chatraum, das wir hier auf CSS-Tricks veröffentlicht haben. In gewisser Weise ist die Technologie dieselbe. Wir werden PHP verwenden, um mit dem Server zu kommunizieren, jQuery, um den Chat am Laufen zu halten, und die Chats selbst werden wie in der ersten Version in .txt-Dateien gespeichert.

Was sich geändert hat, ist die Hinzufügung einiger neuer Funktionen

  • Benutzernamen sind für aktuell chatende Benutzer eindeutig
  • Sie können eine Liste der aktuell chatenden Benutzer sehen
  • Es gibt mehrere Räume zum Chatten

Ein wenig MySQL

Während die erste Version keine Datenbank verwendete, setzen wir für diese Version ein wenig MySQL ein. Im Download befindet sich eine Datei namens Setup.sql zum Erstellen der initialen Datenbank. MySQL wird nicht für die Chats selbst verwendet, sondern für zwei andere Dinge:

  • Verfolgen aktiver Benutzer
  • Die Räume

Wenn jemand zum Chat beitritt, wählt er einen Benutzernamen. Mit etwas jQuery wird eine AJAX-Anfrage gesendet, um zu prüfen, ob dieser Benutzername derzeit in der Datenbank verwendet wird. Wenn er verwendet wird, erhalten Sie eine Warnung

Andernfalls wird angezeigt, dass es in Ordnung ist

Wenn es in Ordnung ist und Sie auf "Chats beitreten" klicken, wird dieser Benutzername in die Datenbank eingetragen und weitere Prüfungen auf seinen Namen werden anderen mitteilen, dass der Name nicht verfügbar ist. Inaktive Benutzer werden aus der Datenbank entfernt.

Räume hinzufügen/bearbeiten/entfernen

Die Namen der Chaträume werden in der Datenbank gespeichert. Um einen neuen Chatraum hinzuzufügen, fügen Sie einfach eine neue Zeile zur Datenbank hinzu mit dem Namen des Chatraums und dem Dateinamen der Textdatei, in der Sie den Chat speichern möchten

Dann müssen Sie nur noch sicherstellen, dass die Textdatei auf dem Server am richtigen Ort liegt und über die richtigen Schreibrechte verfügt (siehe Download für die korrekte Platzierung).

jQuery

Ich bin sicher, Sie haben inzwischen bemerkt, dass wir uns keinen tatsächlichen Code angesehen haben. Das ist Absicht. Der gesamte Code ist im Download (siehe unten) verfügbar. Es ist nicht so überwältigend viel, dass es unüberschaubar wäre, aber ich denke, es ist zu viel für ein Standard-Schreib-Tutorial/Überblick. Stattdessen wollen wir einen Überblick geben, wofür es verantwortlich ist

Benutzername-Prüfung: Auf der Startseite des Chats, wenn Sie Ihren Benutzernamen wählen, beobachtet jQuery dieses Texteingabefeld. Wenn Sie ein Zeichen eingeben (bei keyup), fragt es eine bestimmte PHP-Datei (via AJAX), ob dieser Benutzername bereits verwendet wird. Die PHP-Datei antwortet mit Ja oder Nein, und eine entsprechende Meldung wird auf dem Bildschirm angezeigt.

Nachrichtenfeld: Wenn ein Benutzer in das Textarea zum Senden einer Nachricht tippt, beobachtet jQuery dieses Feld und stellt sicher, dass der Text eine bestimmte Zeichenzahl nicht überschreitet (gesetzt durch das maxlength-Attribut des Textareas)

Nachricht senden: Wenn die Eingabe-/Enter-Taste im Chatfeld gedrückt wird, wird der Wert zur Verarbeitung gesendet. PHP schreibt den Text in die Textdatei.

Chat aktualisieren: Alle paar Sekunden fragt jQuery eine PHP-Datei, um die Textdatei zu prüfen, ob neue Zeilen vorhanden sind. Wenn ja, werden diese angezeigt.

Funktionen, die er nicht hat

  • Sie können Leute nicht rausschmeißen
  • Er verarbeitet keine Sonderzeichen

Sie wollen diese Sachen hinzufügen? Ich würde mich freuen und ich werde dies aktualisieren.

Demo und Download

Dateien herunterladen

UPDATE: Es gab ein SICHERHEITSPROBLEM mit einem bestimmten Aspekt, das Zugriff auf jede Datei auf dem Server gewähren konnte. Ein Leser konnte mir zeigen, wie er öffentlich auf meine wp-config.php WordPress-Datei zugreifen konnte, die natürlich sehr sensibel ist. Die Schwachstelle liegt in der Datei update.php, die einen "state"- und "file"-Parameter akzeptiert. Wenn direkt darauf zugegriffen wird und ein relativer Dateipfad verwendet wird, können geschützte Dateien auf diese Weise erreicht werden. Wenn es behoben ist, werde ich den herunterladbaren Code aktualisieren.

UPDATE: Jason Gradwell schlug Schutzmaßnahmen auf der PHP-Seite vor, die erfordern würden, dass die Datei nur über Ajax und nur von einer bestimmten Quelle aufgerufen wird.

<?php if (!isset($_SERVER['HTTP_X_REQUESTED_WITH']) && $_SERVER['HTTP_REFERER']!="http://your-site.com/path/to/chat.js") { 
  die(); 
} ?>

Danksagungen

Besonderer Dank an Kenrick Beckett, der den ursprünglichen Code erstellt hat, und an Jason Lengstorf für die Überprüfung und einige sicherheitstechnische Aufräumarbeiten.

Für die Zukunft

Hier ist eine Zusammenfassung von Dingen, die Leute in den Kommentaren vorgeschlagen haben oder die mir sonst noch gut gefallen würden

  • Sicherheitsproblem von oben behoben
  • Flutkontrolle (so etwas wie nur 1 Nachricht alle 5 Sekunden senden können)
  • Link zum Abmelden (PHP-Sitzung löschen)
  • Erlauben Sie etwas HTML, aber nicht anderes (Whitelist von Tags). Zum Beispiel <a href=””> erlauben, aber JavaScript trotzdem entfernen. Möglicherweise ein paar Schaltflächen für HTML (WYSIWYG?). Code-Hervorhebung für Inhalte in <code>-Tags.
  • Registrierung erlauben, um einen bestimmten Benutzernamen dauerhaft zu haben (und alles, was dazu gehört, wie "Passwort vergessen")
  • Schutz vor nicht existierenden Chatraum-Namen, z.B. /Chat2/room/?name=LOL
  • Unterstützung für alle Sonderzeichen (UTF-8)
  • Private Nachrichten (@) (nur die Person, die diesem Benutzernamen entspricht, wird sie sehen)
  • Leute rausschmeißen / Leute per IP sperren (nur als Administrator-Benutzer, oder vielleicht nur eine Blacklist von IPs)
  • Mehr Emoticons
  • Eine tatsächliche Absendetaste haben (für mobile Geräte, die JavaScript unterstützen, aber keine regulären Tastenereignisse haben)
  • Automatische Filterung von Schimpfwörtern
  • Externes Anmeldesystem nutzen, wie Twitter oAuth, Google Login oder Facebook Connect
  • Benutzernamen als E-Mails, dann Gravatare verwenden
  • Links mit 4-Buchstaben-Erweiterungen funktionieren nicht (z.B. .info)
  • Long Polling, anstatt alle paar Sekunden anzufragen