他のWebサイトがObject storage Service (OSS) 内のオブジェクトにリンクするときに発生する予期しないストレージコストを防ぐために、指定したドメイン名をリファラーホワイトリストに含めて、これらのドメイン名からのリンクのみを許可します。
前提条件
権限なしでオブジェクトにリンクするリファラーを取得しました。 詳細については、「他のWebサイトからのOSSリソースリクエストのリファラーの確認」をご参照ください。
リファラーの設定ミスは、WebサイトがOSSオブジェクトにリンクするのをブロックしたり、ユーザーがブラウザーから直接OSSオブジェクトにアクセスできなくなったりする可能性があります。 Referer設定をテスト環境のバケットに適用し、Referer設定をテストしてから、運用環境のバケットに適用することをお勧めします。
手順
OSSコンソールの使用
たとえば、www.aliyun.com
のみがバケット内のオブジェクトにリンクできるようにし、ユーザーがブラウザでオブジェクトURLを使用してバケット内のオブジェクトを要求できるようにするには、次の手順を実行します。
OSSコンソールにログインします。
左側のナビゲーションウィンドウで、バケットリスト をクリックします。 [バケット] ページで、目的のバケットを見つけてクリックします。
左側のナビゲーションツリーで、[コンテンツセキュリティ] > アンチホットリンク を選択します。
アンチホットリンク ページで、アンチホットリンク をオンにします。
[リファラーホワイトリスト] フィールドに、次の内容を入力します。
OSSコンソールで複数のリファラーを指定する場合は、改行で区切ります。
https://www.aliyun.com http://www.aliyun.com
リファラー設定の詳細については、「リファラー設定」をご参照ください。
リファラーブラックリストフィールドは空のままにします。
重要リファラーホワイトリストとブラックリストの両方が存在する場合、OSSはリファラーリクエストヘッダーを最初にブラックリストに対して、次にホワイトリストに対してチェックします。 詳細については、「プロセス」をご参照ください。
[空のリファラーを許可] で、[はい] を選択します。
許可する: 空のRefererヘッダーを持つリクエスト、またはRefererヘッダーを含まないリクエストを許可します。
No: 空のRefererヘッダーを持つリクエスト、またはRefererヘッダーを含まないリクエストを拒否します。 [空のリファラーを許可] で [いいえ] を選択した場合、ブラウザのアドレスバーにオブジェクトURLを入力しても、バケット内のオブジェクトにアクセスできません。
切り捨て QueryString を許可 で、[はい] を選択します。
許可する: リファラーのクエリ文字列が削除されます。 たとえば、リファラーが
http://www.example.com/?action=nop
に設定されている場合、クエリ文字列は削除され、http://www.example.com/
がリファラーと一致するために使用されます。No: リファラーのクエリ文字列は削除されません。 たとえば、リファラーが
http://www.example.com/?action=nop
に設定されている場合、http://www.example.com/?action=nop
はリファラーと一致するために使用されます。 クエリ文字列解析の詳細については、「クエリ文字列解析ルール」をご参照ください。
[保存] をクリックします。
OSS SDKの使用
たとえば、www.alibabacloud.com
のみがバケット内のオブジェクトにリンクできるようにし、ユーザーがブラウザでオブジェクトURLを使用してバケット内のオブジェクトを要求できるようにします。 次のサンプルコードは、OSS SDKを使用してこの目的でホットリンク保護を設定する方法の例を示しています。
com.aliyun.oss.ClientExceptionをインポートします。com.aliyun.oss.OSSをインポートします。impor t com.aliyun.oss.com mon.auth.*;
com.aliyun.oss.OSSClientBuilderをインポートします。com.aliyun.oss.OSSExceptionをインポートします。com.aliyun.oss.mo del.BucketRefererをインポートします。java.util.ArrayListをインポートします。java.util.Listをインポートします。public classデモ {
public static void main(String[] args) throws Exception {
// この例では、中国 (杭州) リージョンのエンドポイントが使用されます。 実際のエンドポイントを指定します。
String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
// 環境変数からアクセス資格情報を取得します。 サンプルコードを実行する前に、OSS_ACCESS_KEY_IDおよびOSS_ACCESS_KEY_SECRET環境変数が設定されていることを確認してください。
EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();
// ソースバケットの名前を指定します。 例: examplebucket.
String bucketName = "examplebucket";
// Create an OSSClient instance.
OSS ossClient = new OSSClientBuilder().build(endpoint, credentialsProvider);
try {
List<String> refererList = new ArrayList<String>();
// リファラーホワイトリストにリファラーを追加します。 リファラーでは、アスタリスク (*) と疑問符 (?) をワイルドカードとして使用できます。
refererList.add("http://www.aliyun.com");
refererList.add("https://www.aliyun.com");
// refererList.add("http://www.help.alibabacloud.com");
// refererList.add("http:// www.?.aliyuncs.com");
// バケットのリファラーホワイトリストを設定します。 trueを指定すると、空のRefererフィールドを持つリクエストが許可されます。 falseを指定すると、空のRefererフィールドを持つリクエストは許可されません。
BucketReferer br = new BucketReferer(true, refererList);
ossClient.setBucketReferer(bucketName, br);
} catch (Exception e) {
System.out.println("Caught an OSSException, which means your request made it to OSS, "
+ "しかし、何らかの理由でエラー応答で拒否されました。");
System.out.println("エラーメッセージ:" + oe.getErrorMessage());
System.out.println("エラーコード:" + oe.getErrorCode());
System.out.println("リクエストID:" + oe.getRequestId());
System.out.println("ホストID:" + oe.getHostId());
} catch (ClientException e) {
System.out.println("Caught an ClientException, which means the client encountered "
+ "a serious internal problem while trying to communicate with OSS, "
+ 「ネットワークにアクセスできないなど」;
System.out.println("エラーメッセージ:" + ce.getMessage());
} 最後に{
if (ossClient != null) {
ossClient.shutdown();
}
}
}
}
<?php
if (is_file(__DIR__) 。 '/../autoload.php')) {
require_once __DIR__ . '/../autoload.php';
}
if (is_file(__DIR__) 。 '/../vendor/autoload.php')) {
require_once __DIR__ . '/../vendor/autoload.php';
}
OSS\OssClientを使用します。OSS\Core\OssExceptionを使用します。OSS\Model\RefererConfigを使用します。// 環境変数からアクセス資格情報を取得します。 サンプルコードを実行する前に、OSS_ACCESS_KEY_IDおよびOSS_ACCESS_KEY_SECRET環境変数が設定されていることを確認してください。
$accessKeyId = getenv("OSS_ACCESS_KEY_ID");
$accessKeySecret = getenv("OSS_ACCESS_KEY_SECRET");
// この例では、中国 (杭州) リージョンのエンドポイントが使用されます。 実際のエンドポイントを指定します。
$end point = "http://oss-cn-hangzhou.aliyuncs.com";
$bucket= "examplebucket";
$refererConfig = new RefererConfig();
// 空のリファラーを許可します。
$refererConfig->setAllowEmptyReferer(true);
// リファラーホワイトリストを指定します。 リファラーでは、アスタリスク (*) と疑問符 (?) をワイルドカードとして使用できます。
$refererConfig->addReferer("http://wwww.aliyun.com");
$refererConfig->addReferer("https://wwww.aliyun.com");
// $refererConfig->addReferer("http://wwww.help.alibabacloud.com");
// $refererConfig->addReferer("http:// www.?.aliyuncs.com");
try {
$ossClient = new OssClient($accessKeyId, $accessKeySecret, $endpoint);
$ossClient->putBucketReferer($bucket、$refererConfig);
} catch(OssException $e) {
printf(__FUNCTION__ . ": FAILED\n");
printf($e->getMessage()) 。 "\n");
戻ります。}
print(__FUNCTION__) 。 ": OK" 。 "\n");
const OSS = require('ali-OSS ')
const client = new OSS({
// バケットが配置されているリージョンを指定します。 たとえば、バケットが中国 (杭州) リージョンにある場合、リージョンを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関数putBucketReferer () {
try {
const result = await client.putBucketReferer(bucket, true, [
'http:// www.aliyun.com '、
'https:// www.aliyun.com'
]);
console.log (結果);
} catch (e) {
console.log(e);
}
}
putBucketReferer();
# -*-コーディング: utf-8 -*-
oss2のインポート
oss2.credentialsからEnvironmentVariableCredentialsProviderをインポート
oss2.modelsからBucketRefererをインポート
# 環境変数からアクセス資格情報を取得します。 コードを実行する前に、OSS_ACCESS_KEY_IDおよびOSS_ACCESS_KEY_SECRET環境変数が設定されていることを確認してください。
auth = oss2.ProviderAuth(EnvironmentVariableCredentialsProvider())
# バケットが配置されているリージョンのエンドポイントを指定します。 たとえば、バケットが中国 (杭州) リージョンにある場合、エンドポイントをhttps://oss-cn-hangzhou.aliyuncs.comに設定します。
// Specify the bucket name.
bucket = oss2.Bucket(auth, 'https:// oss-cn-hangzhou.aliyuncs.com ', 'examplebucket')
# 空のリファラーフィールドを許可するように指定します。
allow_empty_referer = True
# リファラーホワイトリストを指定します。
リファラー= ['http:// www.aliyun.com ', 'https:// www.aliyun.com']
# リファラーブラックリストを指定します。
# black_referers = ['http:// example.com ', 'http:// * .example.com']
# クエリ文字列を切り捨てることができることを指定します。
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))
Aliyun.OSS;
Aliyun.OSS.Common; を使用
// バケットが配置されているリージョンのエンドポイントを指定します。 たとえば、バケットが中国 (杭州) リージョンにある場合、エンドポイントを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");
// バケットの名前を指定します。
var bucketName = "examplebucket";
// OSSClientインスタンスを作成します。
var client = new OssClient (エンドポイント、accessKeyId、accessKeySecret);
トライ
{
var refererList = new List<string>();
// リファラーホワイトリストを追加します。 リファラーでは、アスタリスク (*) と疑問符 (?) をワイルドカード文字として使用できます。
refererList追加 ("http://www.aliyun.com");
refererList追加 ("https://www.aliyun.com");
// refererList. 追加 ("http://www.help.alibabacloud.com");
// refererList.Add("http:// www.?.aliyuncs.com");
var srq = new SetBucketRefererRequest(bucketName, refererList);
// ホットリンク保護を設定します。
client.SetBucketReferer(srq);
Console.WriteLine("Set bucket:{0} Referer successed", bucketName);
}
キャッチ (OssException ex)
{
Console.WriteLine("Failed with error code: {0}; エラー情報: {1} 。 \nRequestID:{2}\tHostID:{3}"、
ex.ErrorCode, ex.Message, ex.RequestId, ex.HostId);
}
キャッチ (例外ex)
{
Console.WriteLine("Failed with error info: {0}" 、メッセージなど);
}
PutBucketRefererRequest request = new PutBucketRefererRequest();
request.setBucketName("examplebucket");
// リファラーホワイトリストを指定します。 リファラーでは、アスタリスク (*) と疑問符 (?) をワイルドカード文字として使用できます。
ArrayList<String> リファラー=new ArrayList<String>();
referers.add("http://www.aliyun.com");
referers.add("https://www.aliyun.com");
// リファラー. add("http://www.help.alibabacloud.com");
// referers.add("http:// www.?.aliyuncs.com");
request.setReferers (リファラー);
OSSAsyncTask task = oss.asyncPutBucketReferer(request, new OSSCompletedCallback<PutBucketRefererRequest, PutBucketRefererResult>() {
@オーバーライド
public void onSuccess(PutBucketRefererRequestリクエスト, PutBucketRefererResult結果) {
OSSLog.logInfo("code: " + result.getStatusCode());
}
@オーバーライド
public void onFailure(PutBucketRefererRequestリクエスト, ClientException clientException, ServiceException serviceException) {
OSSLog.logError("error: " + serviceException.getRawMessage());
}
});
task.waitUntilFinished();
パッケージメイン
import (import (import)
"fmt"
"github.com/aliyun/aliyun-oss-go-sdk/oss"
"os"
)
func main() {
// バケットの名前を指定します。
bucketName := "examplebucket"
// 環境変数からアクセス資格情報を取得します。 サンプルコードを実行する前に、OSS_ACCESS_KEY_IDおよびOSS_ACCESS_KEY_SECRET環境変数が設定されていることを確認してください。
provider, err := oss.NewEnvironmentVariableCredentialsProvider()
if err! =nil {
fmt.Println("Error:", err)
os.Exit(-1)
}
// Create an OSSClient instance.
// バケットが配置されているリージョンのエンドポイントを指定します。 たとえば、バケットが中国 (杭州) リージョンにある場合、エンドポイントをhttps://oss-cn-hangzhou.aliyuncs.comに設定します。 実際のエンドポイントを指定します。
client, err := oss.New("yourEndpoint", ", " ", ", oss.SetCredentialsProvider(&provider))
if err! =nil {
fmt.Println("Error:", err)
os.Exit(-1)
}
var setBucketReferer oss.RefererXML
// リファラーホワイトリストにリファラーを追加し、空のリファラーフィールドを許可しないように指定します。 アスタリスク (*) または疑問符 (?) をワイルドカードとして使用して、Refererパラメーターを設定できます。
setBucketReferer.RefererList = []string {
"http://www.aliyun.com" 、
"https://www.aliyun.com" 、
// "https://www.help.alibabacloud.com" 、
// "http:// www.?.aliyuncs.com" 、
}
// リファラーブラックリストを追加します。 OSS SDK for Go V2.2.8以降は、リファラーブラックリスト設定をサポートしています。
// 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 (「バケットリファラー成功の設定」)
}
#include <alibabacloud/oss/OssClient.h>
名前空間listaCloud::OSSを使用します。int main(void)
{
/* OSSへのアクセスに使用されるアカウントに関する情報を初期化します。 */
/* バケットが配置されているリージョンのエンドポイントを指定します。 たとえば、バケットが中国 (杭州) リージョンにある場合、エンドポイントをhttps://oss-cn-hangzhou.aliyuncs.comに設定します。 */
std::string Endpoint = "yourEndpoint";
/* バケットの名前を指定します。 例: examplebucket. */
std::string BucketName = "examplebucket";
/* ネットワークリソースなどのリソースを初期化します。 */
InitializeSdk();
ClientConfiguration conf;
/* 環境変数からアクセス資格情報を取得します。 サンプルコードを実行する前に、OSS_ACCESS_KEY_IDおよびOSS_ACCESS_KEY_SECRET環境変数が設定されていることを確認してください。 */
auto credentialsProvider = std::make_shared<EnvironmentVariableCredentialsProvider>();
OssClientクライアント (Endpoint, credentialsProvider, conf);
/* ホットリンク保護を設定します。 */
SetBucketRefererRequestリクエスト (BucketName);
request.addReferer("http://www.aliyun.com");
request.addReferer("https://www.aliyun.com");
/* request.addReferer("https://help.alibabacloud.com");* /
/* request.addReferer("http:// www.?.aliyuncs.com");* /
request.setAllowEmptyReferer(true);
auto outcome = client.SetBucketReferer (リクエスト);
if (!outcome.isSuccess()) {
/* 例外を処理します。 */
std::cout << "SetBucketReferer fail" <<
",code:" << outcome.error().Code() <<
",message:" << outcome.error().Message() <<
",requestId:" << outcome.error().RequestId() << std::endl;
return -1;
}
/* ネットワークリソースなどのリソースを解放します。 */
ShutdownSdk();
0を返します。}
#include "oss_api.h"
# 「aos_http_io.h」を含める
/* バケットが配置されているリージョンのエンドポイントを指定します。 たとえば、バケットが中国 (杭州) リージョンにある場合、エンドポイントをhttps://oss-cn-hangzhou.aliyuncs.comに設定します。 * /
const char * endpoint = "yourEndpoint";
/* バケットの名前を指定します。 例: examplebucket. * /
const char * bucket_name = "examplebucket";
void init_options(oss_request_options_t * オプション)
{
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は、CNAMEが使用されないことを示す。 */
options->config->is_cname = 0;
/* タイムアウト期間などのネットワークパラメーターを設定します。 */
options->ctl = aos_http_controller_create(options->pool, 0);
}
int main(int argc, char * argv[])
{
/* main() でaos_http_io_initializeメソッドを呼び出して、ネットワークリソースやメモリリソースなどのグローバルリソースを初期化します。 */
if (aos_http_io_initialize(NULL, 0))! =AOSE_OK) {
exit(1);
}
/* メモリを管理するためのメモリプールを作成します。 aos_pool_tはapr_pool_tと同じです。 メモリプールの作成に使用されるコードは、APRライブラリに含まれています。 */
aos_pool_t *pool;
/* メモリプールを作成します。 2番目のパラメーターの値はNULLです。 この値は、プールが他のメモリプールを継承しないことを指定します。 */
aos_pool_create(&pool, NULL);
/* Create and initialize options. このパラメーターには、エンドポイント、access_key_id、access_key_secret、is_cname、curlなどのグローバル構成情報を指定します。 */
oss_request_options_t *oss_client_options;
/* メモリプール内のメモリリソースをオプションに割り当てます。 */
oss_client_options = oss_request_options_create(pool);
/* 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;
/* リファラーホワイトリストにリファラーを追加します。 リファラーでは、アスタリスク (*) と疑問符 (?) をワイルドカード文字として使用できます。 */
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\n");
} else {
printf("put bucket referer failed\n");
}
/* メモリプールを解放して、リクエストに割り当てられたメモリリソースを解放します。 */
aos_pool_destroy(pool);
/* 割り当てられたグローバルリソースを解放します。 */
aos_http_io_deinitialize();
0を返します。}
'aliyun/oss' が必要です
client = Aliyun::OSS::Client.new (
# この例では、中国 (杭州) リージョンのエンドポイントが使用されます。 実際のエンドポイントを指定します。
エンドポイント: '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 ']
)
# バケットの名前を指定します。 例: examplebucket.
bucket = client.get_bucket('examplebucket')
# バケットのリファラーホワイトリストを設定します。
bucket.referer = Aliyun::OSS::BucketReferer.new (
allow_empty: true, whitelist: ['http:// www.aliyun.com ', 'https:www.aliyun.com'])
OSS SDKを使用して複数のリファラーを指定する場合は、コンマ (,) で区切ります。
他のプログラミング言語のOSS SDKを使用してバケットのホットリンク保護を設定する方法の詳細については、「概要」をご参照ください。
ossutilの使用
たとえば、www.aliyun.com
のみがバケット内のオブジェクトにリンクできるようにし、ユーザーがブラウザでオブジェクトURLを使用してバケット内のオブジェクトを要求できるようにします。 サンプルコマンド:
. /ossutil64リファラー -- メソッドput oss:// examplebucket http://www.aliyun.com https://www.aliyun.com
ossutilを使用して複数のリファラーを設定する場合は、それらをスペースで区切ります。
ossutilを使用してバケットのホットリンク保護を設定する方法の詳細については、「バケットのホットリンク保護設定の追加または変更」をご参照ください。
OSS APIの使用
RESTful APIを呼び出して複数のリファラーを指定する場合は、コンマ (,) で区切ります。
ビジネスで高度なカスタマイズが必要な場合は、RESTful APIを直接呼び出すことができます。 APIを直接呼び出すには、コードに署名計算を含める必要があります。 詳細については、「PutBucketReferer」をご参照ください。
リファラーの設定
リファラーホワイトリストまたはブラックリストを設定するときは、次の項目に注意してください。
項目 | 説明 |
URLのスキーム部分は無視されません。 | たとえば、 |
アスタリスク (*) をRefererレコードで使用すると、0文字以上を表すことができます。 |
|
疑問符 (?) は、リファラーレコードで文字を表すために使用できます。 | Referer設定に |
リファラー設定は、ドメイン名とポート番号付きのIPアドレスをサポートします。 | たとえば、Referer設定に次のレコードを含めることができます: |
クエリ文字列解析ルール
クエリ文字列の切り捨てを無効にすると、OSSは次のルールに基づいてリクエスト内のクエリ文字列を処理します。
ルール | 説明 |
クエリ文字列はデコードされません。 | リクエストURLが |
クエリ文字列に含まれるフィールドは大文字と小文字を区別しません。 | リクエストURLが |
クエリ文字列に含まれるフィールドは解析されません。 | リクエストURLが |