基本上,我的“私有” mediawiki实例与蹒跚学步的储蓄罐一样安全。我现在已经将其收紧了,但是剩下了大约一百个由数百个随机生成的用户生成的新页面和修订。

2部分问题;
是否可以删除所有孤立页面?
我可以说回滚不是由特定用户(我)做出的所有修订吗?

评论

mediawiki.org/wiki/Manual:Combating_vandalism和mediawiki.org/wiki/Manual:Combating_spam是规范资料,但仍在开展更多工作:phabricator.wikimedia.org/T90238

我的mediawiki网站不再存在该问题。如果您仍然有此问题,请回复我的评论,我可以在实时直播中向您展示如何解决这些问题。

#1 楼

如果您不想使用danlefree建议的导出并重新安装方法,则可能还会发现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上所有匿名编辑都是垃圾邮件,则唯一由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;
参数来重建该列)。sqlpretty-override“> --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之前创建的,因此我可以很容易地先删除所有垃圾邮件帐户,然后删除所有修订版本。他们创造的。 (我一开始确实无意中删除了一个合法帐户,所以我不得不从备份中还原并更仔细地重做该过程。)我已经更新了上面的说明,以更好地反映出我实际上所做的事情,并且更加通用了。 。

评论


这个问题已经有几年历史了,它在一个已经累积了100,000个垃圾邮件机器人的小型Wiki上似乎还算不错。从那以后发生了变化。可能还有其他步骤吗?

– Ant6n
16年7月31日在19:00

这里有新闻吗?这些是当今的“最佳实践”和“最佳工具”吗?

– Peter Krauss
17年2月15日在13:37

rebuildall.php不在维护中:O否则,谢谢

–杰米·赫特伯(Jamie Hutber)
19 Mar 7 '19 at 23:43

#2 楼

处理这种情况的最简单方法(如果您不介意nuke'n'pave)将是导出由您的用户名创建或编辑的所有Wiki页面,重新安装Wiki,然后导入您生成的导出文件。 br />
在此上下文中的“重新安装”表示:


导出由您创建的文章(大概以WikiSysop用户或类似用户身份登录)
MW数据库
创建空的MW数据库
LocalSettings.php文件复制到安全位置
重新上传/config/目录
在新的MW数据库上运行安装过程(请注意,将要重新创建旧的管理员用户)
删除/config/目录,并将旧的LocalSettings.php文件移回MW根目录
导入在步骤#1创建的文件

编辑:如果您在此过程中遇到任何问题,或者想尝试使用其他方法清除垃圾邮件,则可能需要下拉数据库备份(包括垃圾邮件修订版)。

#3 楼

从理论上讲,您可以编写一个MediaWiki扩展来对MediaWiki实例做任何您想做的事情,包括完成您提到的事情。由danlefree建议,您可能会发现“用户合并和删除”扩展名很有用:您可以使用它将多个spambot帐户合并为一个帐户,然后可以更轻松地处理其修改。

#4 楼

处理这种情况的最简单方法是安装扩展DeleteBatch。使用Wiki上的Special:AllPages获取要删除的页面名称的脚本文件,并将其加载到Special:DeleteBatch中。

#5 楼

如果只有一百个垃圾页面,那您做得还不错。我不得不清理一个包含成千上万个垃圾邮件页面的Wiki。我在此页面上遇到了User:Halz的一些不错的技巧:https://www.mediawiki.org/wiki/User:Halz/Mass_despamming,其中包括各种工具的局限性的细分。

在底部,他提供了一个有用的SQL查询,该查询运行缓慢,但可以帮助您查找最可能是垃圾邮件的页面,尤其是当您可以确定垃圾邮件发送者接管Wiki的时间段时。 Halz也有一个扩展版的Extension:Nuke,它提供了这类可查询的参数,可轻松进行批量删除。他给了我一个副本供使用,但我认为他没有出版它。

#6 楼

我强烈建议不要弄乱MediaWiki的SQL! MediaWiki是一个复杂的野兽,非常适合Wikipedia。 SQL中发生了一些奇怪的事情,如果仅删除行,可能会失去一致性。

如果您具有一些编程技能,请使用API​​。 Pywikibot是一个不错的选择。

否则,请检查maintenance/目录中的工具。您可以尝试使用我自己的工具,例如mewsh来帮助解决问题(我刚刚在其中添加了“反垃圾邮件工具”)。

#7 楼

我接管了一个安装,然后在user表中找到了47,000个垃圾邮件条目,并在externallinks中找到了将近900,000个垃圾邮件条目。我使用了Sequel Pro,并访问了每个表,并删除了不是真实用户创建的条目。我在externallinkspagesearchindexuserwatchlist中发现了垃圾邮件。这相当省时。我大部分时间都在等待删除查询运行。我很幸运,因为大多数真实的编辑都是按事物的顺序进行的。

评论


试图从externallinks删除垃圾邮件链接没有任何意义,因为那是一个冗余的元数据表,基本上只用于Special:LinkSearch;清理完实际页面后,只需运行rebuildall.php即可擦除并重建它。同上搜索索引。

–伊尔马里·卡洛宁(Ilmari Karonen)
2014年1月10日在3:08