У нас есть неловкая, постоянная ситуация получения нежелательных комментариев в наше корпоративное пространство Podio через Отправить сообщение по электронной почте. К нам спам приходит спорадически, иногда до пары сотен. Удаление нарушившего пользователя пользователя из рабочего пространства Podio не помогает. Мы, конечно, связались со службой поддержки Podio, но они не могут помочь.

Я предполагаю, что у других есть или уязвимы такие же нарушения. Кажется, Кирстен Кэмпбелл-Моррис сообщила в 2014 году о таком же нарушении.

Наш анализ показывает, что электронное уведомление, которое отправляет Podio, было перехвачено, и используются уникальные адреса для ответов. Согласно нашему анализу (и теории), это уязвимость, доступная только для записи.

В нашем случае спам-элементы легко классифицировать как спам / хам: все они исходят от одного пользователя 𝒰 и всегда поступают через функцию «Электронная почта к элементу». Кроме спама, эта функция нам никогда не понадобится, и мы были бы счастливы полностью избавиться от этой плохо управляемой функции.

Мы набросали три альтернативных решения в хронологическом порядке развития:

  1. Программа периодической очистки
  2. Программа JavaScript, работающая против DOM
  3. Конечная точка веб-перехватчика

См. Ниже описание остальных (1. и 2.), но мы предпочли бы использовать последнюю идею (3.), используя веб-перехватчики. Идея состоит в том, чтобы создать один или отдельный comment-create ловушку для всех приложений. в нашем рабочем пространстве. Он будет получать HTTP-запрос при создании комментария, аутентифицироваться с помощью Podio API, извлекать рассматриваемый комментарий, решать, является ли он спамом или нет, и при необходимости удалять его (как сказано, в нашем случае решить, что является спамом, просто).

Я реализовал эту идею как минимальную конечную точку API Lumen. При получении запроса веб-перехватчика со следующей полезной нагрузкой 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, и Podio::setup() и Podio::authenticate_with_app() запустятся успешно с идентификатором клиента и секретом, а также идентификатором приложения и токеном.

Наша текущая теория состоит в том, что функция Отправить сообщение по электронной почте - это отдельное приложение (с собственным app_id). Если это правильно, как мы можем пройти аутентификацию в качестве этого приложения, чтобы удалить из него комментарии? Если нет, что еще мы можем сделать, чтобы удалить спам-комментарии? Как мы можем проверить, какие разрешения есть у нашей пользовательской программы для различных элементов Podio?

Детали решений 1. и 2.

Схема решения 1. Программа периодической очистки (не работает)

Первая (1.) из них - это программа PHP, написанная с помощью PHP-клиента Podio И планировалось запустить как cronjob. Идея заключалась в том, чтобы периодически - скажем, каждые 6 часов - проверять подлинность, сканировать все элементы на предмет новых комментариев и удалять их, если они считаются спамом. Это не сработало, потому что, хотя программа работала с ключами API пользователя-администратора, у нее не было разрешения на удаление комментариев, сделанных пользователем 𝒰.

Эскиз решения 2. Программа на JavaScript, работающая с DOM (работает, если поддерживается вручную)

Это взлом со сканированием экрана и автоматическим нажатием кнопок в веб-интерфейсе.

Мы авторизуемся как пользователь 𝒰, переходим к их ленте активности, открываем инструменты разработчика браузера, копируем и вставляем следующую программу в консоль и идем пить кофе. Это позволяет обойти проблемы аутентификации (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);
});
1
Mace Ojala 26 Сен 2018 в 00:31

2 ответа

Лучший ответ

Обратитесь в службу поддержки Podio. У нас есть решение, чтобы это остановить :)

0
Pavlo - Podio 26 Сен 2018 в 10:48

Для протокола, мы связались со службой поддержки Podio, и на этот раз они ответили и сказали, что проблема решена. Я понятия не имею, что с их стороны было сделано, но с тех пор мы не получали спам-сообщений. Спасибо.

0
Mace Ojala 7 Дек 2018 в 11:22