保护服务器中的文件存储

时间:2012-05-29 03:22:21

标签: php file file-upload

我有一个工作网站,所以有很多cv上传到服务器并存储在公共的文件夹位置。我只是想知道我可以在Apache,php级别做什么安全措施来阻止未经授权的人访问其他人cv的

我有

  1. 禁用目录浏览
  2. 在html中创建了虚假链接,然后将.htaccess映射到另一个位置
  3. ...等

    只是想知道有没有办法我们可以完全隐藏出现在浏览器网址中的文件名(可能带有像application / pdf ..etc这样的标题,并且可以随时读取文件的内容)这是可能的还是还有更好的方法将它们存储在MySQL DB中吗?

3 个答案:

答案 0 :(得分:5)

将文件存储在文档根目录之外(因此您的服务器默认情况下不会将URL映射到它)并使用确认经过身份验证的用户的脚本,然后将简历的内容仅流式传输给该用户。

例如......

<?php

session_start();

include 'app.php';

$userAuthenticated = (new Auth)->check($_SESSION['username']);

$file = isset($_GET['file']) ? 
        $_GET['file'] :
        FALSE;

$file = FILES_PATH . DIRECTORY_SEPARATOR . preg_replace('/[^\w.]/', '', $file);

if ($userAuthenticated AND file_exists($file)) {
    readfile($file);
} else {
    header('HTTP/1.1 403 Forbidden');
    echo 'You\'re not authenticated!';
}

此代码应该为您提供一般性的想法。

答案 1 :(得分:2)

永远不要在docroot中允许用户上传的文件。这是非常不安全的,因为您托管其他人提供的内容。

绝不允许用户上传的文件与用户提供的名称一起存储。想象一下,如果有人上传了somescript.php,你就这样命名并将其保存在你的docroot中。它可以由任何人执行。

将文件存储在docroot之外,将文件的详细信息(原始名称,mime类型等)保存在数据库中,并使用readfile()或类似内容通过脚本访问它们。只允许那些应该有访问权限的人访问这些文件。

答案 2 :(得分:0)

您可以使用.htaccess重写。

在php中使用headers和readfile()函数,在mysql数据库中更改并存储文件id,然后确保拒绝所有.htaccess中的上传目录。