-
Notifications
You must be signed in to change notification settings - Fork 401
Open
Description
问题描述
在RestLinkController的add方法中,通过@RequiresPermissions("link:add")进行权限校验,同时存在linkService.insert(link);方法调用,表示插入链接。然而在RestApiController的autoLink方法中,通过sysLinkService.autoLink(link);方法,也调用了linkService.insert(link);的方法。但是RestApiController的autoLink并不存在任何类似的权限检查。攻击者是否可能通过RestApiController的autoLink接口,绕过RestLinkController的add的权限检查,插入链接呢。
相关代码片段
- 在
RestLinkController的add中
@RequiresPermissions("link:add") // 存在权限保护
@PostMapping(value = "/add")
@BussinessLog("添加友情链接")
public ResponseVO add(Link link) {
link.setSource(LinkSourceEnum.ADMIN);
if (!RegexUtils.isUrl(link.getUrl())) {
throw new ZhydLinkException("链接地址无效!");
}
linkService.insert(link); // 调用了insert插入链接
mailService.send(link, TemplateKeyEnum.TM_LINKS);
return ResultUtil.success("成功");
}- 在
RestApiController的autoLink中
@PostMapping("/autoLink")
@BussinessLog(value = "自助申请友链", platform = PlatformEnum.WEB)
public ResponseVO autoLink(@Validated Link link, BindingResult bindingResult) {
log.info("申请友情链接......");
log.info(JSON.toJSONString(link));
if (bindingResult.hasErrors()) {
return ResultUtil.error(bindingResult.getFieldError().getDefaultMessage());
}
try {
sysLinkService.autoLink(link); // 通过这里也调用了insert方法插入链接
} catch (ZhydLinkException e) {
log.error("客户端自助申请友链发生异常", e);
return ResultUtil.error(e.getMessage());
}
return ResultUtil.success("已成功添加友链,祝您生活愉快!");
}
@Override
@RedisCache(flush = true)
public boolean autoLink(Link link) throws ZhydLinkException {
String url = link.getUrl();
if(StringUtils.isEmpty(url)) {
throw new ZhydLinkException("链接地址为空!");
}
if(!RegexUtils.isUrl(url)) {
throw new ZhydLinkException("链接地址无效!");
}
Link bo = getOneByUrl(url);
if (bo != null) {
throw new ZhydLinkException("本站已经添加过贵站的链接!");
}
Map config = configService.getConfigs();
String domain = (String) config.get(ConfigKeyEnum.DOMAIN.getKey());
if (!(LinksUtil.hasLinkByHtml(url, domain))
&& !LinksUtil.hasLinkByChinaz(url, domain)) {
throw new ZhydLinkException("贵站暂未添加本站友情链接!请先添加本站友链后重新提交申请!");
}
link.setSource(LinkSourceEnum.AUTOMATIC);
link.setStatus(true);
if (!StringUtils.isEmpty(link.getEmail())) {
link.setEmail(HtmlUtil.html2Text(link.getEmail()));
}
if (!StringUtils.isEmpty(link.getFavicon())) {
link.setFavicon(HtmlUtil.html2Text(link.getFavicon()));
}
if (!StringUtils.isEmpty(link.getName())) {
link.setName(HtmlUtil.html2Text(link.getName()));
}
if (!StringUtils.isEmpty(link.getUrl())) {
link.setUrl(HtmlUtil.html2Text(link.getUrl()));
}
if (!StringUtils.isEmpty(link.getDescription())) {
link.setDescription(HtmlUtil.html2Text(link.getDescription()));
}
this.insert(link);
log.info("友联自动申请成功,开始发送邮件通知...");
mailService.send(link, TemplateKeyEnum.TM_LINKS);
return true;
}Metadata
Metadata
Assignees
Labels
No labels