使用Web加速器进行内容保护
Web加速器 服务器
Published: 2020-12-13

本文是樱花互联网Advent Calendar 2020第13天的文章。

使用一次性URL进行内容保护

当您想要向特定用户分发内容时,通常会在进行密码认证后下载内容。

但是,如果与CDN结合使用,可能会遇到无法使用BASIC认证的情况,或者更改URL时缓存会被视为不同的内容,从而无法有效利用CDN。

Web加速器具有一次性URL的功能,因此我将介绍如何使用它进行内容保护。

一次性URL是什么?

一次性URL是发出确定有效期限的URL的功能。

  • 可以创建在某一时间之前可访问的URL
  • 超过有效期限后会返回403 Forbidden

如何使用它?

具体的手动操作在下面的手册中有介绍,我将一边进行设置一边解释。

Step1 给非公开内容的响应添加秘密

为希望仅通过有效的一次性URL进行访问的内容,设置返回秘密(密钥)。

这次使用樱花的租赁服务器,因为搭建Web服务器相对麻烦,但在Apache上也可以同样操作。

此次使用如下的目录结构。

www
├── index.html
└── secret
    ├── .htaccess ← 在这里记录
    ├── himitsu.jpeg
    └── himitsu.mp4

由于希望secret目录中的内容保持非公开,因此要在该目录下的.htaccess中写入返回秘密的头。

如果希望secret目录中的内容缓存1小时(3600秒),可以通过Cache-Control进行设置。

Header set X-WebAccel-Secret "Himi2NoSecret!"
Header set Cache-Control "s-maxage=3600"

返回的秘密应设置为不易被他人猜测的字符串。

在www下的index.html中不会有X-WebAccel-Secret的头,因此可以正常访问。

有人会想,这里是秘密密钥,若被访问就暴露了!若直接访问租赁服务器就能看到内容!您想得没错,但这一点稍后会解释。

Step2 在Web加速器中进行设置

在Web加速器中创建并注册站点。

这次仅进行一次性URL的测试,因此注册为子域名。

确认已启用提交的站点,并检查状态。

Step3 通过Web加速器尝试访问

现在让我们通过公开域名进行访问
https://xxxxxxx.user.webaccel.jp/

您应该已经看到了www/index.html中的内容。
因为这里没有附加X-WebAccel-Secret,所以可以正常显示。

Step4 试着访问/secret/himitsu.jpg

当您访问http://xxxxxxx.user.webaccel.jp/secret/himitsu.jpeg时

会返回403 Forbidden,无法访问。

使用设置在X-WebAccel-Secret中的秘密生成URL。
以下是生成URL的PHP脚本。

<?php
$base_url="http://xxxxxxx.user.webaccel.jp";
$file_path="/secret/himitsu.jpeg";
$secret = "Himi2NoSecret!";
$limit_time = sprintf("%08x", time()+600);  // 有效期为10分钟(600秒)

echo generateURL($base_url, $file_path, $secret, $limit_time) . "\n";

function generateURL($base_url, $file_path, $secret, $limit_time) {
    $md5 = md5("/" . $file_path . "/" . $secret . "/" . $limit_time ."/" );
    $url = $base_url . $file_path . "?webaccel_secure_time=" . $limit_time . "&webaccel_secure_hash=" . $md5;
    return $url;
}

应该能够生成如下的URL,您可以使用这个URL进行访问。

http://xxxxxxx.user.webaccel.jp/secret/himitsu.jpeg?webaccel_secure_time=5fbdf873&webaccel_secure_hash=a82e1a55b2ec4da163a542e2354269f7

内容成功显示。

由于生成的URL有效期为10分钟,等待10分钟后…

成功返回Forbidden,无法访问。

通过使用临时有效的URL(一次性URL),可以让Web加速器缓存同一内容,同时分发给特定用户。

不过,如果直接访问租赁服务器会…

当然可以访问。
需要拒绝除Web加速器以外的连接。
允许仅来自Web加速器的源IP地址的方法也有,但可以利用提供的原始保护(Origin Guard)功能。

Step5 配置原始保护

在Web加速器的站点设置中使用原始保护令牌。

按下生成令牌后,将生成以下随机令牌。

这个令牌会附加到对原始请求中,因此仅在有此令牌的情况下,允许访问。

让我们将.htaccess修改如下

RewriteEngine On
RewriteCond %{HTTP:X-WebAccel-Guard} !^T0VAn64Kt8QD8crDEFPGqg$
RewriteRule ^(.*)$ - [F,L]
Header set X-WebAccel-Secret "Himi2NoSecret!"
Header set Cache-Control "s-maxage=3600"

直接访问已被禁止。

总结

通过结合Web加速器的一次性URL功能和原始保护功能,可以创建临时可访问的URL。

非常适合用于付费内容的分发,供特定用户使用。

最后

预计在1月底,使用Let’s Encrypt证书的SSL自动发行和更新功能将发布于Web加速器,请期待!