Beat: htmlentities? oder doch komplett anders?

Beitrag lesen

Hallo gute Gemeinde

Hallo mein Sohn.

Eigentlich kenne ich mich nur mit html/css aus. Da mir aber die Funktionen ausgehen, beginne ich mich an php heranzutasten.

Was gewiss nicht immer leicht ist, vor allem, weil man es mit CGI und bösem Userinput zu tun hat.

Als kleine Übungsmaßnahme habe ich mir die Aufgabe gestellt, eine ganz einfache Kommentarfunktion zu schreiben, wie es in Gästebüchern und Foren üblich ist. Hier der Quellcode:

Ich kenne keine einfachen Kommentarfunktionen.
Ich kenne leider auch kein PHP. aber das brauchen wir für den Himel eh nicht.

[code lang=html]
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="de" lang="de">

<head>
  <!-- ... -->
</head>

<body>

Soweit so gut. Nehm ich mal an.

<?php
    $name = $_POST["name"];

Hier ist das erste Problem.
Hast du dir überlegt, dass genau diese Zuweisung eine Variable erzeugen kann, die es vorher gar nicht gab?

in Perl müsste ich schreiben:
if exists $post{name}{ ... }

du müsstest wohl in PHP fargen:
if( isset $_POST['name'] ){ ... }

Was macht ein Browser, wenn in einem Feld kein Wert angegeben wird?
Übertägt der Browser überhaupt den Parameter?
Das tut er in der Regel nicht.
Darum wird auf folgenden Anweisung:

if ($name=="" OR $comments=="")
      {
        echo "";
      }

Gar nicht effizient sein.

else
      {

Damit kommen wir zum bösen Userinput.
Du hast da ein file vom typ txt.
Das verwaltet records mit Daten, die ein Datensatztrennzeichen brauchen.
Ich komme darauf zurück.

$posting = "<p>$name schrieb:</p>\n\n  <p>$comments</p>\n\n  ";

Das ist die schlechte variante von
  $posting = '<p>' . $name . " schrieb:</p>\n\n  <p>" . $comments . "</p>\n\n  ";

Der Grund "text $var text" erzwingt eine Konversion einer Variable, bevor sie mit dem anderen konkateniert wird.

$posts = fopen("posts.txt","a");

Was geschieht wenn das File nicht geöffnet werden kann?
wahrscheinlich sollte es heissen:
fopen('file.txt') or die('Shit happens');

fwrite($posts, $posting);

Hier schreibst du deinen ungeprüften input in eine File, und jeder Poster kann dir dein File vermasseln.

fclose($posts);
      }

$give = implode("",file("posts.txt"));

An diesem Punkt bemerkst du selbst, dass du in XHTML entities maskieren musst. Tue es.

Der Rest sieht für einen Entwurf akzeptabel aus.

echo $give;
  ?>

mfg Beat

--
                 /|
  <°)))o><      / |    /|
            ---- _|___/ |     ><o(((°>
           OvVVvO    __ |         ><o(((°>
<°)))o><  /v    v\/  |
 <°)))o>< ^    ^/_/_         ><o(((°>
           ^^^^/___/
><o(((°>    ----       ><o(((°>
   <°)))o><                      ><o(((°>o