删除通过 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:它们都来自一个用户,并且总是通过电子邮件发送到项目功能到达。除了垃圾邮件,我们从来不需要这个功能,并且很乐意完全摆脱这个管理不善的功能。
我们已经勾勒出三种备选解决方案,此处按开发时间顺序排列:
- 定期清理程序
- JavaScript 程序 运行ning 反对 DOM
- 一个 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 a
PodioForbiddenError`,尽管它使用来自用户的令牌进行身份验证。
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);
});
请联系跑道支持。我们有解决方案来阻止它:)
郑重声明,我们确实联系了跑道支持,这次他们回复说问题已经解决。我不知道他们做了什么,但从那以后我们就再也没有收到过垃圾邮件。谢谢。
我们的公司 Podio space 通过 Email to Item 功能收到未经请求的评论,这是一个尴尬且持续存在的情况。我们偶尔会收到垃圾邮件,有时我们会收到几百封。将违规用户从跑道工作space 中移除无济于事。我们当然已经联系了跑道支持,但他们无法提供帮助。
我假设其他人也有或容易受到同样的破坏。似乎Kirsten Campbell-Morris reported in 2014同样的违规行为。
我们的分析是捕获了跑道发送的邮件通知,并使用了唯一的回复地址。根据我们的分析(和理论),这是一个只写漏洞。
在我们的案例中,垃圾邮件项目很容易归类为 spam/ham:它们都来自一个用户,并且总是通过电子邮件发送到项目功能到达。除了垃圾邮件,我们从来不需要这个功能,并且很乐意完全摆脱这个管理不善的功能。
我们已经勾勒出三种备选解决方案,此处按开发时间顺序排列:
- 定期清理程序
- JavaScript 程序 运行ning 反对 DOM
- 一个 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 a
PodioForbiddenError`,尽管它使用来自用户的令牌进行身份验证。
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);
});
请联系跑道支持。我们有解决方案来阻止它:)
郑重声明,我们确实联系了跑道支持,这次他们回复说问题已经解决。我不知道他们做了什么,但从那以后我们就再也没有收到过垃圾邮件。谢谢。