• 码农Kevin亮
    2019-05-13
    请教老师,我也不是太理解这个secure_link的实现流程。
    理论上说,一个反向代理服务器可以模拟浏览器的所有请求参数,使得反向代理就是一个浏览器客户端。那么secure_link的校验流程的哪一步可以鉴别出来呢?

    作者回复: secure_link通常锁住以下资源:1、对象,也就是url;2、时间,限制一个token的有效期;3、密钥,只要攻击者不知道密钥就不能伪造新的URL。
    所以,作为反向代理即使拿到了url,但这个URL只能访问资源A,并不能访问资源B,而且还有时效性。

    
     1
  • Hana
    2019-04-05
    echo -n 'test1.txtmysecret2' | openssl md5 -hex 这个命令中的密钥不应该是'testq.textmysecret2' 本身么,为啥后面匹配的时候是‘mysecret2',nginx 怎么知道怎么分割?

    作者回复: nginx不需要知道如何分割,它只需要知道如何拼接即可,因为hash不可逆!Nginx能从URI中取出test1.txt,也能从location中找到mysecret2,接着拼接好字符串再hash出值,比对即可

    
     1
  • lxin131
    2019-01-03
    老师你好,在视频的11:38的时候的那个rewrite我没有看明白,rewrite不是应该跟一个正则表达式和一个跳转的location吗,为什么^后面没有正则表达式呢?

    作者回复: ^可以匹配上任何url,而且当前场景也不需要从url中取出一些分组的值,故如此使用。

    
     1
  • fusion
    2020-01-09
    都是生成md5,为什么secure_link_secret方式和secure_link_md5不一样,echo -n '<时间戳><uri><客户端ip><secret>' |openssl md5 -binary |openssl base64 |tr +/-|tr -d= 这个后面“|tr +/-|tr -d=”什么意思,为什么secure_link_secret方式不用base64,直接echo -n '<link><secret>' |openssl md5 -hex

    作者回复: tr类似于sed命令,可以修改字符,比如-d参数是删除,tr -d =就是把=号都删除掉。你可以看看这里:https://www.runoob.com/linux/linux-comm-tr.html
    这里只是简单的示例,为了方便给大家演示才用命令行,生产级环境要严谨的设计程序生成。

    
    
  • 刘强
    2020-01-05
    老师您好:请问我用centos7搭建了私有CA服务器,用nginx的ssl功能添加了证书,浏览器还是显示证书无效,不是权威机构颁发的,有什么办法能让我的CA服务器获取有效的证书 谢谢

    作者回复: 有效的证书,必须从权威CA机构获得。Lets Encrypt就提供免费的DV证书,最长期限是三个月,可以用脚本每隔三个月自动更新,详见第18课。

    
    
  • call
    2019-12-10
    是否可以理解为
    我有一个网站a 用户为 b 盗链网站为c
    如果静态页面html引用url(如html里的<a href>) 此处的链接必须是加密后的链接 写死到html文件里
    但是没发区分 b和c的地址(不可能每一个新的用户 回去生成一套新的静态文件)
    如果需要完成连接过时(需要后台定时刷新静态文件)
    如果动态页面引用url 每次返回时 a都会调用该加密过程 或访问加密服务器 返回加密后的url替代返回的jsp之类里引用的url(其中加密用到b的地址之类)
    此时如果有一个网站c 盗链你某个图片之类 他储存时使用的是c的地址加密后的url b去访问c的
    由于远端地址(c和b ip不同)时间等不一样生成 加密后地址不一 效验失败
    如果c返回的网页 使用iframe 直接连接引用整个网站页面 请求是有b发出的 还是可以解析的吧

    不知道这样理解是否正确
    展开
    
    
  • 星极
    2019-11-07
    老师您好,我看到你改变时间戳后访问链接就失效了,那怎样才可以指定一个更长的失效时间呢,比如1分钟

    作者回复: 视频中我只演示了哈希不匹配导致的链接失效,虽然我改的是时间戳,但md5参数我没改,所以哈希后不匹配导致失败,返回403.
    那个时间戳表示的是绝对的过期时间,如果我把时间改为系统当前时间之前,md5也随之改动,那么md5虽然匹配上了,但参数中的时间戳小于当前时间,就会返回410.
    所以,想改变失效时间,应该在生成URL(主要是时间戳和md5)上做变更。

     1
    
  • 清须须
    2019-09-23
    我的疑问是,服务器生成的含有MD5值的安全链接怎么给到客户端,然后客户端再去调用呢?

    作者回复: A服务器负责给出安全链接,它通过API或者HTML等方式给到浏览器;浏览器访问安全链接要到B服务器,也就是本节介绍的Nginx

     1
    
  • 猫王者
    2019-08-19
    第二个例子中的prefix是干嘛用的,为什么要带上prefix,视频里也没用到prefix啊
    
    
  • Hector
    2019-08-17
    之前自己玩爬虫的时候,有的翻译网页必做做防盗链。他们是将秘钥直接放在js代码中,js好几万行各种乱七八糟的混淆代码掩盖秘钥,然后使用秘钥和时间戳再加其他参数混合再MD5加密访问后端服务器。本课中的场景相似,不过是有的会将这个加密过程放在另一个服务器,先拿正常的访问uri经过加密服务器返回给客户端浏览器一个加密处理过后的uri对吗?这样的意义在什么地方呢?我要是爬虫的话也可以去加密服务器获取加密uri

    作者回复: 第1次访问用来获取下载uri的页面,这样的页面通常是要做cookie鉴权的,爬虫不做登录通常获取不到下载uri

    
    
  • ~尘曦~
    2019-07-13
    老师问一下我测试的时候这么生成的字符串[root@python vhast]# echo -n '52656565776/test1.txt192.168.183.4 secret' | openssl md5 -binary | openssl base64 | tr +/ - | tr -d =
    edB-pK1jnmQKtBF354EfJA

    这么测试的时候报403错误;不知道哪里出问题了
    curl 'secure_link.com/test1.txt?md5=edB-pK1jnmQKtBF354EfJA&expires=52656565776'
    jhjkhjhj
    配置文件是这样的
    server {
        server_name secure_link.com;
        access_log logs/secure.log main;
        error_log logs/secure_error.log info;
        location /{
                secure_link $arg_md5,$arg_expires;
                secure_link_md5 "$secure_link_expires$uri$remote_addr secret";

                if ($secure_link = "") {
                 return 403 "jhjkhjhj\n";
                }

                if ($secure_link = "0") {
                    return 410;
                }

            return 200 '$arg_md5,$arg_expires\n';
        }
        location /p/ {
            secure_link_secret mysecret2;
            if ($secure_link = "") {
                return 401;
            }
            
        }
    }
    展开
    
    
  • Oops
    2019-05-20
    老师您好,在演示的两个示例中;第一个示例$secure_link 这个变量的值:可能为 空、0、1 这三种结果。而第二示例中$secure_link的值:非空 字符串(URI中link那一部分的值)或者 空字符串 ,我是否可以这样理解?

    作者回复: 是的,这是两种不同的模式,详见http://nginx.org/en/docs/http/ngx_http_secure_link_module.html

    
    
  • Hana
    2019-04-05
    老师,不明白的是,seculre_link 命令 后面带的请求参数,它是怎么判断是否与原始哈希匹配与否的,http模块就没有存储相关的变量啊。

    作者回复: 因为nginx拥有原始hash,也有生成原始哈希所需要的值(在url中),包括配置文件中的密钥。所以再次生成哈希并比较即可

    
    
  • 哈神
    2019-03-21
    老师,域名abc.com的默认地址跳转到abc.com/test
    
    
  • leitiannet
    2019-02-10
    使用secure_link_module实现防盗链时,有两点疑问:
    (1)Nginx每次都需要获取当前时间与expires进行比较判断是否过期?
    (2)链接由服务器生成,按理也应该由服务器进行校验,为什么放在Nginx进行校验,是否会影响Nginx性能?

    作者回复: 1、是的;
    2、影响非常小。

    
    
  • 阮军
    2019-01-31
    在视频的11:38的时候的那个rewrite我没有看明白,那个^匹配上家不会在往下走了对吧

    作者回复: 是的,直接内部跳转到location /secure/中了

    
    
  • kaiyuanheshang
    2019-01-03
    这个的原理是生成一个下载的 token,用户访问的时候 nginx 来验证这个 token 就可以了

    作者回复: 没错!

    
    
  • 风行传说
    2018-12-27
    老师,看完这个视频后,如何将secert_link应用到生产环境中,现在还是一头雾水,总不能每次的访问请求都用md5先只做好相关的信息再进行请求吧?

    作者回复: 是的,所以它依赖于下载页面,这个页面中的下载URL都是通过这个规则生成的。这个模块一定要配合应用服务一起工作的。

    
    
我们在线,来聊聊吧