Avatar billede DupreeLove Nybegynder
23. juli 2009 - 15:05 Der er 21 kommentarer

Mail upload formular - sender ikke beskederne som er skrevet i felterne...?

Hey
Jeg har et kæmpe problem med min mailform - den uploader filer uden problemer, sender en
notifikation til min mail, dog sender den ikke felterne med "Name", "Email" og "Info" :s nogle
der kan hjælpe? Jeg har lavet formen om, så den ikke inkluderer "Phone", "Fax", "Speciality" og "Clinic" - skal nedenstående php-script så omskrives? - Jeg har prøvet at slette de nævnte de steder de indgår i scriptet, men det virker ikke..

PHP:
<?
$MaxFileSize = "2048000"; // max file size in bytes
$HDDSpace = "1048576"; // max total size of all files in directory
$HDDTotal = "445";
$OffExt = "";
// add characters to strip out of filenames
$ThisFileName = basename(__FILE__); // get the file name
$abspath = str_replace($ThisFileName,"",__FILE__);  // get the directory path
// full path
$path=$abspath;
$pathext="upload/";
$snr = array("%","'","+","\\","/","#","..","!",'"',',','?','*','~');
$temp=$HTTP_POST_FILES['uploadedfile']['name'];


if($HTTP_POST_FILES['uploadedfile']['name'])
{
            $HTTP_POST_FILES['uploadedfile']['name'] =
strip_tags($HTTP_POST_FILES['uploadedfile']['name']);
            $HTTP_POST_FILES['uploadedfile']['name'] =
str_replace($snr,"",$HTTP_POST_FILES['uploadedfile']['name']);  // remove any % signs from
the file name
            $HTTP_POST_FILES['uploadedfile']['name'] =
trim($HTTP_POST_FILES['uploadedfile']['name']);

            /* if the file size is within allowed limits */
            if($HTTP_POST_FILES['uploadedfile']['size'] > 0 &&
$HTTP_POST_FILES['uploadedfile']['size'] < $MaxFileSize) 
            {

                /* if adding the file will not exceed the maximum allowed total */
                if(($HDDTotal + $HTTP_POST_FILES['uploadedfile']['size']) < $HDDSpace) 
                {

                        /* put the file in the directory */
move_uploaded_file($HTTP_POST_FILES['uploadedfile']['tmp_name'],
$path.$pathext.$HTTP_POST_FILES['uploadedfile']['name'].$OffExt);                         
                        $msg = "";

                    $myfrom = $Email; 
                    $myemail = "xxx@xxx.dk"; 
                    $todayis = date("l, F j, Y, g:i a") ;
                   
                    $filename="http://www.xxx.dk/".$pathext.$HTTP_POST_FILES['uploadedfile']['name'].$Off
Ext;
                    $filename=str_replace("","%20",$filename);
                    $Email= stripcslashes($Email);
                    $Name= stripcslashes($Name);
                    $Phone= stripcslashes($Phone);
                    $info= stripcslashes($info);
                    $Fax= stripcslashes($Fax);
                    $Speciality= stripcslashes($Speciality);
                    $Clinic= stripcslashes($Clinic);

                   
                    $subject= "Request From Website";
                   
                    $message = " 
                    uploadedfile          : $filename
                    Name                  : $Name
                    Email                : $Email
                    Phone                : $Phone
                    Fax                  : $Fax
                    Speciality            : $Speciality
                    Clinic/Hospital    :$Clinic
                    Comments/Request    :$info
                    ";
                    $from = "From: $myfrom\r\n";
                    mail($myemail, $subject, $message, $from);
                    }
                else 
                {
                        $msg = "The Filename: ".$HTTP_POST_FILES['uploadedfile']['name']."
is BLOCKED from being uploaded here.";
                }                                                       
                         
        }
        else 
        {
        $MaxKB = $MaxFileSize/1024; // show the max file size in Kb
        $msg =  "The file was greater than the maximum allowed, file size of $MaxKB and
could not be uploaded.";
        }   
    }       
print $msg;
// Your message has been sent successfully with attachment.
?>
Avatar billede repox Seniormester
23. juli 2009 - 15:22 #1
Det er jo forældet PHP - der er væsentlige sikkerhedsrisici i at benytte ovenstående script.
Jeg ville skille mig af med det og finde noget nyere og mere sikkert.
Avatar billede DupreeLove Nybegynder
23. juli 2009 - 15:30 #2
Hvilke risici er der forbundet med det? Jeg er helt ny på området, så er på ret bar bund...
Det er samtidig det eneste script jeg har kunnet finde hvor man kan uploade via en form - har du evt. nogle links hvor jeg kan finde sådanne scripts?
Avatar billede repox Seniormester
23. juli 2009 - 15:33 #3
Grunden til at det ikke virker er netop fordi koden er forældet. Når man kommer med en ny version af et eller andet er det som regel fordi der er nogle ting som er blevet rettet og forbedret - heriblandt sikkerheden.

Jeg gider ikke at remse forskellene op på PHP4 og PHP5, men for at få ovenstående til at virke skal du slå register globals til i din PHP opsætning. Og hvis du nu googler på 'PHP register globals' så bør der være nok læsestof om hvorfor det ikke er smart at bruge så forældet kode.
Avatar billede DupreeLove Nybegynder
23. juli 2009 - 15:36 #4
okay - super.. tusind tak for hjælpen :)
Avatar billede DupreeLove Nybegynder
23. juli 2009 - 15:51 #5
Forresten.. Kan du fortælle mig om dette script er forældet?

<html>
<head>
<title> Sending Email </title>
</head>
<body>
<?php
// Read POST request params into global vars
$to      = $_POST['to'];
$from    = $_POST['from'];
$subject = $_POST['subject'];
$message = $_POST['message'];

// Obtain file upload vars
$fileatt      = $_FILES['fileatt']['tmp_name'];
$fileatt_type = $_FILES['fileatt']['type'];
$fileatt_name = $_FILES['fileatt']['name'];

$headers = "From: $from";

if (is_uploaded_file($fileatt)) {
  // Read the file to be attached ('rb' = read binary)
  $file = fopen($fileatt,'rb');
  $data = fread($file,filesize($fileatt));
  fclose($file);

  // Generate a boundary string
  $semi_rand = md5(time());
  $mime_boundary = "==Multipart_Boundary_x{$semi_rand}x";
 
  // Add the headers for a file attachment
  $headers .= "\nMIME-Version: 1.0\n" .
              "Content-Type: multipart/mixed;\n" .
              " boundary=\"{$mime_boundary}\"";

  // Add a multipart boundary above the plain message
  $message = "This is a multi-part message in MIME format.\n\n" .
            "--{$mime_boundary}\n" .
            "Content-Type: text/plain; charset=\"iso-8859-1\"\n" .
            "Content-Transfer-Encoding: 7bit\n\n" .
            $message . "\n\n";

  // Base64 encode the file data
  $data = chunk_split(base64_encode($data));

  // Add file attachment to the message
  $message .= "--{$mime_boundary}\n" .
              "Content-Type: {$fileatt_type};\n" .
              " name=\"{$fileatt_name}\"\n" .
              //"Content-Disposition: attachment;\n" .
              //" filename=\"{$fileatt_name}\"\n" .
              "Content-Transfer-Encoding: base64\n\n" .
              $data . "\n\n" .
              "--{$mime_boundary}--\n";
}

// Send the message
$ok = @mail($to, $subject, $message, $headers);
if ($ok) {
  echo "<p>Mail sent! Yay PHP!</p>";
} else {
  echo "<p>Mail could not be sent. Sorry!</p>";
}
?>
</body>
</html>
Avatar billede repox Seniormester
23. juli 2009 - 15:56 #6
Et hurtigt kig siger mig at det virker up-to-date...
Avatar billede DupreeLove Nybegynder
23. juli 2009 - 15:58 #7
okay.. takker mange gange for hjælpen.. prøver med det nye script i stedet :)
Avatar billede DupreeLove Nybegynder
23. juli 2009 - 16:17 #8
Håber nogle kan hjælpe mig her igen... Hvodan gør jeg i nedenstående script modtageren konstant - dermed mener jeg, at det altid er den samme mail uden at det fremgår tydeligt nogen steder på min side?

<?php
// Read POST request params into global vars
$to      = $_POST['to'];
$from    = $_POST['from'];
$subject = $_POST['subject'];
$message = $_POST['message'];

// Obtain file upload vars
$fileatt      = $_FILES['fileatt']['tmp_name'];
$fileatt_type = $_FILES['fileatt']['type'];
$fileatt_name = $_FILES['fileatt']['name'];

$headers = "From: $from";

if (is_uploaded_file($fileatt)) {
  // Read the file to be attached ('rb' = read binary)
  $file = fopen($fileatt,'rb');
  $data = fread($file,filesize($fileatt));
  fclose($file);

  // Generate a boundary string
  $semi_rand = md5(time());
  $mime_boundary = "==Multipart_Boundary_x{$semi_rand}x";
 
  // Add the headers for a file attachment
  $headers .= "\nMIME-Version: 1.0\n" .
              "Content-Type: multipart/mixed;\n" .
              " boundary=\"{$mime_boundary}\"";

  // Add a multipart boundary above the plain message
  $message = "This is a multi-part message in MIME format.\n\n" .
            "--{$mime_boundary}\n" .
            "Content-Type: text/plain; charset=\"iso-8859-1\"\n" .
            "Content-Transfer-Encoding: 7bit\n\n" .
            $message . "\n\n";

  // Base64 encode the file data
  $data = chunk_split(base64_encode($data));

  // Add file attachment to the message
  $message .= "--{$mime_boundary}\n" .
              "Content-Type: {$fileatt_type};\n" .
              " name=\"{$fileatt_name}\"\n" .
              //"Content-Disposition: attachment;\n" .
              //" filename=\"{$fileatt_name}\"\n" .
              "Content-Transfer-Encoding: base64\n\n" .
              $data . "\n\n" .
              "--{$mime_boundary}--\n";
}

// Send the message
$ok = @mail($to, $subject, $message, $headers);
if ($ok) {
  echo "<p>Mail sent! Yay PHP!</p>";
} else {
  echo "<p>Mail could not be sent. Sorry!</p>";
}
?>

HTML'en ser sådan her ud:

<html>
<head>
<title>Send an Email</title>
</head>
<body>
<h1>Send an Email</h1>
<form action="mail.php" method="POST" enctype="multipart/form-data">
<p>To: <input type="text" name="to" value="" /><br />
From: <input type="text" name="from" value="" /><br />
Subject: <input type="text" name="subject" value="" /></p>
<p>Message:<br />
<textarea cols="70" rows="20" name="message"></textarea></p>
<p>File Attachment: <input type="file" name="fileatt" /></p>
<p><input type="submit" value="Send" /></p>
</form>
</body>
</html>
Avatar billede majbom Novice
24. juli 2009 - 06:51 #9
det siger næsten sig selv jo :)

ret:

$to = $_POST['to'];

til:

$to = 'dinmail@domain.dk';
Avatar billede DupreeLove Nybegynder
24. juli 2009 - 14:56 #10
ja, det fandt jeg ud af :) men tak for svaret..

kan jeg evt. smide en restriction ind, som gør at man kun kan uploade mp3-filer?
Avatar billede majbom Novice
24. juli 2009 - 19:34 #11
efter:

if (is_uploaded_file($fileatt)) {

indsæt:

$extension = strtolower(pathinfo($_FILES['image']['name'],PATHINFO_EXTENSION));
if(extension=='mp3'){

og indsæt:

}

efter:

"--{$mime_boundary}--\n";
Avatar billede majbom Novice
24. juli 2009 - 19:35 #12
$extension = strtolower(pathinfo($_FILES['image']['name'],PATHINFO_EXTENSION));

skal self være:

$extension = strtolower(pathinfo($_FILES['fileatt']['name'],PATHINFO_EXTENSION));
Avatar billede DupreeLove Nybegynder
26. juli 2009 - 19:46 #13
hmm, hvis følgende er rigtigt, så det virker det desværre ikke - det er stadigt muligt at vælge alle filer, og forskellen er nu, at det vedhæftede ikke bliver sendt?! :/

<?php
// Read POST request params into global vars
$to      = $_POST['to'];
$from    = $_POST['from'];
$subject = $_POST['subject'];
$message = $_POST['message'];

// Obtain file upload vars
$fileatt      = $_FILES['fileatt']['tmp_name'];
$fileatt_type = $_FILES['fileatt']['type'];
$fileatt_name = $_FILES['fileatt']['name'];

$headers = "From: $from";

if (is_uploaded_file($fileatt)) {

$extension = strtolower(pathinfo($_FILES['fileatt']['name'],PATHINFO_EXTENSION));
if(extension=='mp3'){

  // Read the file to be attached ('rb' = read binary)
  $file = fopen($fileatt,'rb');
  $data = fread($file,filesize($fileatt));
  fclose($file);

  // Generate a boundary string
  $semi_rand = md5(time());
  $mime_boundary = "==Multipart_Boundary_x{$semi_rand}x";
 
  // Add the headers for a file attachment
  $headers .= "\nMIME-Version: 1.0\n" .
              "Content-Type: multipart/mixed;\n" .
              " boundary=\"{$mime_boundary}\"";

  // Add a multipart boundary above the plain message
  $message = "This is a multi-part message in MIME format.\n\n" .
            "--{$mime_boundary}\n" .
            "Content-Type: text/plain; charset=\"iso-8859-1\"\n" .
            "Content-Transfer-Encoding: 7bit\n\n" .
            $message . "\n\n";

  // Base64 encode the file data
  $data = chunk_split(base64_encode($data));

  // Add file attachment to the message
  $message .= "--{$mime_boundary}\n" .
              "Content-Type: {$fileatt_type};\n" .
              " name=\"{$fileatt_name}\"\n" .
              //"Content-Disposition: attachment;\n" .
              //" filename=\"{$fileatt_name}\"\n" .
              "Content-Transfer-Encoding: base64\n\n" .
              $data . "\n\n" .
              "--{$mime_boundary}--\n"; }
}

// Send the message
$ok = @mail($to, $subject, $message, $headers);
if ($ok) {
  echo "<p>Mail sent! Yay PHP!</p>";
} else {
  echo "<p>Mail could not be sent. Sorry!</p>";
}
?>
Avatar billede majbom Novice
26. juli 2009 - 21:43 #14
det ser rigtig nok ud....

du kan stadig vælge alle filer, men den vil ikke uploade andre end filer der ender på .mp3
Avatar billede DupreeLove Nybegynder
26. juli 2009 - 22:10 #15
hmm.. jeg prøvede ellers, og den sendte bare en tom mail? - kan man ikke gøre det sådan, at man ikke kan vælge andre filer end mp3? Det ville jo løse problemet? :)
Avatar billede majbom Novice
27. juli 2009 - 08:42 #16
havde faktisk ikke tænkt på at man kunne bruge accept-attributen (har aldrig selv brugt den), men følgende skulle gøre tricket:

<input type="file" name="fileatt" accept="audio/mpeg">
Avatar billede DupreeLove Nybegynder
27. juli 2009 - 18:23 #17
i dreamweaver vil den ikke anderkende koden accept="audio/mpeg" - den skriver der er en fejl - jeg har nemlig prøvet den vej, men ved ikke hvorfor og har søgt overalt på nettet.. det er ved at blive ret frustrerende..
Avatar billede majbom Novice
27. juli 2009 - 21:05 #18
har du prøvet bare at overhøre hvad DW siger, og så gøre det alligevel - jeg kan ikke se hvorfor den skulle brokke sig. ifølge w3c er den god nok...
Avatar billede DupreeLove Nybegynder
28. juli 2009 - 22:01 #19
det har jeg nu, og den vil stadig uploade og sende alle filer :s
Avatar billede majbom Novice
28. juli 2009 - 22:07 #20
hvordan ser din kode ud?
Avatar billede majbom Novice
04. november 2010 - 13:03 #21
dupreelove?
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester