基本上,我的“私有” mediawiki实例与蹒跚学步的储蓄罐一样安全。我现在已经把它收紧了,但是剩下了大约一百个由数百个随机生成的用户生成的新页面和修订。
2部分问题;有没有办法删除所有孤立页面?我可以说回滚不是由特定用户(我)做出的所有修订吗?
基本上,我的“私有” mediawiki实例与蹒跚学步的储蓄罐一样安全。我现在已经把它收紧了,但是剩下了大约一百个由数百个随机生成的用户生成的新页面和修订。
2部分问题;有没有办法删除所有孤立页面?我可以说回滚不是由特定用户(我)做出的所有修订吗?
Answers:
如果您不想使用danlefree建议的export-and-reinstall方法,您可能还会发现Nuke扩展很有用。安装后,以管理员身份访问特殊页面Special:Nuke,将为您提供如下表格:
还有一些内置的MediaWiki 维护脚本可能会有用,包括:
cleanupSpam.php,可用于回滚和/或删除包含指向特定主机名的链接的所有修订,
deleteBatch.php,可用于删除文件中列出的所有页面,以及
rollbackEdits.php(当前似乎没有适当的wiki文档),可用于回滚指定用户的所有编辑。
也可以通过直接操作数据库来执行所需的操作。具体细节可能会因您的具体情况而有所不同,但是基本步骤如下:
将您的Wiki设置为只读模式。您不希望有人在弄乱数据库的同时尝试编辑Wiki。
备份您的Wiki。(强烈建议在进行任何不可逆的大量删除之前使用此方法。)
删除垃圾邮件发送者创建的所有用户帐户。如果按照上述问题,您是唯一的有效用户,则可以执行以下操作:
DELETE FROM user WHERE user_id != YOUR_USER_ID;
或者,如果在垃圾邮件发送者发现Wiki之后没有创建新的有效帐户,则可以找到最高的有效用户ID号并执行以下操作:
DELETE FROM user WHERE user_id > LAST_VALID_USER_ID;
或者,您可以使用phpMyAdmin之类的管理工具来手动挑选有效帐户并删除其余帐户。
清理与已删除帐户关联的额外数据。这不是绝对必要的,但是那些孤立的记录没有用,如果不删除它们,只会使数据库混乱:
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);
删除有效用户未进行的任何修订:
这是重要的一步;准备之前的一切,清理之后的一切。删除所有垃圾邮件帐户后,您可以执行以下操作:
DELETE FROM revision WHERE rev_user > 0 AND rev_user NOT IN (SELECT user_id FROM user);
如果您的Wiki禁用了匿名编辑功能(我强烈建议对私有Wiki或测试Wiki进行匿名编辑),那么上面的查询应足以消除所有垃圾邮件修订版。但是,如果您启用了匿名编辑功能,则必须分别删除匿名垃圾邮件。
如果您确定Wiki上所有匿名编辑都是垃圾邮件,那么我们可能需要保留的UID 0所做的唯一编辑就是MediaWiki本身所做的那些编辑(例如从Wiki外部导入的页面)。在这种情况下,应执行以下查询:
DELETE FROM revision WHERE rev_user = 0 AND rev_user_text BETWEEN '1' AND '999';
这将删除UID 0的所有修订,其中用户名看起来(似乎)像IPv4地址;即以1到9之间的数字开头。
如果您的Wiki进行了一些实际的合法的匿名编辑,则可能需要更多的创意。如果合法的未注册编辑者使用的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地址中的所有编辑。
上面的查询将摆脱垃圾邮件修订版(尽管它们的内容仍保留在text
表中),但是将使page_latest
所有受影响页面的字段指向不存在的修订版。这可能会引起混乱,因此我们最好对其进行修复。
首先,我们需要清除page_latest
所有页面的列:
UPDATE page SET page_latest = 0;
接下来,我们将通过运行attachLatest.php维护脚本(推荐;请记住使用该--fix
参数,以便该脚本实际更改数据库)或使用手动SQL查询来重建该列:
UPDATE page SET page_latest =
(SELECT MAX(rev_id) FROM revision WHERE rev_page = page_id);
最后,我们将删除所有找不到有效修订的页面(因为它们是垃圾邮件发送者创建的,并且从未包含任何有效内容):
DELETE FROM page WHERE page_latest = 0;
最后,通过运行rebuildall.php维护脚本来重建链接,文本索引和最新更改表。您可能还希望通过运行purgeOldText.php维护脚本从数据库中删除已删除的垃圾邮件修订版的内容,以使它们不会在其中占用不必要的空间。
完成所有步骤后,请检查一切是否正常,如果是,则关闭只读模式-希望在安装了一些反垃圾邮件功能之后,可以防止问题再次发生。
对于小型Wiki,我强烈建议您使用QuestyCaptcha扩展程序,该扩展程序可让您配置基于文本的简单自定义验证码。诀窍在于,每个Wiki都有自己的问题集,对垃圾邮件程序进行编程以正确回答它们将耗费大量精力。在被XRumer击中几次后,我将其安装在自己的Wiki上,此后再也没有看到垃圾邮件。
附言 我使用这些说明来核对由小型Wiki的同样多的用户创建的大约35,000个垃圾邮件修订。一切都很好。在这种情况下,Wiki(幸运的是!)不允许匿名编辑,并且几乎所有合法用户都是在垃圾邮件发送者找到Wiki之前创建的,因此我可以很容易地先删除所有垃圾邮件帐户,然后删除所有修订版本。他们创建的。(起初我确实无意中删除了一个合法帐户,所以我不得不从备份中还原并更仔细地重做该过程。)我更新了上面的说明,以更好地反映出我实际上所做的事情,并且更加通用了。 。
rebuildall.php
不在维护中:O否则,谢谢您
处理这种情况的最简单方法(如果您不介意nuke'n'pave)将是导出由您的用户名创建或编辑的所有Wiki页面,重新安装Wiki,然后导入您生成的导出文件。
在这种情况下,“重新安装”表示:
LocalSettings.php
文件复制到安全位置/config/
目录/config/
目录并将旧LocalSettings.php
文件移回MW根目录编辑:如果您在此过程中遇到任何问题,或者想尝试使用其他方法清除垃圾邮件,则可能需要下拉数据库备份(包括垃圾邮件修订版)。
解决这种情况的最简单方法是安装扩展DeleteBatch。使用Wiki上的Special:AllPages获取要删除的页面名称的脚本文件,并将其加载到Special:DeleteBatch中。
如果只有一百个垃圾页面,那么您做得还不错。我必须清理一个包含成千上万个垃圾邮件页面的Wiki。我在此页面上遇到了User:Halz的一些很好的技巧:https ://www.mediawiki.org/wiki/User:Halz/Mass_despamming,其中包括各种工具的局限性细目。
在底部,他提供了一个有用的SQL查询,该查询运行缓慢,但可以帮助您找到最有可能是垃圾邮件的页面,尤其是当您可以确定Wiki被垃圾邮件发送者接管的时间段时。Halz还拥有一个可扩展的版本:Extension:Nuke,该版本提供了这类可查询的参数,可轻松进行批量删除。他给了我一个副本供使用,但我认为他没有出版。
我接管了一个安装,发现user
表格中有47,000多个垃圾邮件条目,几乎有900,000垃圾邮件条目externallinks
。我使用了Sequel Pro,并访问了每个表,并删除了不是真实用户创建的条目。我发现垃圾邮件externallinks
,page
,searchindex
,user
,watchlist
。这相当省时。我大部分时间都在等待删除查询运行。我很幸运,因为大多数真实的编辑都是按事物的顺序进行的。
externallinks
,因为那是一个冗余的元数据表,该表基本上只用于Special:LinkSearch; 清理完实际的页面后,您可以运行rebuildall.php
以擦除并重建它。同上searchindex
。