2012-11-14 34 views
1

我正在制作一个网站,人们可以在那里注册沙滩排球假期。该网站没有在线支付,所以它是如何工作的,人们注册自己(在一个很好的HTML表单),然后你会收到一封电子邮件,应该包含发票。我已经做到了,所以这张发票是使用FPDF生成的(http://www.fpdf.org/ - 即使我认为这对于这个问题的答案并不重要)。所以FPDF需要一堆PHP变量,并用它制作PDF文件,并将该文件放在FTP服务器的目录中。现在使用PHP在网站上安全地隐藏PDF发票

,我可以看到得到这个发票从服务器到谁刚刚签署了(因为他们会希望它马上为自己注册的确认)的人的方法有两种:

1)将其附着一封电子邮件(我已经试了一个小时左右,可以做到)。如果这是更好的选择 - 那我该怎么做?上次我试过了,我淹没了一堆关于MIME的信息,这是我从未听说过的。这是正确的轨道,还是有一个更简单的方法呢?我也看过一些关于Zend_framework和PHPMailer的,但真的不知道有什么方法是正确的(或更好)一个...

或...

2)把一个链接的电子邮件到发票。现在,如果我这样做,那么URL应该以某种方式被屏蔽或加密,因为这将使它很容易找到其他发票的,如果他们正在访问的链接是:

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

显然,人们可以只需将其改为16即可,突然之间,那些具有网络知识的人可以访问所有发票。

这就是为什么我虚心问你,StackOverflow ...从FTP服务器到通信方法是电子邮件的客户端获得此发票的最佳方式(或最安全的方式)是什么?

谢谢。

回答

1

我淹没在一堆有关MIME,这是我从来没有听说过

对不起的信息,但这些真正使我敲响了警钟 - 你必须有involed的技术有基本的了解在代码中实现解决方案。

是的,你可以将它附加到电子邮件 - 但是我建议保持清除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"; 
} 
1

我会查看PHPMailer,并将发票作为附件发送。 PHPMailer非常易于使用,并且有一些很棒的示例代码。

1

只要确保发票不在公共文件夹中(即在doc根目录下),并让PHP根据请求提供服务。这样你可以强制人们登录。

另一个想要的只是将发票附加到电子邮件,虽然人们往往会失去电子邮件,他们仍然想要访问他们的发票。

1

,你必须创建一个控制器文件说:“invoice.php”,这将有力地下载指定的PDF文件,您的网址应该是这样的

让假设你已经存储在文件54219683.pdf发票文件夹,您可以在电子邮件中发送以下网址

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); 

你可以找到更多的细节,通过下载pdf文件http://www.finalwebsites.com/forums/topic/php-file-download

你不应该保存你的实际文件与数据库ID的确切映射,但你应该使用一个随机唯一的数字为每个发票文件名不能是被黑客猜测。

问题来了,当你用序列号保存你的文件,所以不要保存你的pdf文件,如1.pdf,2.pdf,3.pdf但保存一个随机数字,其次不要发送确切电子邮件但通过控制器文件下载,您可以在其中添加更多限制,并且还可以跟踪每个下载。

0

我将采用类似于共享储物柜像RapidShare的方案:

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

该解决方案是不够晦涩是安全的。对某人来说,猜测(或暴力)电子邮件地址的MD5摘要以及生成发票的时间是相当困难的。

此外,您可以像附件一样发送带有附件的电子邮件,就像其他人所说的那样,如果您使用像SwiftMailer这样的库,这非常简单。即使implementing your own这并不困难。