删除通过 Podio Email to item 功能发送的垃圾评论的权限

Permissions to delete spam comments sent in via the Podio Email to item feature

我们的公司 Podio space 通过 Email to Item 功能收到未经请求的评论,这是一个尴尬且持续存在的情况。我们偶尔会收到垃圾邮件,有时我们会收到几百封。将违规用户从跑道工作space 中移除无济于事。我们当然已经联系了跑道支持,但他们无法提供帮助。

我假设其他人也有或容易受到同样的破坏。似乎Kirsten Campbell-Morris reported in 2014同样的违规行为。

我们的分析是捕获了跑道发送的邮件通知,并使用了唯一的回复地址。根据我们的分析(和理论),这是一个只写漏洞。

在我们的案例中,垃圾邮件项目很容易归类为 spam/ham:它们都来自一个用户,并且总是通过电子邮件发送到项目功能到达。除了垃圾邮件,我们从来不需要这个功能,并且很乐意完全摆脱这个管理不善的功能。

我们已经勾勒出三种备选解决方案,此处按开发时间顺序排列:

  1. 定期清理程序
  2. JavaScript 程序 运行ning 反对 DOM
  3. 一个 webhook 端点

其他(1. 和 2.)的描述见下文,但我们更愿意使用最新的想法 (3.),对我们工作中的所有应用程序使用 webhooks. The idea is to create a either one or separate comment-create 挂钩space。它会收到关于评论创建的 HTTP 请求,使用 Podio API 进行身份验证,获取有问题的评论,确定它是否是垃圾邮件,并在必要时将其删除(就像说的那样,确定什么是垃圾邮件很简单我们的案例)。

我将这个想法实现为一个最小的 Lumen API 端点。收到具有以下 JSON 有效载荷

的网络钩子请求
{
    "item_id": "yyyyyyyyy",
    "hook_id": "zzzzzzz",
    "type":"comment.create"
}

传递给PodioComment::get()决策。

问题是删除操作 [PodioComment::delete()](https://developers.podio.com/doc/comments/delete-a-comment-22347) receives aPodioForbiddenError`,尽管它使用来自用户的令牌进行身份验证。

PHP 堆栈跟踪

PodioForbiddenError
in Podio.php line 319
at Podio::request('DELETE', '/comment/xxxxxxxx', array()) in Podio.php line 358
at Podio::delete('/comment/xxxxxxxx') in PodioComment.php line 46
at PodioComment::delete(xxxxxxxx) in CommentController.php line 116

这是怎么回事?我没有正确验证吗?我可以做其他任务,例如获取评论和其他跑道项目,并 Podio::setup()Podio::authenticate_with_app() 运行 成功,带有客户端 ID 和密码,以及应用程序 ID 和令牌。

我们目前的理论是 Email to Item 功能是一个单独的应用程序(有自己的 app_id)。如果这是正确的,我们如何才能验证为该应用程序以删除其中的评论?如果没有,我们还能做些什么来删除垃圾评论?我们如何检查我们的自定义程序对各种跑道项目有哪些权限?

解决方案 1. 和 2. 的详细信息

解决方案草图 1. 定期清理程序(不起作用)

其中第一个 (1.) 是一个 PHP 程序,是用 Podio PHP client 编写的,计划 运行 作为 cronjob。这个想法是定期——比如每 6 小时——进行身份验证,扫描所有项目以获取新评论,如果它们被视为垃圾邮件则将其删除。这没有用,因为尽管该程序 运行 正在管理员用户的 API 键上运行,但它没有删除用户发表的评论的权限。

解决方案草图 2。JavaScript 程序 运行ning 针对 DOM(如果手动支持则有效)

这是在网络上使用屏幕抓取和自动按下按钮进行黑客攻击 UI。

我们以用户身份登录,导航到他们的 activity 流,打开浏览器开发人员工具,将以下程序复制粘贴到控制台,然后去喝杯咖啡。这样就绕过了(1.)和(3.)的认证问题,但是操作繁琐,容易出错。

// Add the user id to remove in here. There is a good chance it is
// a six-digit number
var spamUid = 'xxxxxx';

// Consider only comments made after this date
var spamDate = new Date(2018, 04, 01);

var spamUserUrl = 'https://podio.com/users/' + spamUid;

var mnum = {
    'January': 0,
    'February': 1,
    'March': 2,
    'April': 3,
    'May': 4,
    'June': 5,
    'July': 6,
    'August': 7,
    'September': 8,
    'October': 9,
    'November': 10,
    'December': 11
}

var titleToDate = (title) => {
    re = /(\s*\d*) ([A-Za-z]*) (\d{4}) (\d*):(\d*)/;
    [, D, M, Y, h, m] = re.exec(title);
    d = new Date(Y, mnum[M], D, h, m);
    return d;
}

var throttling = 2000;

var spamComments = jQuery('.comment')
    .filter((i, c) => jQuery(c).find('.comment_byline > a')[0].href == spamUserUrl)
    .filter((i, c) => jQuery(c).find('.timestamp > time')[0].title != "")
    .filter((i, c) => titleToDate(jQuery(c).find('.timestamp > time')[0].title) > spamDate);

console.log("Found " + spamComments.length + " comments to delete");

spamComments.each((i, c) => {
    c.style.border = '5px red dotted';
    setTimeout(() => {
    console.log("deleting ", c);
    jQuery(c).find('.js-delete-comment').click();
    jQuery('.confirm-button')[0].click();
    }, i * throttling);
});

请联系跑道支持。我们有解决方案来阻止它:)

郑重声明,我们确实联系了跑道支持,这次他们回复说问题已经解决。我不知道他们做了什么,但从那以后我们就再也没有收到过垃圾邮件。谢谢。