详情页标题前

阿里云对象存储OSS配置Referer防盗链来阻止其他网站引用OSS文件-云淘科技

详情页1

为阻止其他网站引用您的OSS文件,引起不必要的流量费用增加,您可以在Referer白名单中仅添加您自己网站的域名,从而仅允许该域名的网站引用您的OSS文件。

前提条件

查看来自其他网站的OSS请求的Referer

警告

错误地配置Referer防盗链会导致您的网站无法正常引用您的OSS文件,或者用户无法在浏览器中直接访问您的OSS文件。在配置之前,您需要在测试的Bucket上验证Referer防盗链配置是否生效,然后再在实际使用的Bucket上配置。

使用OSS控制台

例如,仅允许域名为www.aliyun.com的网站引用您的OSS文件,并且允许用户在浏览器中直接输入URL访问您的OSS文件。具体步骤如下:

  1. 登录OSS管理控制台。

  2. 单击Bucket 列表,然后单击目标Bucket名称。

  3. 在左侧导航栏,选择数据安全>防盗链

  4. 防盗链页面,打开防盗链开关。

    • 白名单 Referer,输入以下内容。

      通过控制台设置多个Referer时使用回车作为换行符分隔。

      https://www.aliyun.com
      http://www.aliyun.com

      关于Referer的配置规范,请参见Referer配置规范。

    • 黑名单 Referer,保持为空。

      重要

      黑白名单同时存在时,OSS会先判断黑名单,再判断白名单。具体判断流程,请参见防盗链的判断逻辑。

    • 空 Referer区域,选择允许。

      • 允许:表示允许请求中不带Referer或Referer为空。

      • 不允许:表示请求中必须携带Referer且Referer值不能为空。设置不允许空Referer后,无法在浏览器中直接输入URL访问OSS文件。

    • 截断 QueryString区域,选择允许。

      • 允许:OSS匹配该Referer时默认截断QueryString。例如Referer设置为http://www.example.com/?action=nop,OSS匹配该Referer时默认截断QueryString,即使用http://www.example.com/进行匹配。

      • 不允许:OSS匹配该Referer时不截断QueryString。例如Referer设置为http://www.example.com/?action=nop,OSS会使用http://www.example.com/?action=nop进行匹配。关于QueryString的解析规则,请参见QueryString解析规则。

  5. 单击保存

使用阿里云SDK

例如,仅允许域名为www.aliyun.com的网站引用您的OSS文件,并且允许用户在浏览器中直接输入URL访问您的OSS文件。配置示例如下:

import com.aliyun.oss.ClientException;
import com.aliyun.oss.OSS;
import com.aliyun.oss.common.auth.*;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.OSSException;
import com.aliyun.oss.model.BucketReferer;
import java.util.ArrayList;
import java.util.List;

public class Demo {

    public static void main(String[] args) throws Exception {
        // Endpoint以华东1(杭州)为例,其它Region请按实际情况填写。
        String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
        // 从环境变量中获取访问凭证。运行本代码示例之前,请确保已设置环境变量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
        EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();
        // 填写Bucket名称,例如examplebucket。
        String bucketName = "examplebucket";

        // 创建OSSClient实例。
        OSS ossClient = new OSSClientBuilder().build(endpoint, credentialsProvider);

        try {
            List refererList = new ArrayList();
            // 添加Referer白名单。Referer参数支持通配符星号(*)和问号(?)。
            refererList.add("http://www.aliyun.com");
            refererList.add("https://www.aliyun.com");
            // refererList.add("http://www.help.aliyun.com");
            // refererList.add("http://www.?.aliyuncs.com");
            // 设置存储空间Referer列表。设为true表示Referer字段允许为空,设为false表示Referer字段不允许为空。
            BucketReferer br = new BucketReferer(true, refererList);
            ossClient.setBucketReferer(bucketName, br);
        } catch (OSSException oe) {
            System.out.println("Caught an OSSException, which means your request made it to OSS, "
                    + "but was rejected with an error response for some reason.");
            System.out.println("Error Message:" + oe.getErrorMessage());
            System.out.println("Error Code:" + oe.getErrorCode());
            System.out.println("Request ID:" + oe.getRequestId());
            System.out.println("Host ID:" + oe.getHostId());
        } catch (ClientException ce) {
            System.out.println("Caught an ClientException, which means the client encountered "
                    + "a serious internal problem while trying to communicate with OSS, "
                    + "such as not being able to access the network.");
            System.out.println("Error Message:" + ce.getMessage());
        } finally {
            if (ossClient != null) {
                ossClient.shutdown();
            }
        }
    }
}

setAllowEmptyReferer(true);
// 添加Referer白名单。Referer参数支持通配符星号(*)和问号(?)。
$refererConfig->addReferer("http://wwww.aliyun.com");
$refererConfig->addReferer("https://wwww.aliyun.com");
// $refererConfig->addReferer("http://wwww.help.aliyun.com");
// $refererConfig->addReferer("http://www.?.aliyuncs.com");
try{
    $ossClient = new OssClient($accessKeyId, $accessKeySecret, $endpoint);

    $ossClient->putBucketReferer($bucket, $refererConfig);
} catch(OssException $e) {
    printf(__FUNCTION__ . ": FAILED
");
    printf($e->getMessage() . "
");
    return;
}
print(__FUNCTION__ . ": OK" . "
");

const OSS = require('ali-oss')

const client = new OSS({
  // yourregion填写Bucket所在地域。以华东1(杭州)为例,Region填写为oss-cn-hangzhou。
  region: 'yourregion',
  // 从环境变量中获取访问凭证。运行本代码示例之前,请确保已设置环境变量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
  accessKeyId: process.env.OSS_ACCESS_KEY_ID,
  accessKeySecret: process.env.OSS_ACCESS_KEY_SECRET,
  // 填写存储空间名称。
  bucket: 'examplebucket'
});

async function putBucketReferer () {
  try {
  const result = await client.putBucketReferer(bucket, true, [
  'http://www.aliyun.com',
  'https://www.aliyun.com'
  ]);
  console.log(result);
  } catch (e) {
    console.log(e);
  }
 }

putBucketReferer();

# -*- coding: utf-8 -*-
import oss2
from oss2.credentials import EnvironmentVariableCredentialsProvider
from oss2.models import BucketReferer

# 从环境变量中获取访问凭证。运行本代码示例之前,请确保已设置环境变量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
auth = oss2.ProviderAuth(EnvironmentVariableCredentialsProvider())
# 填写Bucket所在地域对应的Endpoint。以华东1(杭州)为例,Endpoint填写为https://oss-cn-hangzhou.aliyuncs.com。
# 填写存储空间名称。
bucket = oss2.Bucket(auth, 'https://oss-cn-hangzhou.aliyuncs.com', 'examplebucket')
# 设置允许空Referer。
allow_empty_referer = True 
# 设置白名单Referer。
referers = ['http://www.aliyun.com', 'https://www.aliyun.com']
# 设置黑名单Referer。
# black_referers = ['http://example.com', 'http://*.example.com']
# 设置截断QueryString。
allow_truncate_query_string = True
# 设置防盗链。
bucket.put_bucket_referer(BucketReferer(allow_empty_referer=allow_empty_referer, referers=referers, black_referers=black_referers,allow_truncate_query_string=allow_truncate_query_string))

using Aliyun.OSS;
using Aliyun.OSS.Common;
// yourEndpoint填写Bucket所在地域对应的Endpoint。以华东1(杭州)为例,Endpoint填写为https://oss-cn-hangzhou.aliyuncs.com。
var endpoint = "yourEndpoint";
// 从环境变量中获取访问凭证。运行本代码示例之前,请确保已设置环境变量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
var accessKeyId = Environment.GetEnvironmentVariable("OSS_ACCESS_KEY_ID");
var accessKeySecret = Environment.GetEnvironmentVariable("OSS_ACCESS_KEY_SECRET");
// 填写Bucket名称。
var bucketName = "examplebucket";
// 创建OSSClient实例。
var client = new OssClient(endpoint, accessKeyId, accessKeySecret);
try
{
    var refererList = new List();
    // 添加Referer白名单。Referer参数支持通配符星号(*)和问号(?)。
    refererList.Add("http://www.aliyun.com");
    refererList.Add("https://www.aliyun.com");
    // refererList.Add("http://www.help.aliyun.com");
    // refererList.Add("http://www.?.aliyuncs.com");
    var srq = new SetBucketRefererRequest(bucketName, refererList);
    // 设置防盗链。
    client.SetBucketReferer(srq);
    Console.WriteLine("Set bucket:{0} Referer succeeded ", bucketName);
}
catch (OssException ex)
{
    Console.WriteLine("Failed with error code: {0}; Error info: {1}. 
RequestID:{2}	HostID:{3}",
        ex.ErrorCode, ex.Message, ex.RequestId, ex.HostId);
}
catch (Exception ex)
{
    Console.WriteLine("Failed with error info: {0}", ex.Message);
}

PutBucketRefererRequest request = new PutBucketRefererRequest();
request.setBucketName("examplebucket");
// 添加Referer白名单。Referer参数支持通配符星号(*)和问号(?)。
ArrayList referers = new ArrayList();
referers.add("http://www.aliyun.com");
referers.add("https://www.aliyun.com");
// referers.add("http://www.help.aliyun.com");
// referers.add("http://www.?.aliyuncs.com");
request.setReferers(referers);

OSSAsyncTask task = oss.asyncPutBucketReferer(request, new OSSCompletedCallback() {
    @Override
    public void onSuccess(PutBucketRefererRequest request, PutBucketRefererResult result) {
        OSSLog.logInfo("code: " + result.getStatusCode());
    }
    @Override
    public void onFailure(PutBucketRefererRequest request, ClientException clientException, ServiceException serviceException) {
        OSSLog.logError("error: "+serviceException.getRawMessage());
    }
});
task.waitUntilFinished();

package main

import (
    "fmt"
    "github.com/aliyun/aliyun-oss-go-sdk/oss"
    "os"
)

func main() {
    // 填写Bucket名称。
    bucketName := "examplebucket"

    // 从环境变量中获取访问凭证。运行本代码示例之前,请确保已设置环境变量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
    provider, err := oss.NewEnvironmentVariableCredentialsProvider()
    if err != nil {
        fmt.Println("Error:", err)
        os.Exit(-1)
    }

    // 创建OSSClient实例。
    // yourEndpoint填写Bucket对应的Endpoint,以华东1(杭州)为例,填写为https://oss-cn-hangzhou.aliyuncs.com。其它Region请按实际情况填写。
    client, err := oss.New("yourEndpoint", "", "", oss.SetCredentialsProvider(&provider))
    if err != nil {
        fmt.Println("Error:", err)
        os.Exit(-1)
    }

    var setBucketReferer oss.RefererXML
    // 添加Referer白名单,且允许空Referer。Referer参数支持通配符星号(*)和问号(?)。
    setBucketReferer.RefererList = []string{
    "http://www.aliyun.com",
    "https://www.aliyun.com",
    // "https://www.help.aliyun.com",
    // "http://www.?.aliyuncs.com",
    }
    // 添加Referer黑名单。Go SDK 2.2.8及以上版本支持添加Referer黑名单。
    // setBucketReferer.RefererBlacklist = &oss.RefererBlacklist{
    []string{
    "http://www.refuse.com",
    "https://*.hack.com",
    "http://ban.*.com",
    "https://www.?.deny.com",
    },
    }
    setBucketReferer.AllowEmptyReferer = true
    boolFalse := false
    setBucketReferer.AllowTruncateQueryString = &boolFalse
    err = client.SetBucketRefererV2(bucketName,setBucketReferer)
    if err != nil {
    fmt.Println("Error:", err)
    os.Exit(-1)
    }

    fmt.Println("Set Bucket Referer Success")
}

#include 
using namespace AlibabaCloud::OSS;

int main(void)
{
    /* 初始化OSS账号信息。*/
    
    /* yourEndpoint填写Bucket所在地域对应的Endpoint。以华东1(杭州)为例,Endpoint填写为https://oss-cn-hangzhou.aliyuncs.com。*/
    std::string Endpoint = "yourEndpoint";
    /* 填写Bucket名称,例如examplebucket。*/
    std::string BucketName = "examplebucket";

    /* 初始化网络等资源。*/
    InitializeSdk();

    ClientConfiguration conf;
    /* 从环境变量中获取访问凭证。运行本代码示例之前,请确保已设置环境变量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。*/
    auto credentialsProvider = std::make_shared();
    OssClient client(Endpoint, credentialsProvider, conf);

    /* 设置防盗链。*/
    SetBucketRefererRequest request(BucketName);
    request.addReferer("http://www.aliyun.com");
    request.addReferer("https://www.aliyun.com");
    /* request.addReferer("https://help.aliyun.com");*/
    /* request.addReferer("http://www.?.aliyuncs.com");*/
    request.setAllowEmptyReferer(true);

    auto outcome = client.SetBucketReferer(request);

    if (!outcome.isSuccess()) {
        /* 异常处理。*/
        std::cout << "SetBucketReferer fail" <<
        ",code:" << outcome.error().Code() <<
        ",message:" << outcome.error().Message() <<
        ",requestId:" << outcome.error().RequestId() << std::endl;
        return -1;
    }

    /* 释放网络等资源。*/
    ShutdownSdk();
    return 0;
}

#include "oss_api.h"
#include "aos_http_io.h"
/* yourEndpoint填写Bucket所在地域对应的Endpoint。以华东1(杭州)为例,Endpoint填写为https://oss-cn-hangzhou.aliyuncs.com。*/
const char *endpoint = "yourEndpoint";
/* 填写Bucket名称,例如examplebucket。*/
const char *bucket_name = "examplebucket";
void init_options(oss_request_options_t *options)
{
    options->config = oss_config_create(options->pool);
    /* 用char*类型的字符串初始化aos_string_t类型。*/
    aos_str_set(&options->config->endpoint, endpoint);
    /* 从环境变量中获取访问凭证。运行本代码示例之前,请确保已设置环境变量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。*/
    aos_str_set(&options->config->access_key_id, getenv("OSS_ACCESS_KEY_ID"));
    aos_str_set(&options->config->access_key_secret, getenv("OSS_ACCESS_KEY_SECRET"));
    /* 是否使用了CNAME。0表示不使用。*/
    options->config->is_cname = 0;
    /* 设置网络相关参数,比如超时时间等。*/
    options->ctl = aos_http_controller_create(options->pool, 0);
}
int main(int argc, char *argv[])
{
    /* 在程序入口调用aos_http_io_initialize方法来初始化网络、内存等全局资源。*/
    if (aos_http_io_initialize(NULL, 0) != AOSE_OK) {
        exit(1);
    }
    /* 用于内存管理的内存池(pool),等价于apr_pool_t。其实现代码在apr库中。*/
    aos_pool_t *pool;
    /* 重新创建一个内存池,第二个参数是NULL,表示没有继承其它内存池。*/
    aos_pool_create(&pool, NULL);
    /* 创建并初始化options,该参数包括endpoint、access_key_id、acces_key_secret、is_cname、curl等全局配置信息。*/
    oss_request_options_t *oss_client_options;
    /* 在内存池中分配内存给options。*/
    oss_client_options = oss_request_options_create(pool);
    /* 初始化Client的选项oss_client_options。*/
    init_options(oss_client_options);
    /* 初始化参数。*/
    aos_string_t bucket;
    aos_table_t *resp_headers = NULL; 
    aos_status_t *resp_status = NULL;
    oss_referer_config_t referer_config;
    aos_str_set(&bucket, bucket_name);
    aos_list_init(&referer_config.referer_list);
    oss_create_and_add_refer(pool, &referer_config, "http://www.aliyun.com");
    oss_create_and_add_refer(pool, &referer_config, "https://www.aliyun.com");
    referer_config.allow_empty_referer = 1;
    /* 添加Referer白名单。Referer参数支持通配符星号(*)和问号(?)。*/
    resp_status = oss_put_bucket_referer(oss_client_options, &bucket, &referer_config, &resp_headers);
    if (aos_status_is_ok(resp_status)) {
        printf("put bucket referer succeeded
");
    } else {
        printf("put bucket referer failed
");      
    }
    /* 释放内存池,相当于释放了请求过程中各资源分配的内存。*/
    aos_pool_destroy(pool);
    /* 释放之前分配的全局资源。*/
    aos_http_io_deinitialize();
    return 0;
}

require 'aliyun/oss'

client = Aliyun::OSS::Client.new(
  # Endpoint以华东1(杭州)为例,其它Region请按实际情况填写。
  endpoint: 'https://oss-cn-hangzhou.aliyuncs.com',
  # 从环境变量中获取访问凭证。运行本代码示例之前,请确保已设置环境变量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
  access_key_id: ENV['OSS_ACCESS_KEY_ID'],
  access_key_secret: ENV['OSS_ACCESS_KEY_SECRET']
)
# 填写Bucket名称,例如examplebucket。
bucket = client.get_bucket('examplebucket')
# 设置存储空间Referer列表。
bucket.referer = Aliyun::OSS::BucketReferer.new(
  allow_empty: true, whitelist: ['http://www.aliyun.com', 'https:www.aliyun.com'])

通过SDK设置多个Referer时,使用半角逗号(,)分隔。

关于其他SDK的设置防盗链的代码示例,请参见SDK简介。

使用命令行工具ossutil

例如,仅允许域名为www.aliyun.com的网站引用您的OSS文件,并且允许用户在浏览器中直接输入URL访问您的OSS文件。配置示例如下:

./ossutil64 referer --method put oss://examplebucket http://www.aliyun.com https://www.aliyun.com

通过ossutil设置多个Referer时,使用空格分隔。

关于使用ossutil设置防盗链的具体操作, 请参见添加或修改防盗链配置。

使用REST API

通过REST API设置多个Referer时,使用半角逗号(,)分隔。

如果您的程序自定义要求较高,您可以直接发起REST API请求。直接发起REST API请求需要手动编写代码计算签名。更多信息,请参见PutBucketReferer。

Referer配置规范

在配置白名单Referer或黑名单Referer时,您需要遵循以下规范:

规范

说明

匹配Referer时,不忽略URL的Scheme

配置为http://www.aliyun.com,可匹配http://www.aliyun.com/123http://www.aliyun.com.cn等以http://www.aliyun.com为前缀的地址,但不能匹配https://www.aliyun.com/123https://www.aliyun.com.cnwww.aliyun.com

Referer支持通配符星号(*)表示使用星号代替0个或多个字符

  • 配置为*,可匹配所有域名和IP地址。

  • 配置为*www.example.com,可匹配http://www.example.comhttps://www.example.comwww.example.com

  • 配置为*.example.com,可匹配http://help.example.comhttps://help.example.comhttp://www.example.comhttps://www.example.com

Referer支持通配符问号(?)表示使用问号代替一个字符

配置为http://www.aliyun?.com,可匹配http://www.aliyunc.com

Referer支持带端口的域名或IP地址

配置为http://www.example.com:808010.10.10.10:8080

QueryString解析规则

如果您设置不允许截断QueryString,OSS将按照以下规则解析QueryString:

规则

说明

不解码QueryString

在请求URL为http://www.example.com/?job_id=task$01时,如果白名单Referer或者黑名单Referer设置为http://www.example.com/?job_id=task%2401,则判断结果为请求URL不匹配白名单Referer或者黑名单Referer。

忽略QueryString中的参数大小写

在请求URL为http://www.examplecom/?ACTION=NOP时,如果白名单Referer或者黑名单Referer设置为http://www.example.com/?action=nop,则判断结果为请求URL匹配白名单Referer或者黑名单Referer。

不解析QueryString中的参数

在请求URL为http://example.com/?b=c&a=b时,如果白名单Referer或者黑名单Referer设置为http://example.com/?a=b&b=c,则判断结果为请求URL不匹配白名单Referer或者黑名单Referer。

后续步骤

验证Referer防盗链是否生效

相关文档

防盗链常见示例

内容没看懂? 不太想学习?想快速解决? 有偿解决: 联系专家

阿里云企业补贴进行中: 马上申请

腾讯云限时活动1折起,即将结束: 马上收藏

同尘科技为腾讯云授权服务中心。

购买腾讯云产品享受折上折,更有现金返利:同意关联,立享优惠

转转请注明出处:https://www.yunxiaoer.com/157210.html

(0)
上一篇 2023年12月10日 上午12:52
下一篇 2023年12月10日
详情页2

相关推荐

  • 阿里云对象存储OSSAndroid防盗链-云淘科技

    注意事项 本文以华东1(杭州)外网Endpoint为例。如果您希望通过与OSS同地域的其他阿里云产品访问OSS,请使用内网Endpoint。关于OSS支持的Region与Endpoint的对应关系,请参见访问域名和数据中心。 本文以从环境变量读取访问凭证为例。如何配置访问凭证,请参见Java配置访问凭证。 本文以OSS域名新建OSSClient为例。如果您希…

    阿里云对象存储 2023年12月10日
  • 阿里云对象存储OSS0003-00000502-云淘科技

    问题描述 请求被防盗链策略(Referer Bucket)拒绝。 问题原因 您发起的请求请求头中Referer字段的值在Bucket Referer黑名单中。 问题示例 比如您访问的Bucket的Referer配置如下: false http://*.aliyuncs.com http://abc.aliyuncs.com </RefererConfi…

    阿里云对象存储 2023年12月10日
  • 信息流广告,信息流部分建议宽度830px,只针对默认列表样式,顺序随机
  • 阿里云对象存储OSS防盗链常见示例-云淘科技

    通过使用OSS防盗链功能,您可以限制只有特定域名的网页能够在其网页中嵌入OSS文件,从而防止OSS文件被盗用,避免带宽资源的浪费。本文介绍Referer防盗链的常见示例。 只允许自己的域名的网页引用OSS文件,不允许别人的域名的网页引用OSS文件 为了只允许您自己的域名www.example.com的网页引用OSS文件,您需要在白名单Referer中只添加您…

    2023年12月10日
  • 阿里云对象存储OSS查看来自其他网站的OSS请求的Referer-云淘科技

    为避免其他网站引用您的OSS文件引起不必要的流量费用增加,您可以通过查看OSS日志或使用浏览器开发者工具来获取对应网站发起的OSS请求的Referer字段,以用于之后配置Referer防盗链,来阻止其他网站引用您的OSS文件。 在OSS日志中查看OSS请求的Referer 您可以通过OSS的实时日志查询功能来查看请求的Referer。 登录OSS管理控制台。…

    2023年12月10日
  • 阿里云对象存储OSS降低因恶意访问流量导致大额资金损失的风险-云淘科技

    当您的存储空间(Bucket)被恶意攻击、流量被恶意盗刷时,会出现高带宽或者大流量突发的情况,进而产生高于日常消费金额的账单。如果您希望降低因类似情况带来的大额资金损失的风险,请参考本文提供的多种安全最佳实践。 重要 以下最佳实践遵循一般准则,并不等同完整的安全解决方案。这些最佳实践可能不适合您的环境或不满足您的环境要求,仅建议将其视为参考因素。请您在日常使…

    阿里云对象存储 2023年12月10日

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信
本站为广大会员提供阿里云、腾讯云、华为云、百度云等一线大厂的购买,续费优惠,保证底价,买贵退差。