@@ -345,38 +345,57 @@ public void makeUpForLostData(String fileName, String filePath, MultipartFile fi
345
345
dataService .makeUpForLostData (fileName , filePath , one .getFileId (), file , fileUrl , bucketInfo );
346
346
}
347
347
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
+ */
348
359
private void checkReferer (WebRequest request , BucketInfo bucketInfo ) {
349
- // 匿名访问,检查 referer
350
360
String headReferer = request .getHeader ("Referer" );
351
361
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 ;
378
394
}
379
395
}
396
+ if (!match ) {
397
+ throw new XmlResponseException (new AccessDenied ("referer deny" ));
398
+ }
380
399
}
381
400
382
401
@ Override
0 commit comments