[halo-dev/halo]未登录状态下仍然可以通过搜索引擎搜索到私有文章信息

2023-11-20 888 views
0
是什么版本出现了此问题?

2.10

使用的什么数据库?

MySQL 8.x

使用的哪种方式运行?

Docker

在线站点地址 发生了什么?

在博客首页,未登录无法搜索到私有文章的内容,此时点击登录后返回主页,仍然无法搜索到私有内容,是否应该在登录之后主动做一次刷新搜索引擎索引的操作?

回答

8

目前,本地搜索引擎只针对于公开的文章建立了索引,所以无论是否登录,通过搜索引擎都无法搜索出私有文章。

9

我认为这个地方的实现存在很多问题,首先我确实在搜索框中搜索到了私有文章如图所示(我在搜索之前手动在登录状态下刷新了索引) image image 只不过在未登录情况下无法点击进入浏览,进入后报404,登录后可以正常浏览私有文章

7

重构索引调用的应该是这个方法 https://github.com/halo-dev/halo/blob/747cab3aa195c03b87d8ff5174bafe72e5bb3ffa/application/src/main/java/run/halo/app/search/IndicesServiceImpl.java#L41-L43 https://github.com/halo-dev/halo/blob/747cab3aa195c03b87d8ff5174bafe72e5bb3ffa/application/src/main/java/run/halo/app/theme/finders/impl/PostFinderImpl.java#L105-L109 其中postFinder.listAll()postPredicateResolver.getPredicate()是这样写的 https://github.com/halo-dev/halo/blob/747cab3aa195c03b87d8ff5174bafe72e5bb3ffa/application/src/main/java/run/halo/app/theme/router/DefaultQueryPostPredicateResolver.java#L28-L35 32行visiblePredicate.or也拿到了当前用户的私有文章。 我看这个代码是 #4412 在实现主题端展示作者的私有文章时候加的,可能会导致操作更新索引的用户私有文章被更新到索引当中

8

感谢 @AirboZH 提供了相关的代码片段。

被动刷新过程中不会判断 owner,所以会过滤掉 private 的文章。但是主动刷新过程不会过滤掉 private 的文章。

/kind bug /area core

6

考虑为已登录用户提供私有文章的搜索么?

4

已登录的用户不一定有查看私有文章的权限,例如访客。即使能够搜索到,但仍然无法查看。

6

我的意思是

A用户的私有文章在A用户登录时,自己可以查询到,但是B用户不能。 B用户的私有文章在B用户登录时,自己可以查询到,但是A用户不能。

已登录用户可以查询到自己的私有文章。

可能在私有知识库等情况会用。如果先不考虑的话,我可以assign这个issue

4

"能够搜索到" 在某些情况下就已经会暴露一些信息了, 假设我存储了一个GithubToken的字段在私有文章中,当访客不经意搜索了"Github","Token"这2个字段,那么关联出来的索引可能会暴露这个信息

0

目前,可以先解决掉“主动刷新”后可以搜索到“私有”文章的问题。关于登录用户能够搜索到自己的私有文章的特性,可以另外实现。

0

@JohnNiang 好的,我会处理这个issue

目前有两个思路,

  1. 考虑在ReactiveQueryPostPredicateResolver 增加一个pulic文章的Predicate
  2. rebuildPostIndices方法中过滤掉私有文章

哪种方式更好呢。我倾向第一种,不用将不必要的数据查询出来再删除掉

7

我觉得可以考虑在ORM层面做数据权限的过滤,例如MybatisPlus中有一个数据权限过滤器可以用于拼接WHERE条件来实现不同的用户查询到的结果不一样

0

记得Halo数据库中只有一张extensions表么。 image

我猜所有的持久化操作应该是通过ReactiveExtensionClient这样一个接口来完成的。所以可以没办法和传统的ORM动态SQL或者类似操作一样实现了。

5

Hi @AirboZH,

IMO,我更倾向第二种方式。修改第一种方式可能会影响到其他功能。

9

好的,那就在rebuildPostIndices方法中过滤掉私有文章