本文是樱花互联网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加速器,请期待!