Page 1 of 1

php scripte webmailer missbrauch vermeiden ?

Posted: 2004-07-06 23:36
by markus72
ich frage mich wie ich am besten die scripte die auf meinem server sicher machen könnte Kunden die ein Kontaktformular nutzen geben in der regel in den scripten an das die mails an sie versendt werden aber es soll ja eine möglichkeit geben dieses zu umgen und die scripte für spammails zu gebrauchen.

Jetzt frage ich mich wie ich am besten mich und die kunden davor schütze das die scripte dazu missbraucht werden.
ich will den kunden ja nicht unbeding ein bestimmtes script auf drängen !

weiss jemand rat ?
qmail is am laufen auf dem server.

hier ein beispiel für ein script was mich doch dazu bewegt hat mich damit mal was genauer zu beschäftigen

Code: Select all

<?php
# Adresse, an die die Formulardaten gesendet werden sollen:
$mailto = "deine@emailadresse.de";

# Maximale Größe des Attachments in Bytes:
$max_attach_size = 500000;
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
<head>
<title></title>
<meta http-equiv="content-type" content="text/html; charset=iso-8859-1" />
<style type="text/css">
<!--
body                { font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 13px; color: #000000; background: #FF9900; margin: 20px; padding: 0px; border: 0px; }
.caution            { color: red; font-weight: bold; }
-->
</style>
</head>
<body>
<?php
if (isset($_POST["form_submitted"]))
 {
  // übergebene Variablen ermitteln:
  $name = $_POST['name'];
  $email = $_POST['email'];
  $subject = $_POST['subject'];
  $text = $_POST['text'];

  // Ã?berprüfungen der Daten:
  unset($errors);
  if ($email != "" and !preg_match("/^[^@]+@.+.D{2,5}$/", $email)) $errors[] = "die E-Mail-Adresse sieht nicht richtig aus";
  if ($text == "") $errors[] = "es wurde kein Text eingegeben";
  if ($_FILES['probe']['size'] > $max_attach_size) $errors[] = "Attachment zu groß (".number_format($_FILES['probe']['size']/1000,0,",","")." KB) - Maximalgröße: ".number_format($max_attach_size/1000,0,",","")." KB";

  if (empty($errors))
   {
    $text = stripslashes($text);
    $subject = stripslashes($subject);
    if ($name != "") $mail_name=$name; else $mail_name="unbekannt";
    if ($subject != "") $mail_subject = $subject; else $mail_subject = "kein Betreff";
    if ($email != "") $mail_email = $email; else $mail_email = "email@unknown.xyz";
    $ip = $_SERVER["REMOTE_ADDR"];

    // Wenn Attachment, dann MIME-Mail erstellen:
    if (isset($_FILES['probe']['name']) && trim($_FILES['probe']['name']) != "")
     {
      // Datei einlesen und codieren:
      $datei_content = fread(fopen($_FILES['probe']['tmp_name'],"r"),filesize($_FILES['probe']['tmp_name']));
      $datei_content = chunk_split(base64_encode($datei_content),76,"n");

      // Boundary festlegen:
      $boundary = md5(uniqid(rand()));

      // Mail-Header:
      $mail_header = "From: ".$mail_name." <".$mail_email.">n";
      $mail_header .= "X-Sender-IP: ".$ip."n";
      $mail_header .= "MIME-Version: 1.0n";
      $mail_header .= "Content-Type: multipart/mixed; boundary="".$boundary.""n";
      $mail_header .= "This is a multi-part message in MIME format.n";
      // Mail-Text:
      $mail_header .= "--".$boundary;
      $mail_header .= "nContent-Type: text/plain";
      $mail_header .= "nContent-Transfer-Encoding: 8bit";
      $mail_header .= "nn".$text;
      // Attachment:
      $mail_header .= "n--".$boundary;
      $mail_header .= "nContent-Type: ".$_FILES['probe']['type']."; name="".$_FILES['probe']['name'].""";
      $mail_header .= "nContent-Transfer-Encoding: base64";
      $mail_header .= "nContent-Disposition: attachment; filename="".$_FILES['probe']['name'].""";
      $mail_header .= "nn".$datei_content;

      // Ende:
      $mail_header .= "n--".$boundary."--";
      // Sende E-Mail und gebe Fehler bzw. Bestaetigung aus
      if (@mail($mailto,$mail_subject,"",$mail_header)) $sent = true; else $errors[] = "keine Verbindung zum Mailserver - bitte nochmal versuchen";
     }
    // kein Attachment, normale E-Mail:
    else
     {
      $mail_header = "From: ".$mail_name." <".$mail_email.">n";
      $mail_header .= "X-Sender-IP: $ipn";
      $mail_header .= "Content-Type: text/plain";
      if (@mail($mailto,$mail_subject,$text,$mail_header)) $sent = true; else $errors[] = "keine Verbindung zum Mailserver - bitte nochmal versuchen";
     }

    // Kopie an Absender:
    if (isset($sent) && isset($email) && $email != "" && isset($_POST['copy']))
     {
      if (isset($_FILES['probe']['name']) && trim($_FILES['probe']['name']) != "") $copy_mail_text = "Kopie der versendeten E-Mail:nn".$text."nnAttachment: ".$_FILES['probe']['name']; else $copy_mail_text = "Kopie der versendeten E-Mail:nn".$text;
      $header= "From: ".$mailto."n";
      $header .= "X-Sender-IP: ".$ip."n";
      $header .= "Content-Type: text/plain";
      @mail($email, $mail_subject, $copy_mail_text, $header);
     }
   }
 }

if (empty($sent))
 {
  if(isset($errors))
   {
    ?><p class="caution">Fehler:</p><ul><?php foreach($errors as $f) { ?><li><?php echo $f; ?></li><?php } ?></ul><br /><?php
   }

  ?><form method="post" action="<?php echo basename($_SERVER["PHP_SELF"]); ?>" enctype="multipart/form-data"><div>
  <p><b>Name:</b><br /><input type="text" name="name" value="<?php if (isset($name)) echo htmlentities(stripslashes($name)); else echo ""; ?>" size="35" /></p>
  <p><b>E-Mail:</b><br /><input type="text" name="email" value="<?php if (isset($email)) echo htmlentities(stripslashes($email)); else echo ""; ?>" size="35" /></p>
  <p><b>Betreff:</b><br /><input type="text" name="subject" value="<?php if (isset($subject)) echo htmlentities(stripslashes($subject)); else echo ""; ?>" size="35" /></p>
  <p><b>Nachricht:</b><br /><textarea name="text" cols="55" rows="12"><?php if (isset($text)) echo htmlentities(stripslashes($text)); else echo ""; ?></textarea></p>
  <b>Attachment:</b><br /><input type="file" name="probe" value="<?php if (isset($_POST['probe'])) echo htmlentities(stripslashes($_POST['probe'])); else echo ""; ?>" size="20"/></p>
  <br /><br />
  <p><input type="submit" name="form_submitted" value="OK - Absenden" /> <input type="checkbox" name="copy" value="true" /> Kopie an Absender</p>
  </div></form><?php
 }
else
 {
  if (empty($email)) { ?><p><b>Danke!</b><br />Nachricht erfolgreich versendet. Allerdings wurde keine E-Mail-Adresse angegeben, ich kann also nicht antworten.</p><?php }
  else { ?><p><b>Danke!</b><br />Nachricht erfolgreich versendet.</p><?php }
 }




Re: php scripte webmailer missbrauch vermeiden ?

Posted: 2004-07-06 23:59
by dodolin
Kunden die ein Kontaktformular nutzen geben in der regel in den scripten an das die mails an sie versendt werden aber es soll ja eine möglichkeit geben dieses zu umgen und die scripte für spammails zu gebrauchen.
Nö.

Wenn im Skript der Empfänger statisch gesetzt wird, wie soll man das umgehen? Kritisch wird es nur, wenn der Empfänger per Formular übergeben wird oder die Variable für den Empfänger "unsafe" ist.

Wenn Kunden eigene Skripte nutzen dürfen, hat man darauf aber keinen Einfluss. Das einzige, was man machen kann, ist suEXEC, suPHP und Co. konsequent zu nutzen, damit man im Fall des Falles wenigens weiß, wer der Schuldige ist und entsprechend LARTen kann. ;)

php scripte Webmailer Missbrauch vermeiden ?

Posted: 2004-07-08 22:37
by christian-wf
Hallo,
um zu verhindern, dass Formularscripte zum Spamversenden missbraucht werden, sollte man den Empfänger der eMail (die eigene eMail-Adresse) fest im Script vorgeben. Außerdem kann man das Verzeichnis, in dem die PHP-Scripte liegen, per .htaccess-Datei absichern. Durch diese Referer-Ã?berprüfung kann das Script nur noch über das eigene Formular aufgerufen werden. Die Referer-Ã?berprüfung hat aber auch Nachteile: Einige Desktop-Firewallprodukte unterdrücken den vom Browser an den Server gesendeten Referer, das Formular ist dann nicht mehr nutzbar. :(
In der .htaccess-Datei kann z.B. folgendes stehen:

Code: Select all

SetEnvIfNoCase Referer "^http://www.domain1.xx/" access_is_ok
SetEnvIfNoCase Referer "^http://domain1.xx/" access_is_ok
SetEnvIfNoCase Referer "^http://www.domain2.xx/" access_is_ok
SetEnvIfNoCase Referer "^http://domain2.xx/" access_is_ok
SetEnvIfNoCase Referer "^https://www.sslkundenserver.xx/www.domain2.xx/" access_is_ok
SetEnvIfNoCase Referer "^https://sslkundenserver.xx/www.domain2.xx/" access_is_ok

Order deny,allow
Deny from all
Allow from env=access_is_ok
Mfg. Christian

Re: php scripte webmailer missbrauch vermeiden ?

Posted: 2004-07-08 23:08
by dodolin
Des weiteren lässt sich der Referer (wie alles, was vom Client kommt) trivial vom Spammer fälschen.