我用PHP生成一个* .csv文件,效果很好。问题是,它包含一堆敏感数据。我已经非常仔细地完成了我的权限,因此如果没有正确的用户,您将无法访问下载链接或生成文件。 我遇到的问题是,在用户下载文件后,需要立即删除该文件。我意识到,机会很小,有人会坐在那里扫描我的网站结构,但数据非常重要,我想覆盖我的屁股: - )
我最初有这个:
<a href="<?php echo base_path().$ourFileName ?>"><?=$ourFileName?></a>
这对于下载文件非常有用,但是我很难用它做任何操作,因为如果你将PHP代码嵌入OnClick =“”中它将在点击发生之前执行,因为所有在处理HTML和JAVASCRIPT之前,PHP代码在服务器端呈现......对吗?我搜索了互联网,似乎我没有得到javascript来删除文件的权限......不可否认,我可能是非常错误的。
所以我把链接变成了一个表单:
<?PHP
if(isset($_POST['submit']))
{
header("Location: ".base_path().$ourFileName);
unlink(base_path().$ourFileName);
}?>
<form action="<? $PHP_SELF ?>" method="post">
<input type="submit" value="Submit" name="submit">
</form>
但显然,由于标题,unlink()将永远无法访问...至少我认为...... 除了header()之外还有另一种方法可以将文件下载到它们吗? 我意识到我可以每分钟或者其他什么地运行一个cron作业而且只是:
rm -rf *.csv
这会解决问题,但是如果用户正在下载文件并且cron开始运行会发生什么?或者页面已生成,但由于某种原因,他们暂时没有点击链接?
也许有一些方法来配置我的.htaccess文件,这样你只能在从页面链接时访问该文件?
我是否过于复杂?
互联网的任何想法大师?
- 编辑 根据流行的建议,我正在研究新的标题格式,因此代码如下所示:
<?PHP if(isset($_POST['submit']) && ($user->uid))
{
myroom_render_csv($ourFileName, $csv_string);
}?>
<form action="<? $PHP_SELF ?>" method="post">
<input type="submit" value="Submit" name="submit">
</form>
并在另一个文件中:
<?PHP function myroom_render_csv($file_name, $csv_string) {
header('Content-type: text/csv');
$header_string2="Content-Disposition: attachment; filename=\"".$file_name."\"";
header($header_string2);
echo $csv_string;
} ?>
但是我获得了完整HTML页面和CSV数据的转储。想法?
答案 0 :(得分:5)
这是一个更简单的解决方案 - 不要创建文件。而不是将数据写入.csv文件,只需在php脚本中设置标题,如下所示:
header('Content-type: text/csv');
header('Content-Disposition: attachment; filename="whatever.csv"');
echo $csv_data;
在php脚本中打印出你的csv数据,浏览器将其视为文件下载。这样,您就可以自由控制文件的访问权限和时间。
答案 1 :(得分:1)
一些评论。
这对于下载文件非常有用, 但是我很难做任何事情 与它有关的行为,因为如果 你将PHP代码嵌入OnClick =“” 它将在点击之前执行 发生了,因为所有PHP代码都是 在HTML之前呈现服务器端 处理JAVASCRIPT ......对吗?一世 在互联网上搜索,但事实并非如此 好像我可以得到javascript 有权限删除 文件......诚然,我可以 错。
你是完全正确的。
我使用PHP生成* .csv文件 它很棒。问题是,它 包含一堆敏感数据。 我已经完成了我的权限 仔细,所以你无法到达 下载链接或生成文件 没有正确的用户。该 我遇到的问题是正确的 用户下载文件后, 文件需要立即删除。 我意识到,机会很小 有人会坐在那里 扫描我的网站结构,但是 数据对我来说非常重要 想掩盖我的屁股: - )
那为什么它是一个文件?只需将其与相关标头一起发送到浏览器即可提示浏览器将其作为可保存文件资源呈现给用户。它不必是Web服务器上的物理文件。
其他人为此提供了代码;我真的只想指出你对客户端/服务器端角度是正确的。 :)
但显然,由于标题
,unlink()永远不可访问
实际上,没有。 header
不会停止脚本。
header("Location: ".base_path().$ourFileName);
unlink(base_path().$ourFileName);
您的unlink
将在浏览器开始开始 base_path().$ourFileName
的请求之前很久就已执行并完成。
但是,通常,您应该在exit
之后编写header
来停止代码处理:
header("Location: ".base_path().$ourFileName);
exit;
unlink(base_path().$ourFileName);
现在,正如你所说,是的,unlink
永远不会发生。