Andreas-Lindig: Ein Forum basteln

Hallo Forum,

ich bin gerade dabei ein Forum zu schreiben:
http://forum.andeas-lindig.de/gesamt.php
Ich benutze dabei als Grundlage das Forum von Henryk Ploetz aus den SelfHLTML-Feature-Artikeln. Ich wollte mal die erfahrenen Forumsprogrammierer unter Euch fragen: was ist alles zu beachten?

  • Datenmenge:
    z.B. schreibt er die Beitraege direkt in die Datenbank - ist die dann nicht schnell voll? (ich habe nur 5MB zur Verfuegung, aber 50MB normale Festplatte). Ich schreibe die eigenlichen Inhalte in Dateien und in die Datenbank nur je einen Link dorthin. Ist das gut?

  • Suche/Zeichendaten uebertragen:
    an was muss man da alles so denken? Also z.B. Umlaute und Sonderzeichen escapen oder nicht; was passiert mit Zeilenumbruechen; wie werden eigentlich Umlaute von einem System zum anderen uebertragen z.B. ä von Windows zu Linux - ich kann ja die Zeichen erst umwandeln, wenn sie beim Server angekommen sind...

  • Sicherheit:
    Ich habe das Ganze in einem Frameset (jaja, nicht 'die reine Lehre' - dafuer aber praktisch fuer den User) und um in jedem Frame das richtige Formular oder den passenden Beitrag zu haben, gebe ich durch alle Frames immer die ID des angeklickten Postings im Query-String weiter. Kann da einer irgendwie auf die Datenbank zugreifen und was in fremde Postings reinschreiben?

  • Redaktion:
    was macht man eigentlich, wenn man ein Posting loeschen will? Da haengen doch u.U. ganze Antwort-Baeume dran und diese verletzen dann die referenzielle Integritaet. Wie wird das denn hier im Forum gemacht?

Wuerde mich freuen ueber anregende Diskussion zum Thema - auch abseits dieser rein technischen Belange, und natuerlich ueber Testberichte zu meinem Forum.

Gruss, Andreas

  1. Hallo Andreas,

    Ich schreibe die eigenlichen Inhalte in Dateien und in die
    Datenbank nur je einen Link dorthin. Ist das gut?

    Ja, wesentlich sinnvoller als die Daten direkt in die DB zu
    hauen.

    an was muss man da alles so denken?

    Das wichtigste ist ein Charset in der Seite anzugeben und
    ein accept-charset-Attribut in den Formularen anzugeben.

    was passiert mit Zeilenumbruechen;

    Nichts. Du musst halt statt auf \n auf \015\012|\015|\012
    pruefen.

    wie werden eigentlich Umlaute von einem System zum anderen
    uebertragen z.B. ä von Windows zu Linux

    In dem Zeichensatz, den du bestimmt hast.

    Kann da einer irgendwie auf die Datenbank zugreifen und
    was in fremde Postings reinschreiben?

    Nur, wenn du irgendwo ohne Usereingaben zu validieren direkt
    mit der Datenbank arbeitest.

    • Redaktion:
      was macht man eigentlich, wenn man ein Posting loeschen
      will? Da haengen doch u.U. ganze Antwort-Baeume dran und
      diese verletzen dann die referenzielle Integritaet. Wie
      wird das denn hier im Forum gemacht?

    Alle Subtrees werden mitgeloescht. Steht ueberigens auch in
    der FAQ.

    Gruesse,
     CK

    1. Hallo Christian

      Das wichtigste ist ein Charset in der Seite anzugeben und
      ein accept-charset-Attribut in den Formularen anzugeben.

      Charset/accept-charset-Attribut - was ist das denn?

      was passiert mit Zeilenumbruechen;
      Nichts. Du musst halt statt auf \n auf \015\012|\015|\012
      pruefen.

      hä? sorry, aber System- und Netzwerktechnik sind mir ziemlich fremd.

      wie werden eigentlich Umlaute von einem System zum anderen
      uebertragen z.B. ä von Windows zu Linux
      In dem Zeichensatz, den du bestimmt hast.

      und wo und wie bestimmt man den?

      Nur, wenn du irgendwo ohne Usereingaben zu validieren direkt
      mit der Datenbank arbeitest.

      inwiefern validieren? - Ich prüfe, ob es $_GET bzw. $_POST Variablen sind (PHP). Meinst Du das?

      ...Steht ueberigens auch in
      der FAQ.

      <gebeugten Hauptes>
         tschuldigung daran hab ich gar nicht gedacht,
         dachte das gehört eher zu den Programmierer-Inside-Tips
      </gebeugten Hauptes>

      Gruß, Andreas

      1. Hallo Andreas,

        Das wichtigste ist ein Charset in der Seite anzugeben
        und ein accept-charset-Attribut in den Formularen
        anzugeben.
        Charset/accept-charset-Attribut - was ist das denn?

        Den charset gibst du als Attribut fuer den Content-Type mit,
        also z. B.

        header('Content-Type: text/html; charset=ISO-8859-1');

        in PHP.

        was passiert mit Zeilenumbruechen;
        Nichts. Du musst halt statt auf \n auf
        \015\012|\015|\012 pruefen.
        hä? sorry, aber System- und Netzwerktechnik sind mir
        ziemlich fremd.

        Nun, da du im Internet arbeitest, ist nicht garantiert, dass
        die Newlines immer mit \n maskiert sind. Deshalb musst du
        stattdessen auf '\015\012|\012|\015' pruefen. Unter Windows
        sind die Newlines als '\015\012' maskiert, unter Unix mit
        '\012' und unter MacOS < 10 mit '\015' (total krank). Der |
        bedeutet 'oder'. Das ganze kann man recht einfach
        'normalisieren':

        $txt = preg_replace('/\015\012|\012|\015/',"\n",$txt);

        und schon sind garantiert alle Newlines mit '\n' maskiert.

        wie werden eigentlich Umlaute von einem System zum
        anderen uebertragen z.B. ä von Windows zu Linux
        In dem Zeichensatz, den du bestimmt hast.
        und wo und wie bestimmt man den?

        Im Formular-Attribut 'accept-charset' und in der
        Charset-Angabe im Content-Type-Header.

        inwiefern validieren? - Ich prüfe, ob es $_GET bzw. $_POST
        Variablen sind (PHP). Meinst Du das?

        Nein. Ich meinte, dass du pruefst, ob die Werte auch sinnvoll
        sind. Will heissen, ein

        mysql_query("insert into blahr (blub) values ('$var')");

        ist *nicht* sicher. Da sind die Werte weder escaped worden,
        noch auf Plausiblitaet ueberprueft worden.

        Gruesse,
         CK

        1. Den charset gibst du als Attribut fuer den Content-Type mit,
          also z. B.
          header('Content-Type: text/html; charset=ISO-8859-1');
          in PHP.

          aha, mal nachlesen...

          Das ganze kann man recht einfach
          'normalisieren':
          $txt = preg_replace('/\015\012|\012|\015/',"\n",$txt);
          und schon sind garantiert alle Newlines mit '\n' maskiert.

          das mache ich also, mit dem String der aus dem Formular kommt - noch bevor ich irgendetwas anderes damit mache ja?

          Ich meinte, dass du pruefst, ob die Werte auch sinnvoll
          sind. Will heissen, ein
          mysql_query("insert into blahr (blub) values ('$var')");
          ist *nicht* sicher. Da sind die Werte weder escaped worden,
          noch auf Plausiblitaet ueberprueft worden.

          ach so, ja escapen tue ich alles was reinkommt (bzw. das macht der magic_quotes meines Providers auch).

          ansonsten werden 'nur' Strings verarbeitet und ich überprüfe z.B. nicht die korrekt Syntax einer e-mail Adresse (bringt ja eh nichts).
          Die Zahlen, die vorkommen werden vorher aus der Datenbank geholt und nachher wieder reingeschrieben. Sollte man da überprüfen, ob es Zahlen sind?

          gruß, Andreas

  2. Hi,
    also was ich aus meine Erfahrung sagen kann ist folgendes :

    Achte darauf, dass die Eingabe nie als HTML interpretiert werden kann.
    Baue eine Funktion ein, die Doppelpostings verhindert, aber verwende dabei keine Cookies, weil Leute mit den Bug Explorer haben dann bei mir plötzlich nicht mehr posten können, weil der IE das Cookie nicht richtig gelöscht hat.
    Eine Vorschau wäre auch nicht verkehrt.
    Das mit dem Löschen habe ich immer so gelöst. Wenn das erste Posting gelöscht wird, werden logischerweise alle Replies auf dieses Posting gelöscht.
    Ich habe bei meinem Board noch so Features eingebaut, wo das Board Links, die als nicht anklickbar markiert werden, erkennt, und dementsprechend reagiert.
    Vielleicht gibt dir mein Board ein paar Anregungen. Du findest es hier:

    http://testforum.acid4u.com/

    1. Hi
      ($xNeTworKx) kommst Du vom Planeten Vulkan (dem Namen zufolge)?

      Achte darauf, dass die Eingabe nie als HTML interpretiert werden kann.

      ja, mit Htmlentities()

      Baue eine Funktion ein, die Doppelpostings verhindert, aber verwende dabei keine Cookies, weil Leute mit den Bug Explorer haben dann bei mir plötzlich nicht mehr posten können, weil der IE das Cookie nicht richtig gelöscht hat.

      interessant...

      Eine Vorschau wäre auch nicht verkehrt.

      ja, da bin ich dran

      Das mit dem Löschen habe ich immer so gelöst. Wenn das erste Posting gelöscht wird, werden logischerweise alle Replies auf dieses Posting gelöscht.

      ja, ist natürlich schade um interessante Nachfolgepostings, aber wenns nicht anders geht.

      Ich habe bei meinem Board noch so Features eingebaut, wo das Board Links, die als nicht anklickbar markiert werden, erkennt, und dementsprechend reagiert.

      ja, hab ich gerade getestet. Sehr zuverlässig

      vielen Dank, Andreas

      1. Hi Andreas,

        Das mit dem Löschen habe ich immer so gelöst. Wenn das erste Posting gelöscht wird, werden logischerweise alle Replies auf dieses Posting gelöscht.
        ja, ist natürlich schade um interessante Nachfolgepostings, aber wenns nicht anders geht.

        Du kannst natürlich auch einfach nur den Inhalt eines Baumknotens durch "dieses Posting wurde von der Forums-Administration gelöscht" ersetzen - aber damit verhinderst Du weder, daß in dem entsprechenden Teilbaum weiterhin gepostet werden kann, noch daß derselbe Inhalt in einem untergeordneten Posting des Threads nochmal drin steht (beispielsweise als Zitat).

        Deshalb meine Standardfrage: Was genau willst Du denn mit dem Löschen erreichen?

        Viele Grüße
              Michael

        --
        T'Pol: I meant no insult.
        V'Lar: Of course not. You're simply speaking your mind ... as you always have.
        1. Hallo Michael,

          Deshalb meine Standardfrage: Was genau willst Du denn mit dem Löschen erreichen?

          ja, zum Beispiel Illegale Inhalte - rechtsradikal, Mordaufrufe, was auch immer. Als Betreiber eines Forums bin ich soweit ich weiß auch für die Inhalte verantwortlich. Zweitens: Reklame (ist mir ein Gräuel) und diese Marketing-Fuzzis lassen nunmal keine kostenlose Gelegenheit aus. Jetzt stell Dir vor daraus entspinnt sich eine Interessante Diskussion, die erhaltenswert ist, aber die Reklame will ich trotzdem nicht dulden...

          aber die Idee, den Inhalt des Postings zu überschreiben hatte ich auch schon - ist vielleicht das beste.

          Wo ich Dich gerade an der Strippe habe: schreibt Ihr hier die Postings eigentlich in Dateien?

          Gruß, Andreas

          1. Hallo Andreas!

            Wo ich Dich gerade an der Strippe habe: schreibt Ihr hier die Postings eigentlich in Dateien?

            Naja, ich kenne mich zwar nicht so mit der Forensoftware aus, doch meines Wissens nach werden die Daten in XML-Dateien gespeichert.

            Wie die XML-Dateien genau aussehen, und was da noch für Infos drin stehn, die man vielleicht nicht im Forum sieht (IP Adresse des Posters oder sonstwas ...) weiß ich nicht.

            Doch wenn du Dir die Quellen vom Forum runterlädst, kannst das bestimmt dort nachschauen ;)

            MfG
            Götz

            1. Hallo Götz,

              Naja, ich kenne mich zwar nicht so mit der Forensoftware aus, doch meines Wissens nach werden die Daten in XML-Dateien gespeichert.

              Exakt. CK hat das Prinzip von der "alten" Forensoftware übernommen.

              Wie die XML-Dateien genau aussehen, und was da noch für Infos drin stehn, die man vielleicht nicht im Forum sieht (IP Adresse des Posters oder sonstwas ...) weiß ich nicht.

              Ich habe hier mal eine Testdatei (von meiner lokalen Testinstallation) schön formatiert:

              --------------------------------------------------------------------------
              <?xml version="1.0"?>
              <!DOCTYPE Forum SYSTEM "http://forum.de.selfhtml.org/forum.dtd">
              <Forum>
               <Thread id="t1">
                <Message invisible="0" id="m1" ip="92.168.100.1">
                 <Header>
                  <Author>
                   <Name>Christian Seiler</Name>
                   <Email>chris_se@gmx.net</Email>
                   <HomepageUrl/>
                   <ImageUrl/>
                  </Author>
                  <Category>BROWSER</Category>
                  <Subject>Irgendein Mist</Subject>
                  <Date longSec="1038062544"/>
                 </Header>
                </Message>
               </Thread>
               <ContentList>
                <MessageContent mid="m1">
                 <![CDATA[Hier ist der Text des Postings<br />Auch mit neuen Zeilen<br />Jepp.]]>
                </MessageContent>
               </ContentList>
              </Forum>
              --------------------------------------------------------------------------

              (da fällt mir gerade auf, dass er irgendwie immer die 1 von meiner IP klaut...)

              Ich hoffe, dass das ganze dadurch klarer wird.

              Doch wenn du Dir die Quellen vom Forum runterlädst, kannst das bestimmt dort nachschauen ;)

              Genauso ist es. Siehe auch src/xml_handling.c (http://cvs.teamone.de/selfforum/src/xml_handling.c?rev=1.14&content-type=text%2Fx-cvsweb-markup) Die Funktion stringify_posting ist die relevante.

              Grüße,

              Christian

              --
              Sollen sich alle schämen, die gedankenlos sich der Wunder der Wissenschaft und Technik bedienen und nicht mehr davon erfasst haben als eine Kuh von der Botanik der Pflanzen, die sie mit Wohlbehagen frisst.
                                    -- Albert Einstein