我正在制作一个网站,人们可以在这里报名参加沙滩排球假期。该网站没有在线支付,所以它的工作原理是,人们自己注册(在一个好的ol'html表单上),然后你会收到一封电子邮件,其中应该包含发票。我已经做了,所以这个发票是使用FPDF生成的(http://www.fpdf.org/-尽管我认为这对这个问题的答案并不重要)。因此,FPDF采用了一堆PHP变量,并用它制作了一个PDF文件,并将该文件放在FTP服务器上的一个目录中。
现在,我可以看到两种从服务器向刚注册的人获取发票的方法(因为他们希望立即确认注册):
1) 将其附在电子邮件中(我已经尝试了大约一个小时,可以完成)。如果这是更好的选择,那么我该怎么做呢?上次尝试时,我被一堆关于MIME的信息淹没了,这些信息我以前从未听说过。这是正确的路线吗?或者有更简单的方法吗?我也读过一些关于Zend_framework和PHPMailer的文章,但我真的不知道什么方法是正确的(或更好的)。。。
或者。。。
2) 在电子邮件中添加发票链接。现在,如果我这样做,那么URL应该以某种方式被屏蔽或加密,因为如果他们访问的链接是:
http://www.something.com/invoicefolder/invoice16.pdf
显然,人们可以将16改为15,突然之间,那些掌握网络知识的人就可以访问所有的发票。
这就是为什么我谦虚地问你,StackOverflow。。。将发票从FTP服务器发送到客户机的最佳(或最安全的方式)是什么?客户机的通信方式是电子邮件?
谢谢。
我淹没在一堆关于MIME的信息中,这些信息在之前我从未听说过
很抱歉,但这确实给我敲响了警钟——您必须对在代码中实现解决方案所涉及的技术有基本的了解。
是的,你可以把它附在电子邮件上——不过我建议你在对软件开发更加熟悉之前,不要使用zend框架。phpmailer和swiftmailer都提供了一个简单、文档齐全的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";
}
我会查看PHPMailer,并将发票作为附件发送。PHPMailer非常易于使用,并且有一些很棒的示例代码。
只需确保发票不在公共文件夹中(即在文档根目录下),并让PHP根据请求提供发票。通过这种方式,您可以强制用户登录。
另一个愿望是只将发票附加到电子邮件中,尽管人们往往会丢失电子邮件,而且他们仍然希望能够访问自己的发票。
你必须创建一个控制器文件,比如"invoice.php",它将强制下载指定的pdf文件,你的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);
您可以在上找到更多通过php下载pdf文件的详细信息http://www.finalwebsites.com/forums/topic/php-file-download
你不应该保存你的实际文件与数据库id的精确映射,但你应该为每个发票文件名使用一个随机的唯一数字,这是黑客猜不到的。
当你用序列号保存文件时,问题就来了,所以不要像1.pdf、2.pdf、3.pdf那样保存pdf文件,而是用随机数字保存。其次,不要发送带有文件确切url的电子邮件,而是通过控制器文件下载,在控制器文件中你可以添加更多限制,还可以跟踪每次下载。
我会采用类似于RapidShare:这样的共享储物柜的方案
domain.com/invoice/{md5($email)}/{time()}.pdf
这个解决方案是模糊的,是安全的。有人很难猜测(或粗略地猜测)电子邮件地址的MD5摘要和发票生成的时间。
此外,正如其他人所说,你可以发送带有附件的电子邮件,如果你使用像SwiftMailer这样的库,这非常简单。即使实施自己的也没那么难。