Subversion Repositories php_guestbook

Rev

Rev 10 | Blame | Compare with Previous | Last modification | View Log | RSS feed

  1. <?php
  2.  
  3. # ViaThinkSoft PHP Guestbook 2.9.1
  4. # (C) 2003-2024 ViaThinkSoft, Daniel Marschall
  5. # Licensed under the Apache 2.0 License
  6.  
  7. // Version des Gästebuchs
  8. $version = '2.9.1';
  9.  
  10. // START DEFAULT WERTE
  11.  
  12. $charset = 'ISO-8859-1';
  13.  
  14. // Der Titel der Seite
  15. $seitentitel = 'Mein Gästebuch';
  16.  
  17. // Seitenkopf
  18. $seitenkopf = '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
  19.        "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  20.  
  21. <html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
  22.  
  23. <head>
  24.        <meta http-equiv="Content-Type" content="text/html; charset={CHARSET}" />
  25.         <title>'.htmlentities($seitentitel).' G&auml;stebuch</title>
  26. </head>
  27.  
  28. <body>';
  29.  
  30. // Seitenfuß
  31. $seitenfuss = '</body></html>';
  32.  
  33. // Farben
  34. $farbe1 = '#505080';    // Rand eines Eintrags
  35. $farbe2 = '#D2DAF0';    // Eintrag Segment 2 (Text) BG
  36. $farbe3 = '#A0B1E0';    // Eintrag Segment 1 (Kopfzeile) BG
  37. $farbe4 = '#333333';    // Erstellungsdatum Schrift
  38. $farbe5 = '#E2E7F5';    // Eintrag Segment 3 (Admin-Kommentar, optional) BG
  39. $farbe6 = 'red';        // Fehlermeldung
  40. $farbe7 = 'blue';       // Pflichtfeld-Stern
  41. $farbe8 = 'green';      // Erfolgsmeldung
  42. $farbe9  = 'black';     // Segment 1 (Kopfzeile) Text
  43. $farbe10 = 'black';     // Segment 2 (Text) Text
  44. $farbe11 = 'black';     // Segment 3 (Admin-Kommentar, optional) Text
  45.  
  46. // Die MySQL-Zugangsdaten
  47. $mysql_server   = 'localhost';
  48. $mysql_user     = 'root';
  49. $mysql_pass     = '';
  50. $mysql_database = 'guestbook';
  51.  
  52. // Die Datenbanktabellennamen
  53. $table_entries = 'gaestebuch_entries';
  54. $table_smileys = 'gaestebuch_smileys';
  55.  
  56. // E-Mail-Adresse
  57. $adminmail = 'your_email_address@example.com';
  58. $adminmail_cc = '';
  59.  
  60. // Einträge pro Seite
  61. $eintraege_proseite = 10;
  62.  
  63. // Vorsicht: Der Server muss autorisiert sein, eine E-Mail zu über diese Domain zu senden (SPF/DKIM)
  64. $cfg_from_email = 'noreply@example.com';
  65.  
  66. // Features
  67. $cfg_feature_simple_antispam   = true;
  68. $cfg_automatisch_freischalten  = false;
  69. $cfg_unfreigeschaltete_anzegen = false;
  70. $cfg_vorschau                  = true;
  71.  
  72. // Recaptcha - This is the most secure Captcha
  73. // It also helps against "F5" spamming!
  74. // Get a FREE API key here: https://www.google.com/recaptcha/admin/create
  75. $cfg_recaptcha_enabled = false;
  76. $cfg_recaptcha_pubkey  = '';
  77. $cfg_recaptcha_privkey = '';
  78.  
  79. // ENDE DEFAULT WERTE
  80.  
  81. if (!file_exists(__DIR__ . '/config/config.inc.php')) {
  82.         die('ERROR: File <b>config/config.inc.php</b> does not exist. Please create it using <b>config/config.original.inc.php</b>');
  83. }
  84. require_once __DIR__ . '/config/config.inc.php';
  85.  
  86. if ($cfg_recaptcha_enabled) $cfg_feature_simple_antispam = false;
  87.  
  88. require_once __DIR__ . '/includes/database.inc.php';
  89. verbinden();
  90.  
  91. require_once __DIR__ . '/includes/SecureMailer.class.php';
  92. require_once __DIR__ . '/includes/ip_functions.inc.php';
  93.  
  94. if ($cfg_recaptcha_enabled) {
  95.         require_once __DIR__ . '/includes/recaptcha/src/autoload.php';
  96. }
  97.  
  98. # ------------------------------
  99.  
  100. // Funktion zum sichern von E-Mail-Adressen
  101. // $crypt_linktext = 0
  102. // --> geeignet für <img>-links, da $linktext nicht in ASCII übersetzt wird!
  103. // $crypt_linktext = 1
  104. // --> geeignet für text-links für höhere Sicherheit
  105.  
  106. function secure_email($email, $linktext, $crypt_linktext) {
  107.         $aus = '';
  108.         if ($email != '') {
  109.                 $aus .= '<script language="JavaScript" type="text/javascript">
  110. <!--
  111.         document.write("<a href=\"");'."\n";
  112.  
  113.                 $gesamttext = 'mailto:'.$email;
  114.                 for ($i=0; $i<strlen($gesamttext); $i++) {
  115.                         $aus .= '  document.write("&#'.ord(substr($gesamttext, $i, 1)).';");'."\n";
  116.                 }
  117.  
  118.                 $aus .= '  document.write("\">");'."\n";
  119.  
  120.                 if ($crypt_linktext == '1') {
  121.                         $gesamttext = $linktext;
  122.                         for ($i=0; $i<strlen($gesamttext); $i++) {
  123.                                 $aus .= '  document.write("&#'.ord(substr($gesamttext, $i, 1)).';");'."\n";
  124.                         }
  125.                 } else {
  126.                         $gesamttext = str_replace('"', '\"', $linktext);
  127.                         $aus .= '  document.write("'.$gesamttext.'");';
  128.                 }
  129.  
  130.                 $aus .= '  document.write("<\/a>");
  131. // -->
  132. </script>';
  133.         }
  134.  
  135.         return $aus;
  136. }
  137.  
  138. function myhtmlentities($nachricht) {
  139.         global $charset;
  140.         return htmlentities($nachricht, ENT_COMPAT | ENT_XHTML, $charset);
  141. }
  142.  
  143. function parse_html($nachricht, $loc_dir = '') {
  144.         global $table_smileys;
  145.  
  146.         // Smiley pre-parsing
  147.         $uid = uniqid();
  148.         $result = db_query("SELECT `zeichen`, `image`, `beschreibung`, `id` FROM `".db_real_escape_string($table_smileys)."` WHERE `enabled` = '1' ORDER BY `id` ASC");
  149.         while ($row = db_fetch_object($result)) {
  150.                 # $nachricht = str_replace($row->zeichen, '<img src="images/smileys/'.$row->image.'" alt="'.myhtmlentities($row->beschreibung).'" title="'.myhtmlentities($row->beschreibung).'" />', $nachricht);
  151.                 $nachricht = str_replace($row->zeichen, "\nSMILEY{$uid}:".$row->id.":{$uid}YELIMS\n", $nachricht);
  152.         }
  153.  
  154.         // HTML Parsing
  155.         $nachricht = myhtmlentities($nachricht);
  156. # Damit funktioniert wordwrap() nicht gescheit, was für den Mailverkehr wichtig ist. außerdem gibt es dann keinen umbruch in der voransicht
  157. #       $nachricht = str_replace(' ', '&nbsp;', $nachricht);
  158. # TODO: man sollte ' '->&nbsp; erst ersetzen, wenn es mehr als 1 leerzeichen ist
  159.         $nachricht = nl2br($nachricht);
  160.         $nachricht = str_replace('<br>', '<br />', $nachricht); // to be sure
  161.         $nachricht = str_replace('<BR>', '<br />', $nachricht); // to be sure
  162.  
  163.         // Linkanalyse von phpBB
  164.         $nachricht = ' ' . $nachricht;
  165.         $nachricht = preg_replace("#([\t\r\n ])([a-z0-9]+?){1}://([\w\-]+\.([\w\-]+\.)*[\w]+(:[0-9]+)?(/[^ \"\n\r\t<]*)?)#i", '\1<a href="\2://\3" target="_blank">\2://\3</a>', $nachricht);
  166.         $nachricht = preg_replace("#([\t\r\n ])(www|ftp)\.(([\w\-]+\.)*[\w]+(:[0-9]+)?(/[^ \"\n\r\t<]*)?)#i", '\1<a href="http://\2.\3" target="_blank">\2.\3</a>', $nachricht);
  167.         $nachricht = preg_replace("#([\n ])([a-z0-9\-_.]+?)@([\w\-]+\.([\w\-\.]+\.)*[\w]+)#i", "\\1<a href=\"mailto:\\2@\\3\">\\2@\\3</a>", $nachricht);
  168.         $nachricht = substr($nachricht, 1);
  169.  
  170.         // Final smiley parsing
  171.         $result = db_query("SELECT `zeichen`, `image`, `beschreibung`, `id` FROM `".db_real_escape_string($table_smileys)."` WHERE `enabled` = '1' ORDER BY `id` ASC");
  172.         while ($row = db_fetch_object($result)) {
  173.                 $nachricht = str_replace("<br />\nSMILEY{$uid}:".$row->id.":{$uid}YELIMS<br />\n", '<img src="'.$loc_dir.'images/smileys/'.$row->image.'" alt="'.myhtmlentities($row->beschreibung).'" title="'.myhtmlentities($row->beschreibung).'" />', $nachricht);
  174.         }
  175.  
  176.         return $nachricht;
  177. }
  178.  
  179. function anznachricht($name, $ort, $email, $home, $nachricht, $kommentar, $zeit, $datum) {
  180.         global $farbe1, $farbe2, $farbe3, $farbe4, $farbe5, $farbe6, $farbe7, $farbe8, $farbe9, $farbe10, $farbe11, $this_dir;
  181.  
  182.         $zzeit = explode(":", $zeit);
  183.         $zzeit = $zzeit[0].".".$zzeit[1];
  184.         $ddatum = explode("-", $datum);
  185.         $ddatum = $ddatum[2].".".$ddatum[1].".".$ddatum[0];
  186.         $nachricht = parse_html($nachricht, $this_dir);
  187.  
  188.         echo '<table border="1" cellpadding="5" cellspacing="0" width="100%" style="border-color:'.$farbe1.';border-collapse:collapse">';
  189.         echo '  <tr>';
  190.         echo '    <td width="100%" bgcolor="'.$farbe3.'" style="border-color:'.$farbe1.';border-collapse:collapse">';
  191.         echo '    <table border="0" cellpadding="0" cellspacing="0" width="100%" style="color:'.$farbe9.'">';
  192.         echo '      <tr>';
  193.         echo '        <td width="75%" align="left"><b>'.myhtmlentities($name).'</b>';
  194.         if ($ort != '') echo ' aus '.myhtmlentities($ort);
  195.         echo '</td>';
  196.         echo '        <td width="5%">&nbsp;</td>';
  197.         echo '        <td width="20%" align="right">';
  198.         if ($email != '') {
  199.                 echo secure_email(myhtmlentities($email), '<img src="images/email.gif" border="0" height="18" width="17" alt="E-Mail-Adresse" title="E-Mail-Adresse" />', 0);
  200.         }
  201.         if ($home != '') {
  202.                 echo '      <a href="'.myhtmlentities($home).'" target="_blank"><img src="images/homepage.gif" border="0" height="18" width="16" alt="Homepage" title="Homepage" /></a>';
  203.         }
  204.         echo '</td></tr></table></td></tr>';
  205.         echo '<tr><td width="100%" bgcolor="'.$farbe2.'" style="color:'.$farbe10.'" align="left">'.$nachricht.'<br /><br /><font size="2" color="'.$farbe4.'">Dieser Eintrag wurde am '.$ddatum.' um '.$zzeit.' Uhr erstellt.</font></td></tr>';
  206.         if ($kommentar != '') {
  207.                 $kommentar = parse_html($kommentar, $this_dir);
  208.                 echo '<tr><td width="100%" bgcolor="'.$farbe5.'" style="color:'.$farbe11.'" align="left"><b>Kommentar des Seiteneigent&uuml;mers:</b><br /><br />'.$kommentar.'</td></tr>';
  209.         }
  210.         echo '</table><br />';
  211. }
  212.  
  213. # --------------------------
  214.  
  215. # http://stackoverflow.com/questions/1175096/how-to-find-out-if-you-are-using-https-without-serverhttps
  216. $is_https = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off' || $_SERVER['SERVER_PORT'] == 443);
  217.  
  218. $proto = $is_https ? 'https' : 'http';
  219. $inphp = $proto.'://'.$_SERVER['HTTP_HOST'].$_SERVER['SCRIPT_NAME'];
  220. $this_dir = dirname($inphp).'/';
  221.  
  222. $seitenkopf = str_replace('{CHARSET}', $charset, $seitenkopf);
  223. echo $seitenkopf;
  224.  
  225. // Vor der Vorschau alles prüfen
  226. $err_name      = false;
  227. $err_nachricht = false;
  228. $err_email     = false;
  229. $err_homepage  = false;
  230. $err_antispam  = false;
  231. $relfehler     = '';
  232.  
  233. $view_vorschau     = isset($_REQUEST['action']) && ($_REQUEST['action'] == 'vorschau');
  234. $view_abschicken   = isset($_REQUEST['action']) && ($_REQUEST['action'] == 'abschicken');
  235. $view_eintrag      = isset($_REQUEST['action']) && ($_REQUEST['action'] == 'eintrag');
  236. $view_freischalten = isset($_REQUEST['action']) && ($_REQUEST['action'] == 'freischalten');
  237.  
  238. $name      = (isset($_POST['name'])      ? trim($_POST['name'])      : '');
  239. $ort       = (isset($_POST['ort'])       ? trim($_POST['ort'])       : '');
  240. $email     = (isset($_POST['email'])     ? trim($_POST['email'])     : '');
  241. $homepage  = (isset($_POST['homepage'])  ? trim($_POST['homepage'])  : '');
  242. $nachricht = (isset($_POST['nachricht']) ? trim($_POST['nachricht']) : '');
  243. $antispam  = (isset($_POST['antispam'])  ? trim($_POST['antispam'])  : '');
  244. $kommentar = '';
  245.  
  246. # -----------------------------------
  247.  
  248. function md5_valid($id, $md5_message) {
  249.         // TODO: solve using hash_hmac and a secret in the configuration or database. the message is not a secret,
  250.         // since it can be controlled by a spammer!
  251.         global $table_entries;
  252.         return md5($table_entries.'-'.$id.'-'.$md5_message.'-GBINT');
  253. }
  254.  
  255. # -----------------------------------
  256.  
  257. if ($view_freischalten) {
  258.         $id  = isset($_REQUEST['id'])  ? $_REQUEST['id']  : '';
  259.         $md5 = isset($_REQUEST['md5']) ? $_REQUEST['md5'] : '';
  260.  
  261.         echo '<h1>G&auml;stebucheintrag freischalten</h1>';
  262.  
  263.         if (($id == '') || ($md5 == '')) {
  264.                 die('<p><font color="'.$farbe6.'">Ein Fehler ist aufgetreten. Fehler in den Parametern.</font></p>'.$seitenfuss);
  265.         }
  266.  
  267.         $result = db_query("SELECT `show`, `nachricht` FROM `".db_real_escape_string($table_entries)."` WHERE `id` = '".db_real_escape_string($id)."'");
  268.         if ($row = db_fetch_object($result)) {
  269.                 if ($row->show == 1) {
  270.                         echo '<p><font color="'.$farbe8.'">Eintrag ist bereits freigeschaltet!</font></p>';
  271.                 } else {
  272.                         $md5_valid = md5_valid($id, md5($row->nachricht));
  273.                         if (strtolower($md5) == strtolower($md5_valid)) {
  274.                                 db_query("UPDATE `".db_real_escape_string($table_entries)."` SET `show` = '1' WHERE `id` = '".db_real_escape_string($id)."'");
  275.                                 echo '<p><font color="'.$farbe8.'">Eintrag erfolgreich freigeschaltet!</font></p>';
  276.                         } else {
  277.                                 echo '<p><font color="'.$farbe6.'">Keine Berechtigung, den Eintrag freizuschalten!</font></p>';
  278.                         }
  279.                 }
  280.         }
  281.  
  282.         die($seitenfuss);
  283. }
  284.  
  285. if ($cfg_feature_simple_antispam) {
  286.         // NG: erster block der IP adresse hinzufügen
  287.         $antispam_awaiting = (date('d')-15) * (2+date('m')) * 2 + 1337 + date('Y');
  288. }
  289.  
  290. if (($view_vorschau) || ($view_abschicken)) {
  291.         // Name prüfen
  292.         if ($name == '') $err_name = true;
  293.  
  294.         // Nachricht prüfen
  295.         if ($nachricht == '') $err_nachricht = true;
  296.  
  297.         // E-Mail-Adresse prüfen, wenn angegeben
  298.         if ((!preg_match('/^[a-z0-9\.\-_\+]+@[a-z0-9\-_]+\.([a-z0-9\-_]+\.)*?[a-z]+$/is', $email)) && ($email != '')) $err_email = true;
  299.  
  300.         // Homepage prüfen, wenn angegeben
  301.         if ($homepage != '') {
  302.                 if (!preg_match('#^http[s]?:\/\/#i', $homepage)) {
  303.                         $homepage = 'http://' . $homepage;
  304.                 }
  305.                 if (!preg_match('#^http[s]?\\:\\/\\/[a-z0-9\-]+\.([a-z0-9\-]+\.)?[a-z]+#i', $homepage)) {
  306.                         $err_homepage = true;
  307.                 }
  308.         }
  309.  
  310.         // AntiSpam prüfen
  311.         if (($cfg_feature_simple_antispam) && ($antispam != $antispam_awaiting)) $err_antispam = true;
  312.  
  313.         // Fehler?
  314.         if (($err_name) || ($err_nachricht) || ($err_email) || ($err_homepage) || ($err_antispam)) {
  315.                 $relfehler = '<font color="'.$farbe6.'"><u>Fehler</u>: Es wurden nicht alle Pflichtfelder ausgef&uuml;llt oder einige Felder enthalten einen Fehler!</font>';
  316.         }
  317.  
  318.         if (!$relfehler) {
  319.                 $datum = date('Y-m-d');
  320.                 $zeit  = date('H:i:s');
  321.                 $ip    = get_real_ip(); // $_SERVER['REMOTE_ADDR'];
  322.                 $host  = gethostbyaddr($ip);
  323.                 $whois_service = "https://whois.viathinksoft.de/whois/$ip";
  324.  
  325.                 if ($view_vorschau) {
  326.                         echo '<h1>G&auml;stebucheintrag Vorschau</h1>';
  327.                         echo '<div align="center">';
  328.  
  329.                         anznachricht($name, $ort, $email, $homepage, $nachricht, $kommentar, $zeit, $datum);
  330.  
  331.                         echo "<table cellspacing=\"0\" cellpadding=\"0\" border=\"0\"><tr>\n";
  332.  
  333.                         echo "<td>\n";
  334.                         echo "<form action=\"$inphp\" method=\"post\" name=\"frm2\">\n";
  335.                         echo "<input type=\"hidden\" name=\"action\" value=\"eintrag\" />\n";
  336.                         echo "<input type=\"hidden\" name=\"name\" value=\"".myhtmlentities($name)."\" />\n";
  337.                         echo "<input type=\"hidden\" name=\"ort\" value=\"".myhtmlentities($ort)."\" />\n";
  338.                         echo "<input type=\"hidden\" name=\"email\" value=\"".myhtmlentities($email)."\" />\n";
  339.                         echo "<input type=\"hidden\" name=\"homepage\" value=\"".myhtmlentities($homepage)."\" />\n";
  340.                         echo "<input type=\"hidden\" name=\"nachricht\" value=\"".myhtmlentities($nachricht)."\" />\n";
  341.                         if ($cfg_feature_simple_antispam) echo "<input type=\"hidden\" name=\"antispam\" value=\"".myhtmlentities($antispam)."\" />\n";
  342.                         echo "<a href=\"javascript:document.frm2.submit()\"><img src=\"images/buttons/aendern.gif\" border=\"0\" height=\"31\" width=\"146\" alt=\"&Auml;ndern\" title=\"&Auml;ndern\" /></a>";
  343.                         echo "</form>";
  344.                         echo "</td>";
  345.  
  346.                         echo "<td><img src=\"images/spacer.gif\" height=\"1\" width=\"30\" alt=\"\" /></td>";
  347.  
  348.                         echo "<td>\n";
  349.                         echo "<form action=\"$inphp\" method=\"post\" name=\"frm1\">\n";
  350.                         echo "<input type=\"hidden\" name=\"action\" value=\"abschicken\" />\n";
  351.                         echo "<input type=\"hidden\" name=\"name\" value=\"".myhtmlentities($name)."\" />\n";
  352.                         echo "<input type=\"hidden\" name=\"ort\" value=\"".myhtmlentities($ort)."\" />\n";
  353.                         echo "<input type=\"hidden\" name=\"email\" value=\"".myhtmlentities($email)."\" />\n";
  354.                         echo "<input type=\"hidden\" name=\"homepage\" value=\"".myhtmlentities($homepage)."\" />\n";
  355.                         echo "<input type=\"hidden\" name=\"nachricht\" value=\"".myhtmlentities($nachricht)."\" />\n";
  356.                         if ($cfg_feature_simple_antispam) echo "<input type=\"hidden\" name=\"antispam\" value=\"".myhtmlentities($antispam)."\" />\n";
  357.                         echo "<a href=\"javascript:document.frm1.submit()\"><img src=\"images/buttons/abschicken.gif\" border=\"0\" height=\"31\" width=\"146\" alt=\"Abschicken\" title=\"Abschicken\" /></a>";
  358.                         echo "</form>";
  359.                         echo "</td>";
  360.  
  361.                         echo "</tr></table></div>\n";
  362.                 } elseif ($view_abschicken) {
  363.                         $pass_final_recaptcha = true;
  364.                         if ($cfg_recaptcha_enabled) {
  365.                                 if (!isset($_POST['g-recaptcha-response'])) {
  366.                                         $pass_final_recaptcha = false;
  367.                                 } else {
  368.                                         $recaptcha = new \ReCaptcha\ReCaptcha($cfg_recaptcha_privkey);
  369.                                         $resp = $recaptcha->verify($_POST['g-recaptcha-response'], $_SERVER['REMOTE_ADDR']);
  370.                                         $pass_final_recaptcha = $resp->isSuccess();
  371.                                 }
  372.                         }
  373.  
  374.                         if (!$pass_final_recaptcha) {
  375.                                 echo '<h1>Bitte Sicherheitsfrage beantworten</h1>';
  376.                                 echo '<p>Bitte tippen Sie den dargestellten Code ab. Dadurch wird sichergestellt dass Sie ein Mensch und kein Spam-Bot sind.</p>';
  377.  
  378.                                 echo "<form action=\"$inphp\" method=\"post\" name=\"frm1\">\n";
  379.  
  380.                                 echo '<div class="g-recaptcha" data-sitekey="'.$cfg_recaptcha_pubkey.'"></div>';
  381.                                 echo '<script type="text/javascript" src="https://www.google.com/recaptcha/api.js"></script>';
  382.                                 echo '<br>';
  383.  
  384.                                 echo "<input type=\"hidden\" name=\"action\" value=\"abschicken\" />\n";
  385.                                 echo "<input type=\"hidden\" name=\"name\" value=\"".myhtmlentities($name)."\" />\n";
  386.                                 echo "<input type=\"hidden\" name=\"ort\" value=\"".myhtmlentities($ort)."\" />\n";
  387.                                 echo "<input type=\"hidden\" name=\"email\" value=\"".myhtmlentities($email)."\" />\n";
  388.                                 echo "<input type=\"hidden\" name=\"homepage\" value=\"".myhtmlentities($homepage)."\" />\n";
  389.                                 echo "<input type=\"hidden\" name=\"nachricht\" value=\"".myhtmlentities($nachricht)."\" />\n";
  390.                                 if ($cfg_feature_simple_antispam) echo "<input type=\"hidden\" name=\"antispam\" value=\"".myhtmlentities($antispam)."\" />\n";
  391.                                 echo "<a href=\"javascript:document.frm1.submit()\"><img src=\"images/buttons/abschicken.gif\" border=\"0\" height=\"31\" width=\"146\" alt=\"Abschicken\" title=\"Abschicken\" /></a>";
  392.                                 echo "</form>";
  393.                         } else {
  394.                                 $daten  = "'".db_real_escape_string($name)."'";
  395.                                 $felder = '`name`';
  396.  
  397.                                 if ($ort != '') {
  398.                                         $daten  .= ", '".db_real_escape_string($ort)."'";
  399.                                         $felder .= ', `ort`';
  400.                                 }
  401.  
  402.                                 if ($email != '') {
  403.                                         $daten  .= ", '".db_real_escape_string($email)."'";
  404.                                         $felder .= ', `email`';
  405.                                 }
  406.  
  407.                                 if ($homepage != '') {
  408.                                         $daten  .= ", '".db_real_escape_string($homepage)."'";
  409.                                         $felder .= ', `homepage`';
  410.                                 }
  411.  
  412.                                 $daten  .= ", '".db_real_escape_string("$datum $zeit")."'";
  413.                                 $felder .= ', `timestamp`';
  414.  
  415.                                 $daten  .= ", '".db_real_escape_string($ip)."'";
  416.                                 $felder .= ', `ip`';
  417.  
  418.                                 $daten  .= ", '".db_real_escape_string($nachricht)."'";
  419.                                 $felder .= ', `nachricht`';
  420.  
  421.                                 $show = $cfg_automatisch_freischalten ? '1' : '0';
  422.                                 $daten  .= ", '".db_real_escape_string($show)."'";
  423.                                 $felder .= ', `show`';
  424.  
  425.                                 $result = db_query("INSERT INTO `".db_real_escape_string($table_entries)."` ($felder) VALUES ($daten)");
  426.                                 $id = db_insert_id();
  427.  
  428.                                 $md5 = md5($nachricht);
  429.                                 $md5_valid = md5_valid($id, $md5);
  430.  
  431.                                 // Send mail
  432.  
  433.                                 $ger_datum = date('d.m.Y', strtotime($datum));
  434.  
  435.                                 $msg_html  = "<h1>".myhtmlentities($seitentitel)." - G&auml;stebucheintrag</h1>\n";
  436.                                 $msg_html .= "<b>Name:</b> ".myhtmlentities($name)."<br />\n";
  437.                                 $msg_html .= "<b>E-Mail:</b> ".myhtmlentities($email)."<br />\n";
  438.                                 $msg_html .= "<b>Ort:</b> ".myhtmlentities($ort)."<br />\n";
  439.                                 $msg_html .= "<b>Homepage:</b> ".myhtmlentities($homepage)."<br />\n";
  440.                                 $msg_html .= "<b>Datum:</b> $ger_datum<br />\n";
  441.                                 $msg_html .= "<b>Uhrzeit:</b> $zeit<br />\n";
  442.                                 $msg_html .= "<br />\n";
  443.                                 $msg_html .= "<b>Nachricht:</b> ".parse_html($nachricht, $this_dir)."<br />\n";
  444.                                 $msg_html .= "<br />\n";
  445.                                 $msg_html .= "<i>Datensatz Nr. $id wurde erstellt.</i><br />\n";
  446.                                 $msg_html .= "<br />\n";
  447.                                 $msg_html .= "<font size=\"+1\"><b>Absenderdaten:</b></font><br />\n";
  448.                                 $msg_html .= "<br />\n";
  449.                                 $msg_html .= "<b>IP-Adresse:</b> <a href=\"$whois_service\" target=\"_blank\">$ip</a> ($host)<br />\n";
  450.                                 $msg_html .= "<b>Browser:</b> ".$_SERVER['HTTP_USER_AGENT']."<br />\n";
  451.                                 $msg_html .= "<br />\n";
  452.                                 if (!$cfg_automatisch_freischalten) {
  453.                                         $msg_html .= '<i>Klicken Sie <a href="'."$inphp?action=freischalten&amp;id=$id&amp;md5=".urlencode($md5_valid).'" target="_blank">hier</a>, um den Eintrag freizuschalten. Schalten Sie den Eintrag nicht frei, so bleibt er unver&ouml;ffentlicht.</i><br />'."\n";
  454.                                 }
  455.  
  456.                                 $msg_plain  = "$seitentitel - Gästebucheintrag\n\n";
  457.                                 $msg_plain .= "Name: $name\n";
  458.                                 $msg_plain .= "E-Mail: $email\n";
  459.                                 $msg_plain .= "Ort: $ort\n";
  460.                                 $msg_plain .= "Homepage: $homepage\n";
  461.                                 $msg_plain .= "Datum: $ger_datum\n";
  462.                                 $msg_plain .= "Uhrzeit: $zeit\n";
  463.                                 $msg_plain .= "\n";
  464.                                 $msg_plain .= "Nachricht: $nachricht\n";
  465.                                 $msg_plain .= "\n";
  466.                                 $msg_plain .= "Datensatz Nr. $id wurde erstellt.\n";
  467.                                 $msg_plain .= "\n";
  468.                                 $msg_plain .= "Absenderdaten:\n";
  469.                                 $msg_plain .= "\n";
  470.                                 $msg_plain .= "IP-Adresse: $ip ($host) - Whois-Lookup at $whois_service\n";
  471.                                 $msg_plain .= "Browser: ".$_SERVER['HTTP_USER_AGENT']."\n";
  472.                                 $msg_plain .= "\n";
  473.                                 if (!$cfg_automatisch_freischalten) {
  474.                                         $msg_plain .= "Öffnen Sie $inphp?action=freischalten&id=$id&md5=".urlencode($md5_valid)." , um den Eintrag freizuschalten. Schalten Sie den Eintrag nicht frei, so bleibt er unver&ouml;ffentlicht.\n";
  475.                                 }
  476.  
  477.                                 $h = new SecureMailer(); // Includes Anti Mail-Header-Injection
  478.  
  479. /*
  480.                                 # http://www.phpbox.de/tipsundtricks/emailsumlaute.php
  481.                                 $h->addHeader('Mime-Version', '1.0');
  482.                                 $h->addHeader('Content-Type', 'text/html; charset='.$charset);
  483.  
  484.                                 $h->addHeader('Content-Transfer-Encoding', 'quoted-printable');
  485. #                               $msg_html = wordwrap($msg_html);
  486. #                               $msg_html = quoted_printable_encode($msg_html);
  487.                                 $msg_html = quoted_printable_encode2($msg_html);
  488. */
  489.  
  490.                                 if ($cfg_from_email != '') {
  491.                                         $h->addHeader('From',     $cfg_from_email);
  492.                                 }
  493.                                 if ($email != '') {
  494.                                         $h->addHeader('Reply-To', $email);
  495.                                 }
  496.  
  497.                                 if ($adminmail_cc != '') {
  498.                                         $h->addHeader('CC', $adminmail_cc);
  499.                                 }
  500.  
  501.                                 $h->addHeader('X-Mailer', 'PHP/'.phpversion());
  502.  
  503.                                 $subject = "$seitentitel - Gästebucheintrag";
  504.                                 $subject = SecureMailer::utf8Subject($subject);
  505.  
  506. #                               $gesendet = $h->sendMail($adminmail, $subject, $msg_html);
  507.                                 $gesendet = $h->sendMailHTMLandPlainMultipart($adminmail, $subject, $msg_html, $msg_plain);
  508.  
  509.                                 if (!$gesendet) {
  510.                                         echo '<p><font color="'.$farbe6.'">FEHLER BEIM SENDEN DER MAIL!</font></p>';
  511.                                 }
  512.  
  513.                                 if ($result) {
  514.                                         echo '<h1 align="center">G&auml;stebucheintrag abgeschickt</h1>
  515.  
  516. <div align="center">
  517.  
  518. <p><font color="'.$farbe8.'">Ihr G&auml;stebucheintrag wurde erfolgreich eingetragen!</font></p>
  519.  
  520. <p>Bitte beachten Sie, dass der Eintrag erst nach einer Pr&uuml;fung des Seiteninhabers freigeschaltet wird.</p>
  521.  
  522. <p><a href="'.$inphp.'"><img src="images/buttons/zurueck.gif" alt="Zur&uuml;ck" title="Zur&uuml;ck" height="31" width="146" border="0" /></a></p>
  523.  
  524. </div>';
  525.  
  526.                                 } else {
  527.                                         echo "<p>".db_error()."</p>";
  528.                                         echo '<p><font color="'.$farbe6.'">Es ist ein schwerer Fehler aufgetreten. Versuchen Sie es nocheinmal.</font></p>';
  529.                                 }
  530.                         }
  531.                 }
  532.         }
  533. }
  534.  
  535. if ($relfehler || $view_eintrag) {
  536.         echo '<h1>G&auml;stebucheintrag</h1>';
  537.  
  538.         echo '<p>Bitte f&uuml;llen Sie die unteren Felder aus. Die mit <font color="'.$farbe7.'">*</font> gekennzeichneten
  539.         Felder m&uuml;ssen ausgef&uuml;llt werden! Um Missbrauch zu vermeiden, wird die
  540.         IP-Adresse gespeichert.';
  541.         echo ' Die Eintr&auml;ge werden erst nach einer Pr&uuml;fung ver&ouml;ffentlicht.';
  542.         echo '</p>';
  543.  
  544.         if ($relfehler != '') {
  545.                 echo "<p>$relfehler</p>";
  546.         }
  547.  
  548.         echo '<br />
  549.  
  550. <form action="'.$inphp.'" method="post" name="frm">
  551. <input type="hidden" name="action" value="'.($cfg_vorschau ? 'vorschau' : 'abschicken').'" />
  552.  
  553. <table cellspacing="0" cellpadding="0" border="0">
  554.                 <tr>
  555.                         <td align="right">';
  556.  
  557.         if ($err_name) {
  558.                 echo '<font color="'.$farbe6.'">Name *:</font>';
  559.         } else {
  560.                 echo 'Name <font color="'.$farbe7.'">*</font>:';
  561.         }
  562.  
  563.         echo '</td>
  564.                         <td><img src="images/spacer.gif" height="1" width="10" alt="" /></td>
  565.                         <td><input maxlength="40" size="66" name="name" value="'.$name.'" /></td>
  566.                 </tr>
  567.                 <tr>
  568.                         <td align="right">Wohnort:</td>
  569.                         <td><img src="images/spacer.gif" height="1" width="10" alt="" /></td>
  570.                         <td><input maxlength="40" size="66" name="ort" value="'.$ort.'" /></td>
  571.                 </tr>
  572.                 <tr>
  573.                         <td align="right">';
  574.  
  575.         if ($err_email) {
  576.                 echo '<font color="'.$farbe6.'">E-Mail:</font>';
  577.         } else {
  578.                 echo 'E-Mail:';
  579.         }
  580.  
  581.         echo '</td>
  582.                         <td><img src="images/spacer.gif" height="1" width="10" alt="" /></td>
  583.                         <td><input maxlength="40" size="66" name="email" value="'.$email.'" /></td>
  584.                 </tr>
  585.                 <tr>
  586.                         <td align="right">';
  587.  
  588.         if ($err_homepage) {
  589.                 echo '<font color="'.$farbe6.'">Homepage:</font>';
  590.         } else {
  591.                 echo 'Homepage:';
  592.         }
  593.  
  594.         echo '</td>
  595.                         <td><img src="images/spacer.gif" height="1" width="10" alt="" /></td>
  596.                         <td><input maxlength="40" size="66" name="homepage" value="'.$homepage.'" /></td>
  597.                 </tr>
  598.                 <tr>
  599.                         <td colspan="3">&nbsp;</td>
  600.                 </tr>';
  601.  
  602.         if ($cfg_feature_simple_antispam) {
  603.                 echo '<tr>
  604.                         <td align="right">';
  605.  
  606.                 if ($err_antispam) {
  607.                         echo '<font color="'.$farbe6.'">Bitte <!--&quot;-->'.$antispam_awaiting.'<!--&quot;--> eingeben *:</font>';
  608.                 } else {
  609.                         echo 'Bitte <!--&quot;-->'.$antispam_awaiting.'<!--&quot;--> eingeben <font color="'.$farbe7.'">*</font>:';
  610.                 }
  611.  
  612.                 echo '</td>
  613.                         <td><img src="images/spacer.gif" height="1" width="10" alt="" /></td>
  614.                         <td><input maxlength="40" size="66" name="antispam" value="'.$antispam.'" /> (AntiSpam-Frage)</td>
  615.                 </tr>
  616.  
  617.                 <tr>
  618.                         <td colspan="3">&nbsp;</td>
  619.                 </tr>';
  620.         }
  621.  
  622.         echo '<tr>
  623.                         <td align="right">Smileys:</td>
  624.                         <td><img src="images/spacer.gif" height="1" width="10" alt="" /></td>
  625.                         <td><script language="JavaScript" type="text/javascript">
  626.                 <!--
  627.                 function setsmiley(smiley) {
  628.                         frm.nachricht.value = frm.nachricht.value + smiley;
  629.                 }
  630.                 // -->
  631.                 </script>';
  632.  
  633.         $result = db_query("SELECT `zeichen`, `image`, `beschreibung` FROM `".db_real_escape_string($table_smileys)."` WHERE `enabled` = '1' AND `show_in_editor` = '1' ORDER BY `id` ASC");
  634.         while ($row = db_fetch_object($result)) {
  635.                 echo "<a href=\"javascript:setsmiley(' ".addslashes(myhtmlentities($row->zeichen))." ')\">".
  636.                 '<img src="images/smileys/'.$row->image.'" border="0" alt="'.myhtmlentities($row->beschreibung).'" title="'.myhtmlentities($row->beschreibung).'" /></a>&nbsp;';
  637.         }
  638.  
  639.         echo '</td>
  640.                 </tr>
  641.                 <tr>
  642.                         <td colspan="3">&nbsp;</td>
  643.                 </tr>
  644.                 <tr>
  645.                         <td valign="top" align="right">';
  646.  
  647.         if ($err_nachricht) {
  648.                 echo '<font color="'.$farbe6.'">Nachricht *:</font>';
  649.         } else {
  650.                 echo 'Nachricht <font color="'.$farbe7.'">*</font>:';
  651.         }
  652.  
  653.         echo '</td>
  654.                         <td><img src="images/spacer.gif" height="1" width="10" alt="" /></td>
  655.                         <td><textarea name="nachricht" rows="5" cols="50">'.$nachricht.'</textarea><!-- wrap="virtual" --></td>
  656.                 </tr>
  657.                 <tr>
  658.                         <td colspan="2"><img src="images/spacer.gif" height="1" width="10" alt="" /></td>
  659.                         <td><br />
  660.                         <a href="javascript:document.frm.submit()">';
  661.         if ($cfg_vorschau) {
  662.                 echo '<img height="31" alt="Vorschau" title="Vorschau" src="images/buttons/vorschau.gif" width="146" border="0" />';
  663.         } else {
  664.                 echo '<img src="images/buttons/abschicken.gif" border="0" height="31" width="146" alt="Abschicken" title="Abschicken" />';
  665.         }
  666.         echo '</a>              <!--
  667.                         <img src="images/spacer.gif" height="1" width="30" alt="" />
  668.                         <a href="javascript:document.frm.reset()">
  669.                         <img height="31" alt="L&ouml;schen" title="L&ouml;schen" src="images/buttons/loeschen.gif" width="146" border="0" /></a>
  670.                         -->
  671.                         </td>
  672.                 </tr>
  673.         </table>
  674.  
  675. </form>
  676.  
  677. <p align="center"><a href="'.$inphp.'">Zur&uuml;ck zu den Eintr&auml;gen</a></p>';
  678. } else if ((!$view_vorschau) && (!$view_abschicken) && (!$view_eintrag)) {
  679.         echo '<h1 align="center">G&auml;stebuch</h1>
  680.  
  681.         <table width="100%" border="0" cellspacing="0" cellpadding="0">
  682.         <tr>
  683.                 <td align="center">[ <a href="'.$inphp.'?action=eintrag">Neuen Eintrag hinzuf&uuml;gen</a> ]</td></tr></table><br />';
  684.  
  685.         $cond = ($cfg_unfreigeschaltete_anzegen) ? '' : " WHERE `show` = '1'";
  686.  
  687.         $result = db_query("SELECT * FROM `".db_real_escape_string($table_entries)."`$cond");
  688.         if ($result) $number = db_num_rows($result); else $number = 0;
  689.         $max_page = ceil($number / $eintraege_proseite);
  690.  
  691.         $seiten = $_REQUEST['seiten'] ?? '1';
  692.         $seiten = preg_replace('@[^0-9]@', '', $seiten);
  693.         if (((int)$seiten > $max_page) || ((int)$seiten < 0)) $seiten = '1';
  694.  
  695.         $result = db_query("SELECT * FROM `".db_real_escape_string($table_entries)."`$cond ORDER BY `id` DESC LIMIT ".((int)$seiten-1)*$eintraege_proseite.",".$eintraege_proseite);
  696.  
  697.         $keineeintraege = true;
  698.  
  699.         if ($result) {
  700.                 while ($row = db_fetch_object($result)) {
  701.                         $xry   = explode(' ', $row->timestamp);
  702.                         $datum = $xry[0];
  703.                         $zeit  = $xry[1];
  704.                         anznachricht($row->name, $row->ort, $row->email, $row->homepage, $row->nachricht, $row->kommentar, $zeit, $datum);
  705.                         $keineeintraege = false;
  706.                 }
  707.         }
  708.  
  709.         if ($keineeintraege) {
  710.                 echo '<div align="center">Es sind keine Eintr&auml;ge vorhanden!</div>';
  711.         }
  712.  
  713.         if ((!$keineeintraege) && ($max_page != 1)) {
  714.                 echo '<table cellspacing="0" cellpadding="0" border="0" width="100%"><tr><td align="center"><p class="klein2">Seite: ';
  715.                 for ($i=1; $i<=$max_page; $i++) {
  716.                         if ((int)$seiten != $i) {
  717.                                 echo "<a href=\"$inphp?seiten=$i\">[$i]</a>\n";
  718.                         } else {
  719.                                 echo "<b>[$i]</b>\n";
  720.                         }
  721.                 }
  722.                 echo '</p></td></tr></table>';
  723.         }
  724.  
  725. }
  726.  
  727. echo '<p align="center">OpenSource PHP-G&auml;stebuch von <a href="http://www.viathinksoft.de/" target="_blank">ViaThinkSoft</a>, Version '.$version.'</p>';
  728.  
  729. echo $seitenfuss;
  730.  
  731. # ---
  732.  
  733. // This is the only function which works with GMX.
  734. // wordwrap+quoted_printable_encode does not work, since it would insert whitespaces.
  735. // http://www.php.net/manual/en/function.quoted-printable-encode.php#97230
  736. function quoted_printable_encode2($input, $line_max = 75) {
  737.         $hex = array('0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F');
  738.         $lines = preg_split("/(?:\r\n|\r|\n)/", $input);
  739.         $linebreak = "=0D=0A=\r\n";
  740.         /* the linebreak also counts as characters in the mime_qp_long_line
  741.          * rule of spam-assassin */
  742.         $line_max = $line_max - strlen($linebreak);
  743.         $escape = "=";
  744.         $output = "";
  745.         $cur_conv_line = "";
  746.         $length = 0;
  747.         $whitespace_pos = 0;
  748.         $addtl_chars = 0;
  749.  
  750.         // iterate lines
  751.         for ($j=0; $j<count($lines); $j++) {
  752.                 $line = $lines[$j];
  753.                 $linlen = strlen($line);
  754.  
  755.                 // iterate chars
  756.                 for ($i = 0; $i < $linlen; $i++) {
  757.                         $c = substr($line, $i, 1);
  758.                         $dec = ord($c);
  759.  
  760.                         $length++;
  761.  
  762.                         if ($dec == 32) {
  763.                                         // space occurring at end of line, need to encode
  764.                                         if (($i == ($linlen - 1))) {
  765.                                                 $c = "=20";
  766.                                                 $length += 2;
  767.                                         }
  768.  
  769.                                         $addtl_chars = 0;
  770.                                         $whitespace_pos = $i;
  771.                         } elseif ( ($dec == 61) || ($dec < 32 ) || ($dec > 126) ) {
  772.                                         $h2 = floor($dec/16); $h1 = floor($dec%16);
  773.                                         $c = $escape . $hex[$h2] . $hex[$h1];
  774.                                         $length += 2;
  775.                                         $addtl_chars += 2;
  776.                         }
  777.  
  778.                         // length for wordwrap exceeded, get a newline into the text
  779.                         if ($length >= $line_max) {
  780.                                 $cur_conv_line .= $c;
  781.  
  782.                                 // read only up to the whitespace for the current line
  783.                                 $whitesp_diff = $i - $whitespace_pos + $addtl_chars;
  784.  
  785.                                 /* the text after the whitespace will have to be read
  786.                                  * again ( + any additional characters that came into
  787.                                  * existence as a result of the encoding process after the whitespace)
  788.                                  *
  789.                                  * Also, do not start at 0, if there was *no* whitespace in
  790.                                  * the whole line */
  791.                                 if (($i + $addtl_chars) > $whitesp_diff) {
  792.                                                 $output .= substr($cur_conv_line, 0, (strlen($cur_conv_line) - $whitesp_diff)) . $linebreak;
  793.                                                 $i =  $i - $whitesp_diff + $addtl_chars;
  794.                                         } else {
  795.                                                 $output .= $cur_conv_line . $linebreak;
  796.                                         }
  797.  
  798.                                 $cur_conv_line = "";
  799.                                 $length = 0;
  800.                                 $whitespace_pos = 0;
  801.                         } else {
  802.                                 // length for wordwrap not reached, continue reading
  803.                                 $cur_conv_line .= $c;
  804.                         }
  805.                 } // end of for
  806.  
  807.                 $length = 0;
  808.                 $whitespace_pos = 0;
  809.                 $output .= $cur_conv_line;
  810.                 $cur_conv_line = "";
  811.  
  812.                 if ($j<=count($lines)-1) {
  813.                         $output .= $linebreak;
  814.                 }
  815.         } // end for
  816.  
  817.         return trim($output);
  818. } // end quoted_printable_encode
  819.