防盗链
使用场景
一些不良网站想要扩充自己站点内容,但却不想增加成本,于是会盗用其他网站的链接。一方面损害了原网站的合法利益,另一方面又加重了服务器的负担。因此,产生了防盗链技术。
在HTTP协议中,通过表头字段referer,网站可以检测目标网页访问的来源网页。有了referer跟踪来源,就可以通过技术手段来进行处理,一旦检测到来源不是本站即进行阻止或者返回指定的页面。防盗链就是通过设置Referer,去检测请求来源的referer字段信息是否与白名单或黑名单匹配,如果与白名单匹配成功则允许请求访问,否则阻止请求访问或返回指定页面。
为了防止用户在OBS的数据被其他人盗链,OBS支持基于HTTP header中表头字段referer的防盗链方法。OBS同时支持访问白名单和访问黑名单的设置。
Referer规则如下:
- 白名单Referer/黑名单Referer输入的字节数不能超过1024个字符。
- Referer格式:
- Referer可以设置多个,多个Referer换行隔开;
- Referer参数支持通配符(*)和问号(?),通配符可代替0个或多个字符,问号可代替单个字符;
- 如果下载时Referer头域包含了http或https,则Referer设置必须包含http或https。
- 白名单Referer为空,黑名单Referer不空时,允许所有黑名单中指定网站以外的其他网站的请求访问目标桶中的数据。
- 白名单Referer不为空,黑名单Referer为空或不空时,允许在白名单且不在黑名单中的网站的请求访问目标桶中的数据。
当白名单Referer与黑名单Referer内容有交集时,交集部分Referer被禁止。例如:当白名单Referer与黑名单Referer输入框中的referer字段都有“https://www.example.com”时,系统是阻止该网站的请求访问的。
- 黑名单Referer与白名单Referer都为空时,默认允许所有网站的请求访问目标桶中的数据。
- 判断用户是否有对桶及其内容访问的四种权限(读取权限、写入权限、ACL读取权限、ACL写入权限)之前,需要首先检查是否符合referer字段的防盗链规则。
白名单和黑名单设置方法如下:
- 白名单设置
通过设置白名单,用户可以指定允许来自白名单列表中的网站的请求访问,否则将进行拦截。
通过浏览器地址栏直接访问资源的请求,即HTTP请求中referer为空的场景,用户可以通过在Condition的"Referer"中添加${null}字段,用于指定是否允许referer为空的请求访问。
白名单设置具体参考如下policy设置进行实现:
"Statement":[ {"Sid": "1", "Effect": "Allow", "Principal": {"ID":["*"]}, "Action": "*", "Resource":["bucket/*"], }, {"Sid":"2", "Effect":"Deny", "Principal":{"ID":["*"]}, "Action":["*"], "Resource":["bucket/*"], "Condition":{ "StringNotEquals": {"Referer":["http://www.example01.com","${null}"]} } } ]
如果按照此方式设置,只有referer为"www.example01.com"和referer为空的请求可以对桶bucket中的资源进行操作。
- 黑名单设置
"Statement":[ {"Sid":"1", "Effect":"Deny", "Principal":{"ID":["*"]}, "Action":["*"], "Resource":["bucket/*"], "Condition":{ "StringEquals": {"Referer":["http://www.example01.com","http://www.example02.com"]} } } ]
如果按照此方式设置,当referer为"www.example01.com"或"www.example02.com"时,就不能对桶bucket中的资源进行操作。