2011-08-07 13 views
0

私はしばらくの間、いくつかのコードに苦労しました。私は(。私が知っているだけで、それが仕事を得るために本当に頑丈しようとしている)、このようになりますHTMLフォームを持っている:ファイルをアップロードし、pdfであることを確認してから、Swiftmailerを使用してください。

<form method="post" action="<?php echo $_SERVER['PHP_SELF']; ?>" > 
<table> 

<tr> 
    <td> Name </td> 
    <td> <input type="text" name="name" size="30"></td> 
</tr> 
<tr> 
    <td> Email </td> 
    <td> <input type="text" name="email" size="30"></td> 
</tr> 

<tr> <td>&nbsp;</td><td>&nbsp;</td> </tr> 

<tr> 
    <td> Title of Article &nbsp;&nbsp;</td> 
    <td> <input type="text" name="title" size="40"></td> 
</tr> 
<tr> 
    <td> Course </td> 
    <td> 
    <select name="course"> 
    <option>CEG - Computer Architecture I</option> 
    <option>BIO - General Biology I</option> 
    <option>BIO - General Biology II</option> 
    <option>BIO - Introduction to Human Genetics</option> 
    </select> 
    </td> 
</tr> 
<tr> 
    <td> File </td> 
    <td> <input type="file" name="file" id="file"></td> 
</tr> 

<tr> <td>&nbsp;</td><td>&nbsp;</td> </tr> 

<tr> 
    <td valign="top"> Additional Info </td> 
    <td><textarea rows="3" cols="40" name="info"></textarea></td> 
</tr> 

</table> 

<input type="checkbox" name="agree"> I agree to the points outlined above and am willing to submit my article <br> 
< input type="submit" name="submit" value="Submit"> 

</form> 

このフォームは自分自身を呼び出して、これは私が今まで持っているものです

if (isset($_POST['submit'])) { 
    if (!isset($_POST['agree']) || 
     !isset($_POST['name']) || 
     !isset($_POST['email']) || 
     !isset($_POST['title']) || 
     !isset($_POST['course']) || 
     !isset($_POST['file'])) { 
     echo 'Please complete all required fields<br>'; 
    } else { 
     $name = $_POST['name']; 
     $email = $_POST['email']; 
     $title = $_POST['title']; 
     $course = $_POST['course']; 
     $file = $_POST['file']; 

     $message = "Name: ".$name."\n"; 
     $message .= "Email: ".$email."\n\n"; 
     $message .= "Title of Article: ".$title."\n"; 
     $message .= "Program: ".$course."\n\n"; 
     $message .= "Additional Info: ".$info; 

     if (!preg_match("/.pdf$/", $file)) { 
      echo 'Article must be in pdf format<br>'; 
      exit; 
     } 

     require_once 'include/swift_required.php'; 

     $transport = Swift_MailTransport::newInstance(); 
     $mailer = Swift_Mailer::newInstance($transport); 
     $swift = Swift_Message::newInstance() 
      ->setSubject('New Institutum Submission') 
      ->setFrom(array($email => $name)) 
      ->setTo(array('[email protected]')) 
      ->setBody($message) 
      ->attach(Swift_Attachment::fromPath($file)); 

     $result = $mailer->send($swift); 
     if ($result) { echo 'Article sent. Please allow required amount of time to review submission.\n'; 
         echo 'You will be contacted by email when we go over your submission.'; } 
     else {   echo 'Message failed'; } 
    } 
} 

私はそれがpdfファイルかどうかを確認するために正規表現を使用していますが、これは正しい方法です(誰かがpdf拡張子を持つファイルの名前を変更できるため)。また、まだファイルを一時的にアップロードする方法を実装していません。これは、swiftmailerを使って添付ファイルとして追加する前に、ファイルをローカルにアップロードする必要があると想定しています(右?)。

私は少なくとも正しい軌道にいるのですか?私はこのようにPHPを扱ったことはありません。

は、いくつかのデバッグニーズ:

 # Create the message 
     # ---------------------------------------------------------------- 
     $name = $_POST['name']; 
     $email = $_POST['email']; 
     $title = $_POST['title']; 
     $course = $_POST['course']; 
     $file = $_POST['file']; 

     $message = "Name: ".$name."\n"; 
     $message .= "Email: ".$email."\n\n"; 
     $message .= "Title of Article: ".$title."\n"; 
     $message .= "Program: ".$course."\n\n"; 
     $message .= "Additional Info: ".$info; 

     # Upload temporary files 
     # ---------------------------------------------------------------- 
     $uploaddir = '/home/public/uploads/'; 
     $uploadfile = $uploaddir . basename($_FILES['file']['name']); 
     if (move_uploaded_file($_FILES['file']['tmp_name'], $uploadfile) == false) { 
      echo 'Could not move file'; 
      exit; 
     } 

     if ($_FILES['file']['type'] != "application/pdf") { 
      echo 'Not a pdf file'; 
      unlink($uploadfile); 
      exit; 
     } 

答えて

2

<form>にはenctype="multipart/form-data"がありません。アップロードするとアップロードが開始される前に終了します。

1

あなたはそれが操作できるよう、ファイル拡張子をチェックする必要はありません。

代わりに、MIMEタイプを確認する方法があります。 here(例2)を参照してください。 PDFファイルのMIMEタイプがapplication/pdf

またSaxoierのコメントに注意されています

をこの答えは、コンテンツタイプに依存しても安全であることを意味します。 ファイルに有効なコンテンツが含まれているかどうかを確認するには、 を特定のパーサー(たとえば、画像:GD)と解析するのが最適です。使用可能なファイルがない場合は、 など、有害な可能性のあるファイルは受け付けないでください(例:* .php [ ブラックリストなしのファイルの保存])。

+0

pdfのMIMEタイプを確認するにはどうすればよいですか?これはswiftmailerによって処理できますか? – n0pe

+1

私は自分の投稿にPDF MIME-Typeを追加しました。また、私が投稿したリンクをチェックしてください。 –

+0

'$ _FILES [file] [type]'で利用可能なMIMEタイプは、ファイルの拡張子として改ざんされることはありません。実際、ほとんどのユーザエージェントはファイル拡張子をメディアタイプにマップするだけです。 – mario

関連する問題