1

私は人々がビーチバレーボールの休日に申し込むことができるウェブサイトを作っています。ウェブサイトにはオンライン支払いがないので、それがどのように機能するかは、人々が自分で登録し(古き良きhtmlフォームで)、その後、請求書が含まれているはずの電子メールを受信します。私が作成したので、この請求書はFPDF(http://www.fpdf.org/-この質問への回答には重要ではないと思いますが)を使用して生成されます。したがって、FPDFは一連のPHP変数を取得し、それを使用してPDFファイルを作成し、このファイルをFTPサーバー上のディレクトリに配置します。

これで、サーバーからサインアップしたばかりの人にこの請求書を受け取る2つの方法を見ることができます(サインアップの確認のためにすぐに必要になるため)。

1)それを電子メールに添付します(私は約1時間試しましたが、それを実行することができました)。これがより良いオプションである場合-それではどうすればよいですか?前回試したときは、今まで聞いたことのないMIMEに関する情報に溺れてしまいました。それは正しい道でしたか、それとももっと簡単な方法がありますか?Zend_frameworkとPHPMailerについても読んだのですが、どのアプローチが正しい(またはより良い)かわかりません...

また...

2)電子メールに請求書へのリンクを入れます。さて、これを行う場合、アクセスしているリンクが次の場合、他の請求書を見つけるのが簡単になりすぎるため、URLを何らかの方法でマスクまたは暗号化する必要があります。

http://www.something.com/invoicefolder/invoice16.pdf

明らかに、人々はその16を15に変更することができ、突然、Web知識のスニッチを持っている人は、すべての請求書にアクセスできるようになります。

だから私は謙虚にあなたに尋ねます、StackOverflow ...この請求書をFTPサーバーからクライアントに受け取るための最良の(または最も安全な方法)は何ですか?通信方法は電子メールですか?

ありがとうございました。

4

5 に答える 5

1

PHPMailerを調べて、請求書を添付ファイルとして送信します。PHPMailerは非常に使いやすく、優れたサンプルコードがいくつかあります。

于 2012-11-14T12:10:43.753 に答える
1

請求書がパブリックフォルダ(つまり、ドキュメントルートの下)にないことを確認し、要求に応じてPHPにそれらを提供させます。このようにして、ユーザーに強制的にログインさせることができます。

もう1つの要望は、請求書を電子メールに添付することだけですが、人々は電子メールを失う傾向があり、それでも請求書にアクセスしたいと考えています。

于 2012-11-14T12:12:44.637 に答える
1

指定されたpdfファイルを強制的にダウンロードする「invoice.php」というコントローラーファイルを作成する必要があります。URLは次のようになります。

ファイル54219683.pdfを請求書フォルダに保存したとしましょう。次のURLをメールで送信できます。

http://www.example.com/invoice.php?id=54219683

これは非常に簡単な例です

//file: invoice.php
//content type
$file = $_GET['id'].'.pdf';
header('Content-type: application/pdf');
//open/save dialog box
header('Content-Disposition: attachment; filename="$file"');
//read from server and write to buffer
readfile($file);

http://www.finalwebsites.com/forums/topic/php-file-downloadでphpファイルを介してPDFをダウンロードするための詳細を見つけることができます

データベースIDに正確にマッピングして実際のファイルを保存するべきではありませんが、ハッカーが推測できない請求書ファイル名ごとにランダムな一意の番号を使用する必要があります。

ファイルをシリアル番号で保存すると問題が発生するため、1.pdf、2.pdf、3.pdfなどのPDFファイルを保存せず、ランダムな番号で保存します。次に、ファイルの正確なURLを記載したメールを送信しないでください。ただし、制限を追加したり、各ダウンロードを追跡したりできるコントローラーファイルを介してダウンロードします。

于 2012-11-14T12:13:27.310 に答える
1

今まで聞いたことのないMIMEに関する情報に溺れてしまいました

申し訳ありませんが、これは本当に私の警鐘を鳴らします-あなたはコードでソリューションを実装するために含まれる技術の基本的な理解を持っている必要があります。

はい、メールに添付することはできますが、ソフトウェア開発に慣れるまで、zendフレームワークには近づかないことをお勧めします。phpmailerswiftmailerはどちらも、メールの添付ファイルを処理する、シンプルで十分に文書化されたAPIを提供します。

この問題の簡単な解決策は、PDFファイルをドキュメントルートの外に置き、追加の検証として実行するプロキシスクリプトを使用することです。例えば

define('MY_SECRET', 'some rAnd0m strlng');
define('DOC_DIR','/path/to/files');

function getIdHash($id)
{
   return sha1($id . MY_SECRET);
}

$id=(integer) $_GET['doc_id'];
$filename=DOC_DIR . '/' . $id . '.pdf';
if ( ($_GET['chk']==getIdHash($id)) 
    && file_exists($filename) && is_readable($filename)) {
   header("Content-type:application/pdf");
   readfile($filename);
   exit;
} else {
   header("Status: 404 Not Found");
   print "Document does not exist or not authorized";
}
于 2012-11-14T12:16:29.693 に答える
0

私はRapidShareのような共有ロッカーに似たスキームを採用します:

domain.com/invoice/{md5($email)}/{time()}.pdf

この解決策は、安全であるために十分にあいまいです。電子メールアドレスのMD5ダイジェストと請求書が生成された時刻を誰かが推測(またはブルートフォース)するのはかなり難しいでしょう。

さらに、他の人が言っているように、添付ファイル付きの電子メールを送信することもできます。SwiftMailerのようなライブラリを使用する場合は非常に簡単です。独自に実装する場合でも、それほど難しくはありません。

于 2012-11-15T16:36:32.310 に答える