将文件设置为私有并仅通过 PHP 脚本访问? (在服务器内)

Posted

技术标签:

【中文标题】将文件设置为私有并仅通过 PHP 脚本访问? (在服务器内)【英文标题】:Set a file as private and access only through PHP script? (Inside a server) 【发布时间】:2022-01-18 17:42:19 【问题描述】:

我的主机位于共享主机中(我认为这无关紧要)。我想在 php 脚本中执行一些操作,这些操作包括从文件中读取。我希望任何人都不能访问该文件,只能通过 php 脚本访问(否则任何人都可以通过访问链接在未经许可的情况下获取该文件)。我该怎么做?

将文件设置为私有/不可通过其 URL 访问 设置一个可以实际读取该文件的php脚本

谢谢。

【问题讨论】:

把它放在 web 根目录之外(通常称为 wwwdocspublichtml)并通过命令行调用它...或实现类似密码表单的东西或 API 密钥。 假设文件只是一张照片,我可以在那里配置的不多。我想上传那个“照片”并且不允许任何人查看它,但仍然可以从 php 脚本中读取它 outside-the-web-root 也适用于此。您可以使用file_get_contentsreadfilefopen 等来访问脚本中的内容。 如果您在谈论照片,则将照片作为 BLOB 数据保存到数据库表中,然后 php 检索 BLOB 数据并将其呈现为图形(jpeg 或 png)。有关详细信息,请参阅此SO_link。这样,其他用户将无法从 URL 中读取它,但可以从您的 PHP 中获取它(当然您会施加某种控制) 不要将图像放入数据库中。以后会给你带来很多麻烦。这不值得。 ***.com/a/3751 【参考方案1】:

方法:.htaccess 文件

如https://***.com/a/70365577/7335057 中所述,您可以使用 .htaccess 文件,只要您使用的是 apache 或兼容的网络服务器。

方法:唯一网址

拥有长的随机链接也是完全合理的。 https://example.com/usercontent/326a98f7a6c61fb3e37c310c414ca23b16948b4a/test.jpg

您需要确保无法使用暴力破解找到链接,并且只能链接到当前用户可以查看的文件。

URL 的326a98f7a6c61fb3e37c310c414ca23b16948b4a 部分对于每个用户都必须是唯一的。它可以不是是经过哈希处理的 userId 或类似的东西。

以下是如何为您的 URL 生成高度唯一但随机的字符串的示例:

$partLength = 10;
$fix = "your-app-node-1";
$time = microtime(true);
$random = random_int(1000000, 9999999);
    
$urlPart = substr(sha1($fix), -$partLength)."-";
$urlPart .= substr(sha1($time), -$partLength)."-";
$urlPart .= substr(sha1($random), -$partLength);

修复部分主要是针对当你使用多台服务器的时候,所以ids不会冲突。

方法:根文件夹外的文件

并非所有共享网络空间的托管商都允许这样做,但如果您这样做,请将文件放在根目录上方的文件夹中,以使它们无法通过网络请求访问。但请注意路径遍历攻击。

根目录之外的文件通常仍然可以使用 PHP 访问。

【讨论】:

我不明白,如果我创建了那个 id 文件就不会在那里,还是你的意思是我必须复制文件并将其放入该目录?看起来它会产生无尽的垃圾 您可以移动而不是复制它们。也许你以前看过 Discord 链接:discordapp.net/attachments/676730...4856/unknown.png 这些链接是公开的,但你永远猜不到。【参考方案2】:

您可以通过使用以下代码添加 .htaccess 来轻松禁止访问文件夹:

deny from all

那么你仍然可以通过 PHP 使用 fopen()file_get_contents() 访问它

【讨论】:

以上是关于将文件设置为私有并仅通过 PHP 脚本访问? (在服务器内)的主要内容,如果未能解决你的问题,请参考以下文章

阻止通过 http 直接访问文件,但允许 php 脚本访问

通过 .htaccess 文件为所有 PHP 脚本设置 HTTP 标头

php面向对象Object

如何通过php页面执行shell脚本?

无法通过私有 IP 从另一个实例访问 AWS EC2 实例

将任务管理器设置为运行 VB 脚本