2部分问题;
是否可以删除所有孤立页面?
我可以说回滚不是由特定用户(我)做出的所有修订吗?
#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,并访问了每个表,并删除了不是真实用户创建的条目。我在externallinks
,page
,searchindex
,user
,watchlist
中发现了垃圾邮件。这相当省时。我大部分时间都在等待删除查询运行。我很幸运,因为大多数真实的编辑都是按事物的顺序进行的。评论
试图从externallinks删除垃圾邮件链接没有任何意义,因为那是一个冗余的元数据表,基本上只用于Special:LinkSearch;清理完实际页面后,只需运行rebuildall.php即可擦除并重建它。同上搜索索引。
–伊尔马里·卡洛宁(Ilmari Karonen)
2014年1月10日在3:08
评论
mediawiki.org/wiki/Manual:Combating_vandalism和mediawiki.org/wiki/Manual:Combating_spam是规范资料,但仍在开展更多工作:phabricator.wikimedia.org/T90238我的mediawiki网站不再存在该问题。如果您仍然有此问题,请回复我的评论,我可以在实时直播中向您展示如何解决这些问题。