Gästebuch & Sicherheit

-Raid-

Mitglied
Hi,
da ich meine Seite vom Layout und Code fertig habe, habe ich mich daran gemacht, ein Gästebuch einzubinden. Hat auch ohne Probleme geklappt. Ich habe mich über das Internet schlau gemacht und mehrfach gelesen, dass sobald ein Eingabefeld verwendet wird, "Schadcode" wie z.B. <iframe></iframe> in die Seite gelangen kann. Wie kann ich das unterbinden?

PHP:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<meta name="description" content="'Get Back' ist eine Seite der Band Get Back">
<meta name="author" content="Kevin Wirtz">
<meta name="keywords" content="Get, Back, Get Back, Band, Musik, NRW">
<script type="text/javascript" src="js/prototype.js"></script>
<script type="text/javascript" src="js/scriptaculous.js?load=effects"></script>
<script type="text/javascript" src="js/lightbox.js"></script>
<script type="text/javascript" src="audio-player/audio-player.js"></script>
<title>Get Back - Willkommen</title>
<LINK REL="SHORTCUT ICON" href="http://www.tutorials.de/forum/images/favicon.jpg">
<style type="text/css">
a:link { color: white; }
a:visited { color: white; }
a:hover { color: red; }
</style>
<style type="text/css">
@import "layout.css";
</style>
<!--[if lt IE 7]>
<style type="text/css">
ul.Navigation li {
float:left;
width:135px;
}
div#footer {
width:100%;
}
</style>
<![endif]-->
<link rel="stylesheet" href="css/lightbox.css" type="text/css" media="screen" />
</head>
<body>
<div id="wrapper" class="clearfix">
<h1 id="header"></h1>

<ul class="Navigation">
  <li class="NaviDown">Navigation</li>
  <li><a href="index.php">Willkommen</a></li>
  <li><a href="band.php">Band</a></li>
  <li><a href="musik.php">Musik</a></li>
  <li><a href="auftritte.php">Auftritte</a></li>
  <li><a href="gaestebuch.php">Gästebuch</a></li>
  <li><a href="kontakt.php">Kontakt</a></li>
  <li><a href="impressum.php">Impressum</a></li>
  <li class="NaviDown"></li>
</ul>

<ul id="Uhrzeit">
    <li class="NaviDown">Uhrzeit</li>
    <li class="Uhrzeit"><script type="text/javascript" src="js/uhrzeit.js"></script></li>
    <li class="NaviDown"></li>
</ul>

<ul id="Counter">
    <li class="NaviDown">Counter</li>
    <li class="Counter">8</li>
    <li class="NaviDown"></li>
</ul>

<div id="Inhalt">
  <center><h2>Willkommen</h2></center>
 <center><p><?php

$DatabasePointer = mysql_connect("localhost", "root", "");
mysql_select_db("Mysql", $DatabasePointer);

$_REQUEST['Name']    = mysql_real_escape_string($_REQUEST['Name']);
$_REQUEST['Titel']   = mysql_real_escape_string($_REQUEST['Titel']);
$_REQUEST['Eintrag'] = mysql_real_escape_string($_REQUEST['Eintrag']);

$SQL = "INSERT INTO Gaestebuch (Datum, Name, Titel, Eintrag) VALUES (NOW(''), '".$_REQUEST['Name']."', '".$_REQUEST['Titel']."', '".$_REQUEST['Eintrag']."')";
mysql_query($SQL, $DatabasePointer);

if(mysql_affected_rows($DatabasePointer) == 1)
{
?>
Vielen Dank f&uuml;r Ihren Eintrag!<br>
<a href="gaestebuch.php">Zur&uuml;ck</a>
<?php
}
else
{
?>
Beim Eintragen ist ein Fehler aufgetreten.<br>
<a href="javascript:history.back();">Zur&uuml;ck</a>
<?php
}
?>
</p><h2>&nbsp</h2></center>
</div>
<div id="footer"><center>© 2008 Get Back</center></div>
</div>
</body>
</html>

Diesen Code verwende ich, um die Daten an die Datenbank zu senden. Klappt wunderbar bei XAMPP und auch bei Servern (solange diese Datenbanken unterstützen).

Mit freundlichen Grüßen,
-Raid-
 
Indem du z. B. [phpf]htmlspecialchars[/phpf] verwendest um genau die "gefährlichen" Zeichen zu maskieren.
Ansonsten würde ich dir raten nicht $_REQUEST zu verwenden, sondern immer die passende Superglobale, woher die Daten kommen. In deinem Fall wahrscheinlich $_POST, da ich ein Formular vermute.

Würde es über die URL gehen, wäre es dann dementsprechend $_GET.
 
...mit dieser Funktion könntest Du Schlüsselwörter ausschliessen.
Ausserdem ist ein SpamCheck(7 Sekunden) integriert.

Dann solltest Du noch alle Usereingaben durch htmlentities() laufern lassen.

Gruss Mike

PHP:
// HIDDEN INS FORM INTEGRIEREN
// <input type="hidden" name="erstertimestamp" value=" echo base64_encode(time()); " />

function spam_check(){
// BLACKLIST WÖRTER
$text = array("iframe", "http");

// BENÖTIGTE AUSFÜLLZEIT , WENN < 7 = SPAM
if (base64_decode($_POST["erstertimestamp"]) > time() - 7){ 
	return 1;  
   exit;
}
foreach ($_POST as $fieldname => $fieldvalue) {
  foreach ($text as $stopword_key => $stopword_value) {
   $pattern = "/.*$stopword_value.*/";
   if (preg_match($pattern, $fieldvalue)) {
	return 1;   
   exit;
   }
  }
 }
}
 
Code:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<meta name="description" content="'Get Back' ist eine Seite der Band Get Back">
<meta name="author" content="Kevin Wirtz">
<meta name="keywords" content="Get, Back, Get Back, Band, Musik, NRW">
<script type="text/javascript" src="js/prototype.js"></script>
<script type="text/javascript" src="js/scriptaculous.js?load=effects"></script>
<script type="text/javascript" src="js/lightbox.js"></script>
<script type="text/javascript" src="audio-player/audio-player.js"></script>
<title>Get Back - Willkommen</title>
<LINK REL="SHORTCUT ICON" href="images/favicon.jpg">
<style type="text/css">
a:link { color: white; }
a:visited { color: white; }
a:hover { color: red; }
</style>
<style type="text/css">
@import "layout.css";
</style>
<!--[if lt IE 7]>
<style type="text/css">
ul.Navigation li {
float:left;
width:135px;
}
div#footer {
width:100%;
}
</style>
<![endif]-->
<link rel="stylesheet" href="css/lightbox.css" type="text/css" media="screen" />
</head>
<body>
<div id="wrapper" class="clearfix">
<h1 id="header"></h1>

<ul class="Navigation">
  <li class="NaviDown">Navigation</li>
  <li><a href="index.php">Willkommen</a></li>
  <li><a href="band.php">Band</a></li>
  <li><a href="musik.php">Musik</a></li>
  <li><a href="auftritte.php">Auftritte</a></li>
  <li><a href="gaestebuch.php">Gästebuch</a></li>
  <li><a href="kontakt.php">Kontakt</a></li>
  <li><a href="impressum.php">Impressum</a></li>
  <li class="NaviDown"></li>
</ul>

<ul id="Uhrzeit">
    <li class="NaviDown">Uhrzeit</li>
    <li class="Uhrzeit"><script type="text/javascript" src="js/uhrzeit.js"></script></li>
    <li class="NaviDown"></li>
</ul>

<ul id="Counter">
    <li class="NaviDown">Counter</li>
    <li class="Counter"><?php include("Counter.php"); ?> </li>
    <li class="NaviDown"></li>
</ul>

<div id="Inhalt">
  <center><h2>Willkommen</h2></center>
 <center><p>
 <?php
$check=spam_check();
$DatabasePointer = mysql_connect("localhost", "root", "");
mysql_select_db("Mysql", $DatabasePointer);

$_POST['Name']    = mysql_real_escape_string($_POST['Name']);
$_POST['Titel']   = mysql_real_escape_string($_POST['Titel']);
$_POST['Eintrag'] = mysql_real_escape_string($_POST['Eintrag']);

$SQL = "INSERT INTO Gaestebuch (Datum, Name, Titel, Eintrag) VALUES (NOW(''), '".$_REQUEST['Name']."', '".$_REQUEST['Titel']."', '".$_REQUEST['Eintrag']."')";
mysql_query($SQL, $DatabasePointer);

if(mysql_affected_rows($DatabasePointer) == 1)

function spam_check(){
// BLACKLIST WÖRTER
$text = array("iframe", "http");

// BENÖTIGTE AUSFÜLLZEIT , WENN < 7 = SPAM
if (base64_decode($_POST["erstertimestamp"]) > time() - 7){ 
    return 1;  
   exit;
}
foreach ($_POST as $fieldname => $fieldvalue) {
  foreach ($text as $stopword_key => $stopword_value) {
   $pattern = "/.*$stopword_value.*/";
   if (preg_match($pattern, $fieldvalue)) {
    return 1;   
   exit;
   }
  }
 }
}  
{
?>
Vielen Dank f&uuml;r Ihren Eintrag!<br>
<a href="gaestebuch.php">Zur&uuml;ck</a>
<?php
}
else
{
?>
Beim Eintragen ist ein Fehler aufgetreten.<br>
<a href="javascript:history.back();">Zur&uuml;ck</a>
<?php
}
?>
</p><h2>&nbsp</h2></center>
</div>
<div id="footer"><center>© 2008 Get Back</center></div>
</div>
</body>
</html>

Gibt:
Code:
Parse error: syntax error, unexpected T_FUNCTION in C:\xampp\htdocs\getback\eintrag-einfuegen.php on line 80

Was mache ich falsch?
Bin jetzt erstmal weg, bis später. :)

Mit freundlichen Grüßen,
-Raid-
 
Code:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<meta name="description" content="'Get Back' ist eine Seite der Band Get Back">
<meta name="author" content="Kevin Wirtz">
<meta name="keywords" content="Get, Back, Get Back, Band, Musik, NRW">
<script type="text/javascript" src="js/prototype.js"></script>
<script type="text/javascript" src="js/scriptaculous.js?load=effects"></script>
<script type="text/javascript" src="js/lightbox.js"></script>
<script type="text/javascript" src="audio-player/audio-player.js"></script>
<title>Get Back - Willkommen</title>
<LINK REL="SHORTCUT ICON" href="images/favicon.jpg">
<style type="text/css">
a:link { color: white; }
a:visited { color: white; }
a:hover { color: red; }
</style>
<style type="text/css">
@import "layout.css";
</style>
<!--[if lt IE 7]>
<style type="text/css">
ul.Navigation li {
float:left;
width:135px;
}
div#footer {
width:100%;
}
</style>
<![endif]-->
<link rel="stylesheet" href="css/lightbox.css" type="text/css" media="screen" />
</head>
<body>
<div id="wrapper" class="clearfix">
<h1 id="header"></h1>

<ul class="Navigation">
  <li class="NaviDown">Navigation</li>
  <li><a href="index.php">Willkommen</a></li>
  <li><a href="band.php">Band</a></li>
  <li><a href="musik.php">Musik</a></li>
  <li><a href="auftritte.php">Auftritte</a></li>
  <li><a href="gaestebuch.php">Gästebuch</a></li>
  <li><a href="kontakt.php">Kontakt</a></li>
  <li><a href="impressum.php">Impressum</a></li>
  <li class="NaviDown"></li>
</ul>

<ul id="Uhrzeit">
    <li class="NaviDown">Uhrzeit</li>
    <li class="Uhrzeit"><script type="text/javascript" src="js/uhrzeit.js"></script></li>
    <li class="NaviDown"></li>
</ul>

<ul id="Counter">
    <li class="NaviDown">Counter</li>
    <li class="Counter"><?php include("Counter.php"); ?> </li>
    <li class="NaviDown"></li>
</ul>

<div id="Inhalt">
  <center><h2>Willkommen</h2></center>
 <center><p>
 <?php
$check=spam_check();
$DatabasePointer = mysql_connect("localhost", "root", "");
mysql_select_db("Mysql", $DatabasePointer);

$_POST['Name']    = mysql_real_escape_string($_POST['Name']);
$_POST['Titel']   = mysql_real_escape_string($_POST['Titel']);
$_POST['Eintrag'] = mysql_real_escape_string($_POST['Eintrag']);

$SQL = "INSERT INTO Gaestebuch (Datum, Name, Titel, Eintrag) VALUES (NOW(''), '".$_REQUEST['Name']."', '".$_REQUEST['Titel']."', '".$_REQUEST['Eintrag']."')";
mysql_query($SQL, $DatabasePointer);

if(mysql_affected_rows($DatabasePointer) == 1)

function spam_check(){
// BLACKLIST WÖRTER
$text = array("iframe", "http");

// BENÖTIGTE AUSFÜLLZEIT , WENN < 7 = SPAM
if (base64_decode($_POST["erstertimestamp"]) > time() - 7){ 
    return 1;  
   exit;
}
foreach ($_POST as $fieldname => $fieldvalue) {
  foreach ($text as $stopword_key => $stopword_value) {
   $pattern = "/.*$stopword_value.*/";
   if (preg_match($pattern, $fieldvalue)) {
    return 1;   
   exit;
   }
  }
 }
}  
{
?>
Vielen Dank f&uuml;r Ihren Eintrag!<br>
<a href="gaestebuch.php">Zur&uuml;ck</a>
<?php
}
else
{
?>
Beim Eintragen ist ein Fehler aufgetreten.<br>
<a href="javascript:history.back();">Zur&uuml;ck</a>
<?php
}
?>
</p><h2>&nbsp</h2></center>
</div>
<div id="footer"><center>© 2008 Get Back</center></div>
</div>
</body>
</html>

Gibt:
Code:
Parse error: syntax error, unexpected T_FUNCTION in C:\xampp\htdocs\getback\eintrag-einfuegen.php on line 80

Was mache ich falsch?
Bin jetzt erstmal weg, bis später. :)

Mit freundlichen Grüßen,
-Raid-

Die Funktion spam_check muss ausserhalb deiner IF abfrage stehen.
 
Guten Morgen,
es gibt keine Fehlermeldungen, aber gefiltert wird auch nichts?:confused:

Code:
<div id="Inhalt">
  <center><h2>Willkommen</h2></center>
 <center><p><?php

$check=spam_check();
$DatabasePointer = mysql_connect("localhost", "root", "");
mysql_select_db("Mysql", $DatabasePointer);

$_POST['Name']    = mysql_real_escape_string($_POST['Name']);
$_POST['Titel']   = mysql_real_escape_string($_POST['Titel']);
$_POST['Eintrag'] = mysql_real_escape_string($_POST['Eintrag']);

$SQL = "INSERT INTO Gaestebuch (Datum, Name, Titel, Eintrag) VALUES (NOW(''), '".$_POST['Name']."', '".$_POST['Titel']."', '".$_POST['Eintrag']."')";
mysql_query($SQL, $DatabasePointer);

// HIDDEN INS FORM INTEGRIEREN
// <input type="hidden" name="erstertimestamp" value=" echo base64_encode(time()); " />

function spam_check(){
// BLACKLIST WÖRTER
$text = array("iframe", "http");

// BENÖTIGTE AUSFÜLLZEIT , WENN < 7 = SPAM
if (base64_decode($_POST["erstertimestamp"]) > time() - 7){ 
    return 1;  
   exit;
}
foreach ($_POST as $fieldname => $fieldvalue) {
  foreach ($text as $stopword_key => $stopword_value) {
   $pattern = "/.*$stopword_value.*/";
   if (preg_match($pattern, $fieldvalue)) {
    return 1;   
   exit;
   }
  }
 }
}  

if(mysql_affected_rows($DatabasePointer) == 1)
{
?>
Vielen Dank f&uuml;r Ihren Eintrag!<br>
<a href="gaestebuch.php">Zur&uuml;ck</a>
<?php
}
else
{
?>
Beim Eintragen ist ein Fehler aufgetreten.<br>
<a href="javascript:history.back();">Zur&uuml;ck</a>
<?php
}
?>


Ich habe für das Gästebuch einen PW geschützen Adminbereich:

Code:
$Zugangspasswort = "1234";

if($_REQUEST['Send'] && $Zugangspasswort == $_REQUEST['Passwort'])
{
    $DatabasePointer = mysql_connect("localhost", "root", "");
    mysql_select_db("Mysql", $DatabasePointer);

    if($_REQUEST['Passwort'] && $_REQUEST['Loeschen'] && $_REQUEST['Datum'])
    {
        mysql_query("DELETE FROM Gaestebuch WHERE Datum='".date("Y-m-d H:i:s", $_REQUEST['Datum'])."'", $DatabasePointer); 
    }

Hier ist das PW leider im Quellcode, nicht sichtbar indem der Quelltext aufgerufen wird, aber sicher erscheint mir das auch nicht wirklichen. Jetzt hab ich eine Tabelle mit dem namen "Passwort" angelegt und dort das Passwort mit MD5 verschlüsselt. Wie kann ich jetzt das Passwort abfragen?

Mit freundlichen Grüßen,
-Raid-
 
PHP:
$_sql = '   SELECT
                `passwort`
            FROM
                `Passwort`
            LIMIT 1';
$result = mysql_query( $_sql );
$password = mysql_fetch_assoc( $result );

if( $_REQUEST['Send'] && md5( $_REQUEST['Passwort'] ) == $password['passwort'] )
{
So in etwa.
 
Guten Mittag,
ich will, dass die Daten nur an die Datenbank gesendet werden, wenn die Eingabefelder auch ausgefüllt sind.
Mein Versuch:
Code:
$DatabasePointer = mysql_connect("localhost", "root", "");
mysql_select_db("Mysql", $DatabasePointer);

$_POST['Name']    = mysql_real_escape_string($_POST['Name']);
$_POST['Titel']   = mysql_real_escape_string($_POST['Titel']);
$_POST['Eintrag'] = mysql_real_escape_string($_POST['Eintrag']);
$_POST['Email']   = mysql_real_escape_string($_POST['Email']);

if(empty($_POST['Name']. ($_POST['Titel']. ($_POST['Eintrag'].))))

$_POST['Name'] echo Bitte tragen Sie ihren Namen ein.
$_POST['Titel'] echo Bitte tragen Sie einen Titel ein.
$_POST['Eintrag'] echo Bitte verfassen Sie einen Text.

else

$SQL = "INSERT INTO Gaestebuch (Datum, Name, Titel, Eintrag, Email) VALUES (NOW(''), '".$_POST['Name']."', '".$_POST['Titel']."', '".$_POST['Eintrag']."', '".$_POST['Email']."')";
$check = mysql_query($SQL, $DatabasePointer);

Meine Kenntnisse mit PHP halten sich in Grenzen, weswegen ich hoffe, dass ihr mir da weiterhelfen könnt.

Da mir hier ja keiner weiterhelfen wollte, habe ich es jetzt selbst geschrieben, vllt. kann es ja irgendwann mal einer gebrauchen.
Code:
if(!$_POST['Name']){
  die('Bitte tragen Sie ihren Namen ein.');
}

Mit freundlichen Grüßen,
-Raid-
 
Zuletzt bearbeitet:
Zurück