• nginx安全:配置网站图片防盗链


    一,为什么要做防盗链?

    1,什么是盗链?

        比如某人有一个A网站,

        他不愿自己存储图片,(因为磁盘和带宽都有成本)

        就在自己A网站的页面上直接插入B网站的图片,

        从而为自己吸引流量,这就是盗链

    2,为什么需要防盗链?

    盗链静态文件会浪费网站的带宽及服务器的计算能力

    这些都是网站运行的成本,

    而且会影响网站合法用户的正常访问体验

    所以我们要禁止盗链网站的图片和视频等静态文件

    3,防盗链的原理:

        根据请求头中referer属性得到网页来源,从而实现访问控制。

        禁止非法使用本站的图片。

    说明:刘宏缔的架构森林是一个专注架构的博客,地址:https://www.cnblogs.com/architectforest

             对应的源码可以访问这里获取: https://github.com/liuhongdi/

    说明:作者:刘宏缔 邮箱: 371125307@qq.com

    二,防盗链的例子

    1,盗链的效果

    假设盗链的网站是:www.lhdtest.com,被盗链的图片来自file.laoliu.net

    它的index.html页面内容:

    <html>
    <head>
    <title>
    invalid images
    </title>
    </head>
    <body>
    welcome to www.lhdtest.com<br/>
    <img src="http://file.laoliu.net/image/mid/1/348_8d72a999aa1d5800.gif" style="260px;" />
    </body>
    </html>

    效果图:

    2,防盗链的配置

    我们在file.laoliu.net的虚拟主机上添加配置:

        location ~ .(gif|jpg|jpeg|png|bmp|ico)$ {
               valid_referers none blocked *.laoliu.net;
               if ($invalid_referer){
                   return 403;
               }
               expires 30d;
        }

    各项指令的说明:

    valid_referers: 用来定义合法访问的一个白名单

    none:            通过浏览器直接打开图片的url,这种情况没有referer,

                        通常我们允许这种访问

    blocked:        referer不为空,但它的内容被防火墙或者代理服务器删除掉了

                       这种访问也可以允许

    *.laoliu.net:   这个是被允许的域名,可以使用通配符

    $invalid_referer:    是一个变量,用来判断valid_referers的结果是否非法

    return 403:          返回403,403是HTTP 403 Forbidden的状态码,表示禁止访问

    重启nginx生效后我们查看效果

    说明:*.laoliu.net 这个域下面的页面仍然可以正常访问这些图片,

    在浏览器地址栏直接输入地址也可以访问

    3,遇到盗链时也可以跳转到一个提示当前被盗链的图片

    例:

        location ~ .(gif|jpg|jpeg|png|bmp|ico)$ {
               valid_referers none blocked *.laoliu.net;
               if ($invalid_referer){
                   rewrite ^/  http://img4.sycdn.imooc.com/5eaa360d00017ef904930247.jpg;
               }
               expires 30d;
        }

    查看效果:

     

    三,仅判断referer并不可靠

    因为referer是可以伪造的,所以这里的防盗链还不是百分百的安全,

    更严格的需求可以用nginx的第三方模块http_accesskey_module模块或lua脚本实现

    四,查看nginx的版本

    [root@centos8 conf.d]# /usr/local/soft/nginx-1.18.0/sbin/nginx -v
    nginx version: nginx/1.18.0
  • 相关阅读:
    jQuery插件主要有两种扩展方式
    系统负载测试工具-LoadRunner
    安全扫描工具-AppScan
    newinstance()和new有什么区别?(转)
    类的加载、连接和初始化 (转)
    tar 基础
    了解【重放攻击】
    DDLDMLDCLDQL
    web.xml的配置问题
    组合与聚合
  • 原文地址:https://www.cnblogs.com/architectforest/p/12859539.html
Copyright © 2020-2023  润新知