您可以使用阿里雲OSS的Go SDK來配置基於請求標題Referer
的訪問規則,包括設定白名單Referer
、黑名單Referer
以及是否允許空Referer
。通過這些配置,您可以阻止特定Referer
訪問您的OSS檔案,防止其他網站盜用您的資源,從而避免不必要的流量費用增加。
注意事項
在配置防盜鏈之前,請確保您已瞭解該功能。詳情請參見防盜鏈。
本文以華東1(杭州)外網Endpoint為例。如果您希望通過與OSS同地區的其他阿里雲產品訪問OSS,請使用內網Endpoint。關於OSS支援的Region與Endpoint的對應關係,請參見OSS訪問網域名稱、資料中心、開放連接埠。
本文以從環境變數讀取存取憑證為例。如何配置訪問憑證,請參見配置訪問憑證。
本文以OSS網域名稱建立OSSClient為例。如果您希望通過自訂網域名、STS等方式建立OSSClient,請參見初始化。
要設定或清空防盜鏈,您必須具有
oss:PutBucketReferer
許可權;要擷取防盜鏈,您必須具有oss:GetBucketReferer
許可權。具體操作,請參見為RAM使用者授權自訂的權限原則。
範例程式碼
設定防盜鏈
以下代碼用於設定防盜鏈。
package main
import (
"log"
"github.com/aliyun/aliyun-oss-go-sdk/oss"
)
func main() {
// 填寫Bucket名稱。
bucketName := "examplebucket"
// 從環境變數中擷取訪問憑證。運行本程式碼範例之前,請確保已設定環境變數OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
provider, err := oss.NewEnvironmentVariableCredentialsProvider()
if err != nil {
log.Fatalf("Error creating credentials provider: %v", err)
}
// 建立OSSClient執行個體。
// yourEndpoint填寫Bucket對應的Endpoint,以華東1(杭州)為例,填寫為https://oss-cn-hangzhou.aliyuncs.com。其它Region請按實際情況填寫。
// yourRegion填寫Bucket所在地區,以華東1(杭州)為例,填寫為cn-hangzhou。其它Region請按實際情況填寫。
clientOptions := []oss.ClientOption{oss.SetCredentialsProvider(&provider)}
clientOptions = append(clientOptions, oss.Region("yourRegion"))
// 設定簽名版本
clientOptions = append(clientOptions, oss.AuthVersion(oss.AuthV4))
client, err := oss.New("yourEndpoint", "", "", clientOptions...)
if err != nil {
log.Fatalf("Error creating OSS client: %v", err)
}
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{
Referer: []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 {
log.Fatalf("Error setting bucket referer: %v", err)
}
log.Println("Set Bucket Referer Success")
}
擷取防盜鏈配置
以下代碼用於擷取防盜鏈配置。
package main
import (
"log"
"github.com/aliyun/aliyun-oss-go-sdk/oss"
)
func main() {
// 填寫Bucket名稱。
bucketName := "yourBucketName"
// 從環境變數中擷取訪問憑證。運行本程式碼範例之前,請確保已設定環境變數OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
provider, err := oss.NewEnvironmentVariableCredentialsProvider()
if err != nil {
log.Fatalf("Error creating credentials provider: %v", err)
}
// 建立OSSClient執行個體。
// yourEndpoint填寫Bucket對應的Endpoint,以華東1(杭州)為例,填寫為https://oss-cn-hangzhou.aliyuncs.com。其它Region請按實際情況填寫。
// yourRegion填寫Bucket所在地區,以華東1(杭州)為例,填寫為cn-hangzhou。其它Region請按實際情況填寫。
clientOptions := []oss.ClientOption{oss.SetCredentialsProvider(&provider)}
clientOptions = append(clientOptions, oss.Region("yourRegion"))
// 設定簽名版本
clientOptions = append(clientOptions, oss.AuthVersion(oss.AuthV4))
client, err := oss.New("yourEndpoint", "", "", clientOptions...)
if err != nil {
log.Fatalf("Error creating OSS client: %v", err)
}
// 擷取防盜鏈配置。
refRes, err := client.GetBucketReferer(bucketName)
if err != nil {
log.Fatalf("Error getting bucket referer: %v", err)
}
// 列印防盜鏈配置資訊。
log.Println("Allow Empty Referer:", refRes.AllowEmptyReferer)
if refRes.AllowTruncateQueryString != nil {
log.Println("Allow Truncate QueryString:", *refRes.AllowTruncateQueryString)
}
if len(refRes.RefererList) > 0 {
for _, referer := range refRes.RefererList {
log.Println("Referer List:", referer)
}
}
if refRes.RefererBlacklist != nil && len(refRes.RefererBlacklist.Referer) > 0 {
for _, refererBlack := range refRes.RefererBlacklist.Referer {
log.Println("Referer Black List:", refererBlack)
}
}
log.Println("Get Bucket Referer Success")
}
清空防盜鏈
以下代碼用於清空防盜鏈。
package main
import (
"log"
"github.com/aliyun/aliyun-oss-go-sdk/oss"
)
func main() {
// yourBucketName填寫Bucket名稱。
bucketName := "yourBucketName"
// 從環境變數中擷取訪問憑證。運行本程式碼範例之前,請確保已設定環境變數OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
provider, err := oss.NewEnvironmentVariableCredentialsProvider()
if err != nil {
log.Fatalf("Error creating credentials provider: %v", err)
}
// 建立OSSClient執行個體。
// yourEndpoint填寫Bucket對應的Endpoint,以華東1(杭州)為例,填寫為https://oss-cn-hangzhou.aliyuncs.com。其它Region請按實際情況填寫。
// yourRegion填寫Bucket所在地區,以華東1(杭州)為例,填寫為cn-hangzhou。其它Region請按實際情況填寫。
clientOptions := []oss.ClientOption{oss.SetCredentialsProvider(&provider)}
clientOptions = append(clientOptions, oss.Region("yourRegion"))
// 設定簽名版本
clientOptions = append(clientOptions, oss.AuthVersion(oss.AuthV4))
client, err := oss.New("yourEndpoint", "", "", clientOptions...)
if err != nil {
log.Fatalf("Error creating OSS client: %v", err)
}
// 清空防盜鏈配置。
var delBucketReferer oss.RefererXML
delBucketReferer.RefererList = []string{}
delBucketReferer.AllowEmptyReferer = true
err = client.SetBucketRefererV2(bucketName, delBucketReferer)
if err != nil {
log.Fatalf("Error clearing bucket referer: %v", err)
}
log.Println("Delete Bucket Referer Success")
}
相關文檔
關於防盜鏈的完整範例程式碼,請參見GitHub。
關於設定防盜鏈的API介面說明,請參見SetBucketRefererV2。
關於擷取防盜鏈配置的API介面說明,請參見GetBucketReferer。