2012-05-10 67 views
8

我在干什么:如何安全地存储在服务器上的文件

基本上,我需要通过创建PHP编写的,一旦登录,登录页面担保的网站,你有一个搜索栏,上面写着整数和数据被发送到一个PHP脚本,该脚本用数字作为名字来检索图像。

(我会存储在该服务器上几千个图像进行搜索 - 库存图片)

-

我需要什么帮助:

从我的研究,我理解你“不要”使用MySQL等数据库来存储实际的图像,因为速度和效率都很低。如果您没有将其存储在数据库中,并且按照建议将其保留在服务器的文件系统上,如果有人在地址栏中键入直接URL,是不是会将它们带到我的服务器上的文件中?

你如何防范这一点。我不想在我的服务器上没有成功浏览登录页面的文件。

感谢您的任何帮助,任何见解或建议,将不胜感激。这对我来说很重要,因为将来会增加更复杂的信息。

+2

你可以有一个目录不能通过HTTP访问,你可以使用php脚本来检查用户是否登录,如果是,从指定的目录中读取文件并输出。 –

+0

我已阅读将文件保留在“public_html”文件夹中。这会使它完全无法从http访问吗? 那么我的PHP脚本如何访问这些文件呢? – DMor

+0

当使用Apache与cPanel时,'public_html'通常是从中提供文件的目录。这意味着,当你键入'http:// yoursite.com'时,数据将从'/ var/www/username/public_html'中拉出。这也意味着,无论您在URL中输入什么,“/ var/www/username”都是**不可**。这也意味着你在那里创建的目录,比如'/ var/www/username/files'也不可访问。从你的PHP脚本中,你可以用'file_get_contents('/ var/www/username/files/imagename.extension');'来访问它。 –

回答

6

推荐的方式Ø f通过PHP(或任何其他脚本)处理文件下载是通过使用所谓的“X-Sendfile”响应头。

PHP脚本处理身份验证,一旦验证,它将设置一些响应头和一个'X-Sendfile',它告诉Web服务器传送文件;脚本结束并且Web服务器接管。

在这里看到一个简单的例子:

http://www.jasny.net/articles/how-i-php-x-sendfile/

+1

我会研究这个,谢谢。 – DMor

0

你能做到这样 写的资源服务于PHP这样

image.php?requestid=..... 
在该文件中,你得到的requestId和读取数据库中的实际链路(本地链路)

,读取图像文件,然后将数据输出到浏览器

$id = $_GET['requestid']; 
$link = get_local_link_from_id($id); // return /images/file1.png...... 
$data = file_get_contents($link); 
header('Content-Type', 'image/png'); 
echo $data; 

但我认为你不应该这样做,只是重命名文件随机创建他们中的很多....

+0

他们需要保留原始号码,这不是我的系统,而是根据雇用我的人的要求。 这足够安全吗?只要我的PHP脚本过滤请求,更正? – DMor

+0

GET永远都不安全,即使POST也可能不足以保证安全性。 – ilhnctn

+0

@ilis - 您的评论有何意义? GET和POST是HTTP使用的方法,只有在解释用户输入时被误用时,它们才是“不安全的”。 –

1

这可能是矫枉过正的situtation,但我这是怎么想这样做的一个应用程序我正在开发:

第一,有4个服务器,一个Web服务器,一个中间件服务器和一个数据服务器,当有人向Web服务器发送请求时,Web服务器连接到中间件服务器并请求文件,用户凭证,如会话密钥和所请求的文件。中间件连接到数据库并验证会话和用户对该文件的权限。它会返回一个错误或二进制数据(如果他们有权访问)。如果关闭Web服务器和中间件服务器上的输出缓冲,则可以将中间件服务器的100k块发送到Web服务器,并且Web服务器将在接收第二个块时输出第一个块。

文件本身可以存储通过FTP,SFTP,或其他文件共享数据库服务器上

它绝对不是为使用X-sendfile的那样有效,但如果有人能够PWN你的web服务器,他们将仍然无法访问文件 - 在上述情况下,他们会。 Web服务器是唯一的公共服务器,所以其余服务器应该连接到专用网络上。

,您还可以将数据发送到将加密/解密的实际文件数据

如果任何人有关于如何提高这个任何想法,我很感兴趣的加密服务器。

+0

有趣的,但这肯定比我需要更复杂(但它是有趣的阅读)。我当时并不知道.htaccess,它可以阻止查看整个文件夹。我已经实现了这一点。我有一个获取数据的HTML登录表单,将其发送给验证用户的处理脚本,如果验证,则将用户发送到搜索页面。用户输入一个Item#并发送到另一个处理脚本,该脚本访问数字为主键的数据库,并保存文件路径和其他信息。如果存在,它将拉动文件路径 – DMor

+0

图像的文件夹受.htaccess(“DENY FROM ALL”)保护。我也使用SSL并将关于图像的其他信息存储在MySQL数据库中 – DMor

相关问题