Links werden in textarea ausgeführt

truderich

Mitglied
eingegebener <html code> wird in PHP Formular ausgeführt

Hi, ich habe ein schwerwiegendes Problem. Ich hoffe es kann mir da einer helfen sonst kann ich das Skript in die Tonne hauen..!

Ich habe aus Spass mal folgendes abgeschickt
HTML-Code:

HTML:
12345<a href="blabla">blabla
und plötzlich war meine ganze Db verlinkt. Besser gesagt alle bis dahin geschriebenen Kommentare (das waren 15) waren mit "blabla" verlinkt.
Was zun Henker stimmt da nicht, ich denke mein Skript ist sicher::
.
.
.
Gruss Dieter
 
Zuletzt bearbeitet:
Hi, sorry ist mir grad aufgefallen, daß ich gar kein Skript und nix mit angehängt habe.
Hier mal die meiner Meinung nach wichtigen Teile des Codes
gecheckt und getrimt wird alles. Das ist das Formular
PHP:
<div id="content_form">
 <h2><a href="http://www.so-klappt-es.de/secure/index.php">G&auml;stebuch</a></h2><br/>
  <?php
include 'verarbeiten.php';

	echo'
	<form method="POST" action="index.php?section=gaestebuch">
      <fieldset>
      <legend>Dein Eintrag</legend><br/>
    <table>
      <tr>
       <td class="form">Name *:<br/>
        <input class="text" type="text" name="vname" size="40"
        tabindex="2" value="'.($_POST['vname']).'" />
	   </td>
    </tr>
      <tr>
       <td class="form">Ort:<br/>
       <input class="text" type="text" name="ort" size="40"
       tabindex="3" value="'.($_POST['ort']).'" />
	 </td>
    </tr>
      <tr>
       <td class="form">Mail *:<br/>
       <input class="text" type="text" name="email" size="40"
       tabindex="4" value="'.($_POST['email']).'" />
	   </td>
    </tr>
      <tr>
      <td class="form">Homepage :<br/>
      <input class="text" type="text" name="homepage" size="40"
      tabindex="4" value="http://" />
	  </td>
    </tr>
      <tr>
       <td class="form">Beitrag *:<br/>
       <textarea class="text" rows="8" name="beitrag" cols="40"
       tabindex="5">'.($_POST['beitrag']).'</textarea>
	   </td>
    </tr>
      <tr>
       <td><input class="button" type="submit" name="submit"
       value="eintragen" tabindex="6" />
	   </td>
    </tr>
    </table>
    </fieldset>
    </form>';
	?>
      
		<br/><br/>
		<a class="top" href="">Top<img src="img/top.gif" alt="Top"/></a>
		</div>
Das ist die Verarbeitung die includet wird
PHP:
<?php
    include 'inc.php';
	

    $notes = array('success'=>array(), 'notice'=>array(), 'error'=>array());

    function generateNoteList($type)
    {

        global $notes;
        $return = '';

        switch( $type ) {
            case 'success':
            case 'notice':
			case 'error':
                break;
            default:
                return null;
        }
        $return .= '<div><ul class="'.$type.'">';
        foreach( $notes[$type] as $value ) {
            $return .= '<li>'.$value.'</li>';
        }
        $return .= '</ul></div>';

        return $return;

    }

		if( isset($_POST['submit']) ) {

        if( !isset($_POST['vname']) || trim($_POST['vname'])=='' ) {
            $notes['error'][] = 'Bitte geben Sie Ihren Namen an!';
        }
        if( !isset($_POST['email']) || trim($_POST['email'])=='' ) {
            $notes['error'][] = 'Bitte geben Sie Ihre E-Mail-Adresse an!';
        } elseif(($_POST['email']) && !eregi("^[0-9a-zA-Z]([-_.]?[0-9a-zA-Z])*@[0-9a-zA-Z]([-.]?[0-9a-zA-Z])*\\.[a-zA-Z]{2,4}$", ($_POST['email']))) {
            $notes['error'][] = 'Bitte geben Sie eine korrekte E-Mail-Adresse an!';
        } 
        if( !isset($_POST['beitrag']) || trim($_POST['beitrag'])=='' ) {
            $notes['error'][] = 'Bitte geben Sie eine Nachricht ein!';
        }

        if( count($notes['error']) > 0 ) {

            echo generateNoteList('error');
        
        } 
		
		else {					
            //e-mail schicken
			$additionalHeader = '';
            $additionalHeaderFields = array(
                'MIME-Version'  => '1.0',
                'Content-Type'  => 'text/plain; charset=iso-8859-1',
                'From'          => 'Dieter Treffer <dietertreffer@dietrude.de>',
                'Reply-To'      => 'dietertreffer@dietrude.de',
                'X-Sender-IP'   => $_SERVER['REMOTE_ADDR'],
                'X-Mailer'      => 'PHP/'.phpversion()
            );
            foreach( $additionalHeaderFields as $fieldName => $fieldValue ) {
                $additionalHeader .= $fieldName.': '.$fieldValue . chr(0x0D).chr(0x0A);
            }

            $text = "Name: ".$_POST['vname']."\nOrt: ".$_POST['ort']."\nE-Mail: ".$_POST['email']."\n
			Beitrag: ".$_POST['beitrag']."\n";

            $subject = 'Gästebuch';
            $body  = "Folgender Eintrag erfolgte:\n\n";
            $body .= $text;
            $body .= "\n\nLöschen: http://www.so-klappt-es.de/didi.php\n\n";
            @mail('dietertreffer@dietrude.de', $subject, $body, $additionalHeader);
			
			// Eintraege an DB gaestebuch senden
            $query = '
                INSERT INTO
                        `gaestebuch`
                  SET
                        `ip`	   = "'.$_SERVER['REMOTE_ADDR'].'",
						`vname`    = "'.mysql_real_escape_string($_POST['vname']).'",
                        `ort`      = "'.mysql_real_escape_string($_POST['ort']).'",
                        `email`    = "'.mysql_real_escape_string($_POST['email']).'",
                        `homepage` = "'.mysql_real_escape_string($_POST['homepage']).'",
                        `beitrag`  = "'.mysql_real_escape_string($_POST['beitrag']).'"
						
				';
            $result = mysql_query($query, $conn)
                or die(mysql_error());
            $notes['success'][] = 'Danke für den Eintrag! &nbsp;&nbsp;&nbsp;<a href="index.php?section=anzeigen">Einträge lesen >></a>';
			//Felder leeren
			
        }
 
	}
    if( count($notes['error']) <= 0 ) {
        unset($_POST['vname']);
		unset($_POST['ort']);
		unset($_POST['email']);
		unset($_POST['homepage']);
		unset($_POST['beitrag']);
		echo generateNoteList('success');
    }

	mysql_close($conn);
?>
und das ist das gaestebuch wo angezeigt wird
PHP:
<?php
echo'
	<div id="content_form">
	<h2><a href="http://www.so-klappt-es.de/secure/index.php">G&auml;stebuch</a></h2><br/>
	<br/><br/>
    <p class="gb_link"><a href="index.php?section=gaestebuch">Eintrag schreiben >></a></p><br/>';
      
include 'inc.php';	
	// Verbindung mit DB fuer Eintragungen anzeigen
	$query = "SELECT count(*) as anz FROM gaestebuch";
	$res = mysql_query($query) or die(mysql_error());
	$row = mysql_fetch_assoc($res);
	$gesamt = $row['anz'];
		unset($row);
		$maxproseite = 10;                          
		$i = 0;
		$epp = $maxproseite;
		$seiten = ceil($gesamt/$epp);

	if (!isset($_GET['page'])) 
	{                    
		$anfang = 0;
	} 
		else 
		{                                         //Abfrage, wenn eine Seitenzahl gegeben ist.
			$anfang = ($_GET['page']-1)*$epp;
		}
	$laenge = $epp;
	$sql = "SELECT vname, ort, email, homepage, beitrag, date_format(wann, '%d.%m.%Y <br/>um %H:%i:%s') AS wann
        FROM gaestebuch 
        ORDER BY id_gaesteb DESC
        LIMIT ".$anfang.", ".$laenge."";        
	$res = mysql_query($sql) or die(mysql_error());
	while($row = mysql_fetch_assoc($res))
	{
		#print_r($row);
		echo '
			<table width="70%">
			<tr>
			<td>'.$row['vname'].' aus: '.$row['ort'].'</td>
			</tr>
			<tr>
			<td>Mail:</td>
			<td class="bgweiss">'.$row['email'].'</td>
			<tr>
			<td>Homepage</td>
			<td class="bgweiss">';
			if($row['homepage'])
			{
			 echo "
				<a href=\"".$row['homepage']." \" target = \"_new\">homepage</a>";
			}
					echo'</td></tr>
					</table><br/>
					schrieb am '.$row['wann'].'
					<p class="bgweiss">'.nl2br($row['beitrag']).'</p>';
	}
	echo "Zeige mir Seite&nbsp;&nbsp;";
		for($i = 1; ($i - 1)< $seiten; $i++)
		{              //Ausgabe der Linkliste
		 echo "<a href=\"index.php?section=anzeigen&page=".$i."\">
		  <img border=\"0\" src=\"img/seite.gif\" />".$i."</a> ";
		}
	mysql_close($conn);
	echo'
		<p class="gb_link"><a href="index.php?section=gaestebuch">Eintrag schreiben >></a></p><br/>
		<br/><br/>
		<a class="top" href="">Top<img src="img/top.gif" alt="Top"/></a>
		</div>';
?>
 
Zuletzt bearbeitet:
Hi,

Du solltest die Eingaben vor der Ausgabe mit stripslashes(htmlentities($inhalt)) maskieren - sonst kann (abgesehen von trivialen Dingen wie nicht geschlossene html-Tags) noch mehr Schindluder mit dem GB getrieben werden.

EDIT: und zwar an allen Stellen, an denen Du die Inhalte von $row ausgibst.

Datenbankeinträge sollten zumindest mit mysql_escape_string() versehen werden. EDIT: Das hast Du ja schon getan.

Zu diesen Sicherheitsfragen wird Dir dir Forensuche (und Mitglieder, die mehr von der Materie verstehen, als ich) sicher detailliertere Auskunft geben können.

Gruß
.
 
Hi, ich habe meinen oberen Post mal editiert, alles was ich jetzt an Skript laufen habe steht da. Reicht das nicht an Sicherheit? Blöde frage,,man sieht ja das es nicht reicht :confused:
wo hapert es denn da genau..
.
.
Gruss Dieter
 
Naja,

laut meinem Posting, z.B.:
PHP:
nl2br(htmlentities(($row['beitrag']))
(natürlich auch beim Username, E-Mail-Adresse und Homepage) - damit unterbindest Du zumindest schon mal die Ausgabe von html-Tags in Deinem Gästebuch.

Gruß
.
 
Hi, uuppss ich hatte das so probiert
PHP:
 htmlentities(nl2br($row['beitrag']))
:-)
ich habe es geändert in deine Variante aber er macht es immernoch

EDIT:::::::::::::::::::::::::::::::
habe vergesseb zu überschreiben:) es kann jetzt ruhig Code eingetragen werden. Er wird nur noch ausgegeben aber nicht mehr ausgeführt..DANKE SCHÖN
Sonst noch Verbesserungen nötig? Oder ist es ok so.
.
.
.
Gruss Dieter
.
.
 
Zuletzt bearbeitet:
Auch an dich noch der gutgemeinte Ratschlag: Wenn du viel HTML-Code hast, der in PHP ausgegeben werden soll, dann ist es besser, PHP zu schliessen, den HTML-Code »normal« zu notieren und PHP danach wieder zu öffnen. Also anstatt das hier:
PHP:
<?php
include 'verarbeiten.php';

    echo'
    <form method="POST" action="index.php?section=gaestebuch">
      <fieldset>
      <legend>Dein Eintrag</legend><br/>
    <table>
      <tr>
       <td class="form">Name *:<br/>
        <input class="text" type="text" name="vname" size="40"
        tabindex="2" value="'.($_POST['vname']).'" />
       </td>
    </tr>
      <tr>
       <td class="form">Ort:<br/>
       <input class="text" type="text" name="ort" size="40"
       tabindex="3" value="'.($_POST['ort']).'" />
     </td>
    </tr>
      <tr>
       <td class="form">Mail *:<br/>
       <input class="text" type="text" name="email" size="40"
       tabindex="4" value="'.($_POST['email']).'" />
       </td>
    </tr>
      <tr>
      <td class="form">Homepage :<br/>
      <input class="text" type="text" name="homepage" size="40"
      tabindex="4" value="http://" />
      </td>
    </tr>
      <tr>
       <td class="form">Beitrag *:<br/>
       <textarea class="text" rows="8" name="beitrag" cols="40"
       tabindex="5">'.($_POST['beitrag']).'</textarea>
       </td>
    </tr>
      <tr>
       <td><input class="button" type="submit" name="submit"
       value="eintragen" tabindex="6" />
       </td>
    </tr>
    </table>
    </fieldset>
    </form>';
    ?>
      
        <br/><br/>
        <a class="top" href="">Top<img src="img/top.gif" alt="Top"/></a>
        </div>
lieber so:
PHP:
<?php include ('verarbeiten.php'); ?>
    <form method="POST" action="index.php?section=gaestebuch">
      <fieldset>
      <legend>Dein Eintrag</legend><br/>
    <table>
      <tr>
       <td class="form">Name *:<br/>
        <input class="text" type="text" name="vname" size="40"
        tabindex="2" value="<?php echo $_POST['vname']; ?>" />
       </td>
    </tr>
      <tr>
       <td class="form">Ort:<br/>
       <input class="text" type="text" name="ort" size="40"
       tabindex="3" value="<?php echo $_POST['ort']; ?>" />
     </td>
    </tr>
      <tr>
       <td class="form">Mail *:<br/>
       <input class="text" type="text" name="email" size="40"
       tabindex="4" value="<?php echo $_POST['email']; ?>" />
       </td>
    </tr>
      <tr>
      <td class="form">Homepage :<br/>
      <input class="text" type="text" name="homepage" size="40"
      tabindex="4" value="http://" />
      </td>
    </tr>
      <tr>
       <td class="form">Beitrag *:<br/>
       <textarea class="text" rows="8" name="beitrag" cols="40"
       tabindex="5"><?php echo $_POST['beitrag']; ?></textarea>
       </td>
    </tr>
      <tr>
       <td><input class="button" type="submit" name="submit"
       value="eintragen" tabindex="6" />
       </td>
    </tr>
    </table>
    </fieldset>
    </form>
        <br/><br/>
        <a class="top" href="">Top<img src="img/top.gif" alt="Top"/></a>
        </div>
 
Zurück