作者回复: 访问链接通常是由服务器的模板引擎生成的,不能由客户端JS生成,否则防盗链功能会大打折扣,因为加密的密钥会泄露到客户端的JS代码中
作者回复: 客户端的URL是服务器1返回的,它可以是Nginx,也可以是其他Web服务器,因此MD5也是由服务器计算出的。校验方则确定是Nginx的secure_link模块,因为Nginx下载文件性能最好,所以通过2个服务器的搭配,完成经由客户端参与的安全验证与下载。
作者回复: secure_link通常锁住以下资源:1、对象,也就是url;2、时间,限制一个token的有效期;3、密钥,只要攻击者不知道密钥就不能伪造新的URL。 所以,作为反向代理即使拿到了url,但这个URL只能访问资源A,并不能访问资源B,而且还有时效性。
作者回复: nginx不需要知道如何分割,它只需要知道如何拼接即可,因为hash不可逆!Nginx能从URI中取出test1.txt,也能从location中找到mysecret2,接着拼接好字符串再hash出值,比对即可
作者回复: ^可以匹配上任何url,而且当前场景也不需要从url中取出一些分组的值,故如此使用。
作者回复: 是的,所以它依赖于下载页面,这个页面中的下载URL都是通过这个规则生成的。这个模块一定要配合应用服务一起工作的。
作者回复: 你好 惘 闻,valid_referer用于浏览器上的防盗链,因为refer头部是浏览器构造的,然而有时候referer被伪造怎么办呢?secure_link从原理上有2个功能,但主要还是防止已经发生的长时间盗链,比如说,如果token中携带了1小时的过期时间,盗链站点B必须每1小时就更新下链接,否则就无法使用,这可以大幅提升盗链成本
作者回复: tr类似于sed命令,可以修改字符,比如-d参数是删除,tr -d =就是把=号都删除掉。你可以看看这里:https://www.runoob.com/linux/linux-comm-tr.html 这里只是简单的示例,为了方便给大家演示才用命令行,生产级环境要严谨的设计程序生成。
作者回复: 有效的证书,必须从权威CA机构获得。Lets Encrypt就提供免费的DV证书,最长期限是三个月,可以用脚本每隔三个月自动更新,详见第18课。
作者回复: 视频中我只演示了哈希不匹配导致的链接失效,虽然我改的是时间戳,但md5参数我没改,所以哈希后不匹配导致失败,返回403. 那个时间戳表示的是绝对的过期时间,如果我把时间改为系统当前时间之前,md5也随之改动,那么md5虽然匹配上了,但参数中的时间戳小于当前时间,就会返回410. 所以,想改变失效时间,应该在生成URL(主要是时间戳和md5)上做变更。