Skip to content

Commit 835232d

Browse files
committed
referer check update
1 parent bfa8919 commit 835232d

File tree

4 files changed

+50
-31
lines changed

4 files changed

+50
-31
lines changed

src/main/java/com/berry/oss/api/ObjectController.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -169,7 +169,7 @@ public void getObject(
169169
}
170170

171171
@PostMapping("create_folder.json")
172-
@ApiOperation("新建目录,支持同事创建多级目录")
172+
@ApiOperation("新建目录,支持同时创建多级目录")
173173
public Result createFolder(@Validated @RequestBody CreateFolderMo mo) {
174174
objectService.createFolder(mo.getBucket(), mo.getFolder());
175175
return ResultFactory.wrapper();

src/main/java/com/berry/oss/service/IObjectHashService.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ public interface IObjectHashService {
2222

2323
/**
2424
* 增加 哈希引用计算, 记录可能不存在,所以需要 fileId size 进行创建时初始化
25-
* 不能异步, 否则批量创建是,hash引用将会出错
25+
* 不能异步, 否则批量创建时,hash引用将会出错
2626
*
2727
* @param hash hash值
2828
* @param fileId fileId

src/main/java/com/berry/oss/service/impl/ObjectServiceImpl.java

Lines changed: 46 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -345,38 +345,57 @@ public void makeUpForLostData(String fileName, String filePath, MultipartFile fi
345345
dataService.makeUpForLostData(fileName, filePath, one.getFileId(), file, fileUrl, bucketInfo);
346346
}
347347

348+
/**
349+
* 匿名访问,检查 referer
350+
* Referer效果
351+
* 1. 如果Referer白名单为空,则所有的请求都会被允许。
352+
* 2. 如果Referer白名单不为空,且不允许Referer字段为空,则只有Referer属于白名单的请求被允许,其
353+
* 他请求(包括Referer为空的请求)会被拒绝。
354+
* 3. 如果Referer白名单不为空,但允许Referer字段为空,则Referer为空的请求和符合白名单的请求会被
355+
* 允许,其他请求都会被拒绝。
356+
* @param request request
357+
* @param bucketInfo bucketInfo
358+
*/
348359
private void checkReferer(WebRequest request, BucketInfo bucketInfo) {
349-
// 匿名访问,检查 referer
350360
String headReferer = request.getHeader("Referer");
351361
RefererInfo refererInfo = refererInfoDaoService.getOne(new QueryWrapper<RefererInfo>().eq(BUCKET_ID_COLUMN, bucketInfo.getId()));
352-
if (refererInfo != null) {
353-
// 是否 允许空 Referer(默认允许为空)
354-
boolean allowEmptyPrimitive = refererInfo.getAllowEmpty();
355-
// 1.允许为空
356-
if (allowEmptyPrimitive) {
357-
return;
358-
}
359-
String whiteList = refererInfo.getWhiteList();
360-
// 同时设置了 ‘允许空 Referer’(非 null) 和 ‘白名单’ 两者方可生效
361-
if (isNotBlank(whiteList)) {
362-
// 2.不允许 空 referer,请求 头中 没有 referer,则deny
363-
if (isBlank(headReferer)) {
364-
throw new XmlResponseException(new AccessDenied("referer deny"));
365-
}
366-
// 3. 白名单,pass
367-
String[] whiteArr = whiteList.split(",");
368-
boolean match = false;
369-
for (String white : whiteArr) {
370-
if (headReferer.matches(white)) {
371-
match = true;
372-
break;
373-
}
374-
}
375-
if (!match) {
376-
throw new XmlResponseException(new AccessDenied("referer deny"));
377-
}
362+
// 未设置 防盗链:所有请求被允许
363+
if (refererInfo == null) {
364+
return;
365+
}
366+
// 设置了防盗链
367+
boolean allowEmptyPrimitive = refererInfo.getAllowEmpty();
368+
String whiteList = refererInfo.getWhiteList();
369+
370+
// 1. 如果Referer白名单为空,则所有的请求都会被允许。
371+
if (isBlank(whiteList)) {
372+
return;
373+
}
374+
// 2. 如果Referer白名单不为空,且不允许Referer字段为空,则只有Referer属于白名单的请求被允许,其他请求(包括Referer为空的请求)会被拒绝
375+
// 3. 如果Referer白名单不为空,但允许Referer字段为空,则Referer为空的请求和符合白名单的请求会被允许,其他请求都会被拒绝。
376+
377+
// 不允许Referer字段为空, 实际为空
378+
if (!allowEmptyPrimitive && isBlank(headReferer)) {
379+
throw new XmlResponseException(new AccessDenied("referer deny"));
380+
}
381+
382+
// 允许Referer字段为空, 实际为空
383+
if (allowEmptyPrimitive && isBlank(headReferer)) {
384+
return;
385+
}
386+
387+
// 白名单,pass
388+
String[] whiteArr = whiteList.split(",");
389+
boolean match = false;
390+
for (String white : whiteArr) {
391+
if (headReferer.matches(white)) {
392+
match = true;
393+
break;
378394
}
379395
}
396+
if (!match) {
397+
throw new XmlResponseException(new AccessDenied("referer deny"));
398+
}
380399
}
381400

382401
@Override

src/main/resources/application-dev.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,8 @@ spring:
55
password: berry123
66
datasource:
77
url: jdbc:mysql://127.0.0.1:3306/db_oss_service?characterEncoding=utf8&useSSL=false&useUnicode=true&allowPublicKeyRetrieval=true&serverTimezone=UTC
8-
username: root
9-
password:
8+
username: user_atm
9+
password: IeP6aLE517pmyEwZ
1010
driver-class-name: com.mysql.cj.jdbc.Driver
1111
type: com.alibaba.druid.pool.DruidDataSource
1212
platform: mysql

0 commit comments

Comments
 (0)