Массовое удаление ревизий спама в Mediawiki

15

По сути, мой «частный» экземпляр в Mediawiki был так же безопасен, как и копилка для малышей. Сейчас я его усилил, но осталось около сотни новых страниц и ревизий, созданных сотнями случайно сгенерированных пользователей.

2 части вопроса; Есть ли способ удалить все потерянные страницы? Могу ли я сказать, чтобы откатить все ревизии, НЕ сделанные определенным пользователем (мной)?

Эндрю Болстер
источник
mediawiki.org/wiki/Manual:Combating_vandalism и mediawiki.org/wiki/Manual:Combating_spam являются каноническими источниками, но работа над ними продолжается: phabricator.wikimedia.org/T90238
Nemo
У меня больше нет этой проблемы с моим сайтом mediawiki. Если у вас все еще есть эта проблема, ответьте на мой комментарий, и я могу показать вам в прямом эфире, как я исправлю эти проблемы.
Иегова говорит

Ответы:

19

Если вы не хотите использовать метод экспорта и переустановки, предложенный danlefree , вы также можете найти расширение Nuke полезным. После установки посетите специальную страницу Special: Nuke как администратор дает вам такую ​​форму:

Снимок экрана интерфейса расширения MediaWiki Nuke

Есть также несколько встроенных сценариев обслуживания MediaWiki, которые могут быть полезны, в том числе:

  • cleanupSpam.php , который можно использовать для отката и / или удаления всех ревизий, содержащих ссылку на определенное имя хоста,

  • deleteBatch.php , который можно использовать для удаления всех страниц, перечисленных в файле, и

  • rollbackEdits.php (в настоящее время, похоже, нет соответствующей вики-документации), которую можно использовать для отката всех правок указанного пользователя.


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

Также возможно делать то, что вы хотите, непосредственно манипулируя базой данных. Там детали могут немного отличаться в зависимости от вашей ситуации, но основные шаги будут выглядеть примерно так:

  1. Установите вашу вики в режим только для чтения . Вы не хотите, чтобы кто-то пытался редактировать вики, пока вы возитесь с базой данных.

  2. Сделайте резервную копию вашей вики. (Это настоятельно рекомендуется перед любым необратимым массовым удалением в любом случае.)

  3. Удалить все учетные записи пользователей, созданные спамерами. Если, как и в приведенном выше вопросе, вы были единственным действительным пользователем, вы можете просто сделать:

    DELETE FROM user WHERE user_id != YOUR_USER_ID;

    В качестве альтернативы, если новые действительные учетные записи не были созданы после того, как спамеры обнаружили вики, вы можете найти самый большой действительный идентификационный номер пользователя и сделать:

    DELETE FROM user WHERE user_id > LAST_VALID_USER_ID;

    Или вы можете использовать инструмент администратора, такой как phpMyAdmin, чтобы вручную выбрать действительные учетные записи и удалить остальные.

  4. Очистите лишние данные, связанные с удаленными учетными записями. Это не является строго необходимым, но эти осиротевшие записи бесполезны и будут просто загромождать вашу базу данных, если вы не удалите их:

    DELETE FROM user_groups WHERE ug_user NOT IN (SELECT user_id FROM user);
    DELETE FROM user_properties WHERE up_user NOT IN (SELECT user_id FROM user);
    DELETE FROM user_newtalk WHERE user_id NOT IN (SELECT user_id FROM user);
  5. Удалите все изменения, не сделанные действительным пользователем:

    Это большой шаг; все до того, как это было подготовлено, все после того, как это очищено. После удаления всех спам-аккаунтов вы можете просто:

    DELETE FROM revision WHERE rev_user > 0 AND rev_user NOT IN (SELECT user_id FROM user);

    Если в вашей вики отключено анонимное редактирование (что я настоятельно рекомендую для приватных / тестовых вики), то приведенного выше запроса должно быть достаточно, чтобы избавиться от всех версий спама. Если вы включили анонное редактирование, вам придется раздавать анонимный спам отдельно.

    Если вы уверены, что все анонимные правки в вашей вики - это спам, единственные правки, сделанные с помощью UID 0, которые нам, возможно, потребуется сохранить, - это изменения, сделанные самим MediaWiki (например, страницы, импортированные извне вики). В этом случае должен работать примерно такой запрос:

    DELETE FROM revision WHERE rev_user = 0 AND rev_user_text BETWEEN '1' AND '999';

    Это удалит все ревизии по UID 0, где имя пользователя выглядит (смутно) как адрес IPv4; то есть начинается с цифры от 1 до 9.

    Если в вашей вики есть какие-то законные анонимные правки, вам, возможно, придется стать немного более креативным. Если количество IP-адресов, используемых законными незарегистрированными редакторами, ограничено, вы можете просто добавить предложение, подобное AND rev_user_text NOT IN ('1.2.3.4', '5.6.7.8', '9.10.11.12')приведенному выше запросу, чтобы исключить вклады этих IP-адресов из удаления. Вы также можете добавить такие условия, как, например, AND rev_user_text NOT LIKE '192.168.%'сохранить все изменения с IP-адресов, начиная с определенного префикса.

  6. Приведенные выше запросы избавят от версий спама (хотя их содержание все еще останется в textтаблице), но оставят page_latestполе любых затронутых страниц, указывающих на несуществующую редакцию. Это может вызвать путаницу, поэтому нам лучше это исправить.

    Во-первых, нам нужно стереть page_latestстолбец для всех страниц:

    UPDATE page SET page_latest = 0;
  7. Далее мы перестроим столбец, запустив сценарий обслуживания attachLatest.php (рекомендуется; не забудьте использовать --fixпараметр, чтобы скрипт фактически изменял базу данных), или с помощью SQL-запроса вручную:

    UPDATE page SET page_latest =
        (SELECT MAX(rev_id) FROM revision WHERE rev_page = page_id);
  8. Наконец, мы удалим все страницы, для которых не было найдено действительных ревизий (потому что они были созданы спаммерами и никогда не имели какого-либо действительного контента):

    DELETE FROM page WHERE page_latest = 0;
  9. В завершение перестройте таблицы ссылок, текстового индекса и последних изменений, запустив сценарий обслуживания rebuildall.php . Вы также можете удалить содержимое удаленных версий спама из базы данных, чтобы они не занимали там ненужного места, запустив сценарий обслуживания purgeOldText.php .

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

Для небольших вики я настоятельно рекомендую расширение QuestyCaptcha , которое позволяет вам настраивать простую пользовательскую текстовую CAPTCHA. Хитрость в том, что с каждой вики, имеющей свой собственный набор вопросов, программирование спамбота для правильного ответа на них будет большой работой за очень небольшую выгоду. Я установил его на своей вики после того, как пару раз меня ударил XRumer , и с тех пор не видел спама.

Ps. Я использовал эти инструкции, чтобы уничтожить около 35 000 версий спама, созданных столь же многими пользователями из небольшой вики . Все прошло нормально. В этом конкретном случае вики (к счастью!) Не позволяла анонимное редактирование, и почти все законные пользователи были созданы до того, как спаммеры нашли вики, поэтому я мог довольно легко сначала удалить все учетные записи спама, а затем все ревизии они создали. (Сначала я случайно удалил одну легитимную учетную запись, поэтому мне пришлось восстанавливать из резервной копии и более тщательно повторять процесс.) Я обновил приведенные выше инструкции, чтобы лучше отразить то, что я на самом деле делал, и быть более общим ,

Илмари Каронен
источник
Этому вопросу уже пару лет, и он, похоже, хорошо поработал над маленькой вики, в которой накопилось 100 000 спам-ботов. Изменились ли вещи с тех пор; Есть ли дополнительные шаги?
Ant6n
Некоторые новости здесь? Это «лучшие практики» и «лучшие инструменты» в наши дни?
Питер Краусс
rebuildall.phpне в обслуживании: O В противном случае спасибо
Джейми Хатбер
5

Самый простой способ справиться с этой ситуацией (если вы не возражаете против использования nuke'n'pave) - это экспортировать все вики-страницы, созданные или отредактированные под вашим именем пользователя, переустановить вики и импортировать созданный вами файл экспорта.

«Переустановить» в этом контексте будет означать:

  1. Экспорт статей, созданных вами (предположительно, вошел в систему как пользователь WikiSysop или аналогичный)
  2. Удалить базу данных MW
  3. Создать пустую базу данных MW
  4. Скопируйте ваш LocalSettings.phpфайл в безопасное место
  5. Повторно загрузите /config/каталог
  6. Запустите процесс установки для новой базы данных MW (обратите внимание, что вы захотите воссоздать своего старого администратора)
  7. Удалите /config/каталог и переместите старый LocalSettings.phpфайл обратно в корень MW
  8. Импортируйте файл, созданный на шаге 1

Изменить: Вы можете захотеть снять резервную копию базы данных (включая версии спама) на случай, если у вас возникнут какие-либо проблемы с этим процессом или вы хотите поэкспериментировать с альтернативными способами очистки от спама.

danlefree
источник
2

Теоретически, вы можете написать расширение MediaWiki, чтобы делать все, что вам нравится, с экземпляром MediaWiki, в том числе делать то, что вы упомянули.

Если не считать этого, и если не считать «nuke'n'pave», предложенного danlefree, вы можете найти расширение User Merge and Delete полезным: вы можете использовать его для консолидации нескольких учетных записей spambot в одну учетную запись, к изменениям которой затем можно обратиться с легкостью.

sampablokuper
источник
2

Самый простой способ справиться с этой ситуацией - установить расширение DeleteBatch . Используйте Special: AllPages в вашей вики, чтобы получить файл сценария с именами страниц, которые вы хотите удалить, и загрузить его в Special: DeleteBatch.

Роб Кам
источник
1

Если это всего сто спам-страниц, вы не так уж плохо себя ведете. Я должен был очистить вики, которая имела тысячи спам-страниц. Я наткнулся на несколько хороших советов от пользователя: Halz на этой странице: обнаружил https://www.mediawiki.org/wiki/User:Halz/Mass_despamming, в том числе описание ограничений различных инструментов.

Внизу он предоставил полезный SQL-запрос, который выполняется немного медленно, но помогает вам найти страницы, которые, скорее всего, являются спамом, особенно если вы можете определить период времени, когда вики попали на спамеров. У Halz также есть взломанная версия Extension: Nuke, которая представляет такие типы параметров с возможностью запроса для легкого массового удаления. Он дал мне копию для использования, но я не думаю, что он опубликовал ее.

Гарри Вуд
источник
1

Я настоятельно рекомендую не связываться с SQL MediaWiki!MediaWiki - сложный зверь, очень оптимизированный для Википедии. В SQL происходят некоторые странные вещи, и если вы просто УДАЛИТЕ строки, вещи могут потерять согласованность.

Если у вас есть навыки программирования, пройдите API. Pywikibot - хороший выбор.

В противном случае проверьте инструменты в maintenance/каталоге. Вы можете попробовать мой собственный инструмент, mewsh, чтобы помочь с этим (и я просто добавил «инструменты для защиты от спама» в качестве задачи).

фифи финанс
источник
0

Я взял на себя установку и нашел более 47 000 записей спама в userтаблице и почти 900 000 спама externallinks. Я использовал Sequel Pro и посетил каждую таблицу и удалил записи, сделанные не подлинными пользователями. Я нашел спам в externallinks, page, searchindex, user, watchlist. Это было довольно эффективно по времени; большая часть моего времени ждала выполнения запросов на удаление. Мне повезло, потому что большинство подлинных правок происходило рано в порядке вещей.

ow3n
источник
2
Нет смысла пытаться удалить спам-ссылки externallinks, поскольку это избыточная таблица метаданных, которая в основном используется только для таких вещей, как Special: LinkSearch; как только вы очистите реальные страницы, вы можете просто запустить, rebuildall.phpчтобы стереть и восстановить его. То же самое для searchindex.
Ильмари Каронен