waline icon indicating copy to clipboard operation
waline copied to clipboard

在服务端加入“必填项”的检查

Open kawashiro-ryofu opened this issue 2 years ago • 8 comments

我来PR了( ̄︶ ̄)↗ 

(于481行)

以下所称的metadata为comment对象中的子类,原因是早期的waline客户端存在一个叫作requiredMeta的参数可以配置评论的必填项目。

通过读取REQUIRED_META环境变量(内容为comment的各个元素,多个元素以逗号分隔,如nick, mail),在服务端检查必填项目,以防范别有用心者绕过客户端通过API刷评论。

kawashiro-ryofu avatar Aug 01 '22 13:08 kawashiro-ryofu

感谢贡献,但其实我个人觉得不是很有必要。如果你真的遇到了恶意攻击,那么你应该在postsave钩子里对评论进行特征检测与屏蔽,postsave钩子也可以用来二次校验requiredMeta。

添加这个环境变量会增加配置的复杂性,而且本质上requiredMeta仅用于用户提醒,如果用户想要规避的话随意填就可以了。

Mister-Hope avatar Aug 01 '22 15:08 Mister-Hope

感谢贡献,但其实我个人觉得不是很有必要。如果你真的遇到了恶意攻击,那么你应该在postsave钩子里对评论进行特征检测与屏蔽,postsave钩子也可以用来二次校验requiredMeta。

添加这个环境变量会增加配置的复杂性,而且本质上requiredMeta仅用于用户提醒,如果用户想要规避的话随意填就可以了。

(不知道你是否在QQ群)

  1. preSave的评论hook被加载但是没有被执行;

@lizheming 给我的建议是写一个preSave的Hook。

preSave.js:

const Waline = require('@waline/vercel');

module.exports = Waline({
  async preSave(comment) {
        think.logger.debug(comment)
    if (comment.comment == null || comment.nick == null || comment.mail == null || comment.ua == null || comment.url == null) {
      return { errmsg: 'Syntax Error' };
    }
  },
});

它与index.js位于同一目录,在日志中它显示是正常执行的,但是,它没有起到任何作用。也有可能是我没读懂文档。

日志:

2022-08-01T13:56:14.795789535Z [2022-08-01T21:56:14.795] [14] [DEBUG] - Comment IP XXX.XXX.XXX.XXX check OK!
2022-08-01T13:56:15.608620760Z [2022-08-01T21:56:15.607] [14] [DEBUG] - Comment duplicate check OK!
2022-08-01T13:56:16.334946985Z [2022-08-01T21:56:16.328] [14] [DEBUG] - Comment post frequence check OK!
2022-08-01T13:56:16.335395672Z [2022-08-01T21:56:16.331] [14] [DEBUG] - Comment initial status is waiting
2022-08-01T13:56:16.340518312Z [2022-08-01T21:56:16.333] [14] [DEBUG] - Comment akismet check result: waiting
2022-08-01T13:56:16.340578595Z [2022-08-01T21:56:16.336] [14] [DEBUG] - Comment keyword check result: waiting
2022-08-01T13:56:16.343837988Z [2022-08-01T21:56:16.339] [14] [DEBUG] - Comment post hooks preSave done!
2022-08-01T13:56:17.076109346Z [2022-08-01T21:56:17.065] [14] [DEBUG] - Comment have been added to storage.
2022-08-01T13:56:17.093522436Z Notification mail send success: undefined
2022-08-01T13:56:17.094307965Z [2022-08-01T21:56:17.093] [14] [DEBUG] - Comment notify done!
2022-08-01T13:56:17.094888673Z [2022-08-01T21:56:17.094] [14] [DEBUG] - Comment post hooks postSave done!
  1. 这并不是单纯的恶意刷评论,而会影响服务端的正常运行。本人站点于昨日凌晨两点被刷入30余条commentnickmailuaurl皆为undefined的评论数据。而这造成的结果便是今天早上登录评论系统后台发生错误,所有评论无法显示,只能进LeanCloud Console进行操作。

攻击重现

import requests
requests.post('https://siteof.waline.instance/comment', data={"comment":None,"nick":None,"mail":None,"link":None,"ua":None,"url":None})
  1. 基于以上两条,我更认为加入这项功能是有意义的。首先,并非所有用户都有能力来自行编写Hook;其次,Hook的文档不是很完善,让人看得有些云里雾里;最后,这种带有空值的恶意攻击已经影响到了用户的正常使用,所以有必要加入相关的配置。

以上。

kawashiro-ryofu avatar Aug 01 '22 17:08 kawashiro-ryofu

  1. 你应该修改 index.js
  2. 如果某些项传入非法值会引发故障,那么就有必要做一个类型检查。检查包括ua评论之类的全部类型是否正确。这的确是我们没有考虑到的。你应该去开一个issue。@lizheming cc
  3. 如果你觉得hook文档写得云里雾里,那我的意见是加入更多的环境变量也只会让人更加的云里雾里,而且这并不防止我random一个字符串接着给你灌评论,我坚持认为这个环境变量的添加无意义。

Mister-Hope avatar Aug 01 '22 19:08 Mister-Hope

感谢贡献,但其实我个人觉得不是很有必要。如果你真的遇到了恶意攻击,那么你应该在postsave钩子里对评论进行特征检测与屏蔽,postsave钩子也可以用来二次校验requiredMeta。

添加这个环境变量会增加配置的复杂性,而且本质上requiredMeta仅用于用户提醒,如果用户想要规避的话随意填就可以了。

首先,我没有从index.js看出任何业务逻辑; 其次,waline所有的配置都是读取环境变量得到的,也需要用户逐个来设置,单单添加一个环境变量又何妨?也不会妨碍正常运行; 然后,我不认为使用钩子比配置环境变量简单,不管是vercel用户,还是独立部署用户,配置环境变量是最为方便的,也一定比自己写hook简单; 最后,如果文档够完善,用户也不至于云里雾里。在waline的参考文档中,有关环境变量的内容远比hooks详细。

kawashiro-ryofu avatar Aug 01 '22 19:08 kawashiro-ryofu

  1. 关于添加环境变量的事情,这个我需要再考虑一下更合适的做法,现在前后端都有这个配置其实是重复的
  2. 关于 preSave hook 文档问题,我以为我的文档已经写的很清楚了,如果你觉得不清楚欢迎修改。 image

lizheming avatar Aug 02 '22 02:08 lizheming

  1. 关于添加环境变量的事情,这个我需要再考虑一下更合适的做法,现在前后端都有这个配置其实是重复的
  2. 关于 preSave hook 文档问题,我以为我的文档已经写的很清楚了,如果你觉得不清楚欢迎修改。 image

我来修改文档的前提是我能理解hook的执行原理,遗憾的是我至今都没太弄懂,所以对此我无能为力。

至于环境变量,事后考虑,其实也可有可无。如@Mister-Hope 所言,加入对非法值的类型检查也是可以。但我不能准确确定comment哪些元素是可以传入空值,而哪些元素传入空值会产生异常。没有办法,我使用环境变量来配置。

kawashiro-ryofu avatar Aug 02 '22 02:08 kawashiro-ryofu

Waline的启动方式是执行index.js文件,因此waline是通过index.js的Waline实例跑起来饿,你自然要把hook加在它的参数里

Mister-Hope avatar Aug 02 '22 02:08 Mister-Hope

不过我同意后端文档做的不是特别好,尤其是跟前段比没那么详细(老王卖瓜自卖自夸了hhh)回头我有空再重构一下后端文档。

Mister-Hope avatar Aug 02 '22 02:08 Mister-Hope