保护用于通过PHP动态绘制可视化的csv文件


Protecting csv files used for plotting visualizations dynamically via PHP

在开始之前,我必须警告您,我不是一个很好的网络程序员,所以我的方法可能看起来有些迂回,我使用的术语可能很尴尬。

情况是这样的。我正在为用户开发一个可视化数据的网站。

我有一个公共php页面位于/var/www/thepage/index.php路径中(是的,Linux服务器+apache)。这是网站的主页,也是用户在表单中进行选择的地方。

表单提交后,将调用第二个php页面,第一个php页面中的表单选择将在这里传递给创建可视化的javascript。为了实现这一点,csv文件首先使用从MySQL数据库查询的php脚本写入该目录。

问题是,我希望用户能够看到可视化效果,但不能下载csv文件(除非他们是管理员)。我允许管理员下载文件的方法是创建一个受保护的(.htaccess)子目录/var/www/thepage/secure/,该子目录有一个索引html,管理员登录后运行cgi脚本(单击下载链接时会提示)。此脚本从/var/www/thepage/目录复制最新的文件(具有动态名称),并将它们移动到具有静态文件名的secure/目录。指向这些具有静态名称的文件的下载链接位于受保护的index.html上。但是,如果用户查看第二个php页面的源代码,他们也可以下载文件,因为他们知道路径,并且这些文件不受保护。

如果删除文件权限,php脚本也将无法读取文件,导致可视化失败(我希望普通用户能够看到可视化)。拥有这些文件也很重要,因为我有一个cgi脚本(bash+awk)在文件上运行数学函数,这也需要权限

模糊文件名也不起作用,因为文件是动态编写的,html页面的源代码会显示正在编写的模糊csv文件名。

我该如何解决这个问题?我更希望而不是必须为普通用户创建会话和登录等…

如前所述,很难在网络上隐藏任何内容,尤其是当您需要将其发送到javascript时。你可以尝试一下破解它,可能会让你损失一点性能,但会对那些不懂网络的人起到威慑作用。。。但也可能被其他人视为一种挑战:)

一个粗略的例子是。。

$csv = fgetcsv("/var/www/thepage/secure/file.csv");
echo "<script type'text/javascript'>";
echo json_encode($csv);
echo "</script>";

这里有点生疏,但javascript应该将json解释为一个对象,您可以在代码中使用它。您可以更进一步,在发送php数组之前将其分解为多个部分,这样就更难知道发生了什么。

就像我说的。这很难,但它可能是一个解决方案。

我认为最好的方法是将文件存储在web浏览器无法访问的安全目录中(在web根目录之外)。然后,您可以通过下载链接向经过身份验证的用户显示可用文件的列表。当他们点击链接时,你可以检查他们是否登录,如果登录了,然后开始下载文件。

PHP readfile-可能有助于