Extension:AbuseFilter

This page is a translated version of the page Extension:AbuseFilter and the translation is 89% complete.
此扩展随附于MediaWiki 1.38及更高版本。 因此您无需另外下载。 但是,您仍需遵循此页面提供的其他使用说明。
MediaWiki扩展手册
AbuseFilter
发行状态: 稳定版
实现 用户活动 , 特殊页面 , API
描述 允许特定基于行为的限制应用于wiki活动中。
作者
兼容性政策 快照跟随MediaWiki发布。 master分支不向后兼容。
MediaWiki >= 1.43.0
数据库更改
Composer mediawiki/abuse-filter
abuse_filter
abuse_filter_action
abuse_filter_history
abuse_filter_log
许可协议 GNU通用公眾授權條款2.0或更新版本
下載
  • $wgAbuseFilterConditionLimit
  • $wgAbuseFilterRangeBlockSize
  • $wgAbuseFilterAnonBlockDuration
  • $wgAbuseFilterLogIPMaxAge
  • $wgAbuseFilterCentralDB
  • $wgAbuseFilterDefaultWarningMessage
  • $wgAbuseFilterEmergencyDisableAge
  • $wgAbuseFilterEnableBlockedExternalDomain
  • $wgAbuseFilterActionRestrictions
  • $wgAbuseFilterActions
  • $wgAbuseFilterProtectedVariables
  • $wgAbuseFilterLogIP
  • $wgAbuseFilterPrivateDetailsForceReason
  • $wgAbuseFilterEmergencyDisableCount
  • $wgAbuseFilterLogPrivateDetailsAccess
  • $wgAbuseFilterSlowFilterRuntimeLimit
  • $wgAbuseFilterEmergencyDisableThreshold
  • $wgAbuseFilterLocallyDisabledGlobalActions
  • $wgAbuseFilterBlockDuration
  • $wgAbuseFilterDefaultDisallowMessage
  • $wgAbuseFilterValidGroups
  • $wgAbuseFilterNotificationsPrivate
  • $wgAbuseFilterBlockAutopromoteDuration
  • $wgAbuseFilterIsCentral
  • $wgAbuseFilterNotifications
  • abusefilter-modify
  • abusefilter-log-detail
  • abusefilter-view
  • abusefilter-log
  • abusefilter-privatedetails
  • abusefilter-privatedetails-log
  • abusefilter-modify-restricted
  • abusefilter-revert
  • abusefilter-view-private
  • abusefilter-log-private
  • abusefilter-hidden-log
  • abusefilter-hide-log
  • abusefilter-modify-global
  • abusefilter-modify-blocked-external-domains
  • abusefilter-bypass-blocked-external-domains
  • abusefilter-access-protected-vars
季度下載量 131 (Ranked 41st)
正在使用的公开wiki数 2,939 (Ranked 186th)
前往translatewiki.net翻譯AbuseFilter扩展
問題 开启的任务 · 报告错误

AbuseFilter

2020 Coolest Tool
Award Winner

in the category
Quality


滥用过滤器(AbuseFilter)扩展允许具有权限的用户设置当用户的操作(例如编辑)匹配特定标准时,要进行的特定動作。

例如,可以创建一个过滤器防止匿名用户添加外部链接或封禁移除超过2000个字符的用户。

安裝

  • 下载文件,并将解压后的AbuseFilter文件夹移动到extensions/目录中。
    开发者和代码贡献人员应从Git安装扩展,输入:cd extensions/
    git clone https://gerrit.wikimedia.org/r/mediawiki/extensions/AbuseFilter
  • 只有從git安裝才运行Composer来安装PHP依赖,通过发行composer install --no-dev至扩展目录。 (参见工單T173141了解潜在问题。)
  • 将下列代码放置在您的LocalSettings.php 的底部:
    wfLoadExtension( 'AbuseFilter' );
    
  • 运行更新脚本,它将自动创建此扩展必须依赖的数据库表。
  • 按需求配置。
  •   完成 – 在您的wiki上导航至Special:Version,以验证已成功安装扩展。
Git 安裝時,請注意此擴充套件需要Composer

因此,從 Git 安裝後,變更到包含擴充套件的目錄,例如:"../extensions/AbuseFilter/"並執行 composer install --no-dev,或更新時:composer update --no-dev

另外,最好在 wiki 根目錄的 「composer.local.json」 檔案中加入 "extensions/AbuseFilter/composer.json" 這一行,例如

{
	"extra": {
		"merge-plugin": {
			"include": [
				"extensions/AbuseFilter/composer.json"
			]
		}
	}
}

配置

用户权限

一旦您安装了此扩展,您将需要在"LocalSettings.php"设置用户权限。

AbuseFilter的用户权限
权限 描述 备注 默认拥有此权限的用户组
abusefilter-modify 创建或修改滥用过滤器 需要abusefilter-view权限 sysop
abusefilter-view 查看滥用过滤器 *
abusefilter-log 查看滥用日志 *
abusefilter-log-detail 查看详细滥用日志 需要abusefilter-log权限 sysop
abusefilter-privatedetails 查看滥用日志中的非公开数据 1.34前此权限称为abusefilter-private - 需要abusefilter-log-detail权限
abusefilter-modify-restricted 修改包含受限动作的滥用过滤器 需要abusefilter-modify权限 sysop
abusefilter-modify-global 创建或修改全域滥用过滤器 需要abusefilter-modify权限
abusefilter-revert 撤销指定滥用过滤器作出的所有更改 sysop
abusefilter-view-private 查看被标记为非公开的滥用过滤器 需要abusefilter-view权限 (用户组已有abusefilter-modify权限时不需要) sysop
abusefilter-log-private 查看标记为非公开的滥用过滤器的过滤日志 需要abusefilter-log权限 (用户组已有abusefilter-modifyabusefilter-view-private权限时不需要) sysop
abusefilter-hide-log 将条目在滥用日志中隐藏 需要abusefilter-log权限 suppress
abusefilter-hidden-log 查看隐藏的滥用日志条目 需要abusefilter-log权限 suppress
abusefilter-privatedetails-log 查看滥用过滤器非公开详情访问日志 1.34前此权限称为abusefilter-private-log
abusefilter-modify-blocked-external-domains 创建或修改禁止被链接的外部域名 sysop
abusefilter-bypass-blocked-external-domains 绕过被屏蔽的外部域名 需要edit权限 bot

举个例子,如果按照以下配置的话,管理员能对滥用过滤器做任何设定,而任何人都能查看过滤日志和已公开的过滤器过滤代码:

$wgGroupPermissions['sysop']['abusefilter-modify'] = true;
$wgGroupPermissions['*']['abusefilter-log-detail'] = true;
$wgGroupPermissions['*']['abusefilter-view'] = true;
$wgGroupPermissions['*']['abusefilter-log'] = true;
$wgGroupPermissions['sysop']['abusefilter-privatedetails'] = true;
$wgGroupPermissions['sysop']['abusefilter-modify-restricted'] = true;
$wgGroupPermissions['sysop']['abusefilter-revert'] = true;
如果某过滤器被标记为私用,则拥有abusefilter-modify或abusefilter-view-private权限的用户才能查看该过滤器。

参数

值名 默认值 描述
$wgAbuseFilterActions
[
    'throttle' => true,
    'warn' => true,
    'disallow' => true,
    'blockautopromote' => true,
    'block' => true,
    'rangeblock' => false,
    'degroup' => false,
    'tag' => true
]
滥用过滤器可以进行的動作。 當添加新動作時,確認是否在$wgAbuseFilterActionRestrictions中被限制,若是的話,別忘了將abusefilter-modify-restricted權限加入到適當的用戶組。
$wgAbuseFilterConditionLimit
1000
每次针对更改运行过滤器时可以使用的最大“条件”数。 (更复杂的过滤器需要更多'条件')。
$wgAbuseFilterValidGroups
[
    'default'
]
“组”过滤器列表可以分为。默认情况下,只有一个组。 其他扩展可能会添加其他组。
$wgAbuseFilterEmergencyDisableThreshold
[
    'default' => 0.05
]
如果匹配超过2次编辑,则禁用过滤器,构成在“观察”期间(最多一天)针对过滤器组检查的操作的5%以上,亦或是过去86400秒(一天)内更改了过滤器 。 請參閱緊急限制
$wgAbuseFilterEmergencyDisableCount
[
    'default' => 2
]
$wgAbuseFilterEmergencyDisableAge
[
    'default' => 86400
]
$wgAbuseFilterActionRestrictions
[
	"throttle" => false,
	"warn" => false,
	"disallow" => false,
	"blockautopromote" => true,
	"block" => true,
	"rangeblock" => true,
	"degroup" => true,
	"tag" => false
]
用户必须具有“abusefilter-modify-restricted”用户权限以及“abusefilter-modify”才能创建或修改执行这些動作的过滤器。
$wgAbuseFilterNotifications
false
允许配置扩展以发送触发通知至Special:RecentChanges或UDP。 可用的设置: rc, udp, rcandudp
要将滥用过滤器的更改发送到 Special:RecentChanges,请使用 unset($wgLogRestrictions['abusefilter']);
$wgAbuseFilterNotificationsPrivate
false
允许私有过滤器使用通知功能。
$wgAbuseFilterCentralDB
null
MW 1.41+ 指定全域过滤器的数据库名 需要安装 CentralAuth,否则全局过滤器将在 wikifarm 上失效。
$wgAbuseFilterIsCentral
false
MW 1.41+ 如果wiki為全域过滤器所儲存的数据库時设定为true 需要安装 CentralAuth,否则全局过滤器将在 wikifarm 上失效。
$wgAbuseFilterLocallyDisabledGlobalActions
[
	"throttle" => false,
	"warn" => false,
	"disallow" => false,
	"blockautopromote" => false,
	"block" => false,
	"rangeblock" => false,
	"degroup" => false,
	"tag" => false
]
禁止中央过滤器执行此变量中设置为 true 的操作。
$wgAbuseFilterBlockDuration
'indefinite'
滥用过滤器做出的封禁持续时间。
从1.31.0-wmf.25开始,可以为每个过滤器指定封禁持续时间,并覆盖此变量。 此变量仅在启用封禁时使用,以便预先选择默认持续时间。
$wgAbuseFilterAnonBlockDuration
null
AbuseFilter对未登录的用户所做的封禁的持续时间。如果未设置,则将使用$wgAbuseFilterBlockDuration的值。
从1.31.0-wmf.25开始,可以为每个过滤器指定封禁持续时间,并覆盖此变量。 此变量仅在启用封禁时使用,以便预先选择默认持续时间。
$wgAbuseFilterBlockAutopromoteDuration
5
过滤器阻止用户自动升级的持续时间(以天为单位)。
$wgAbuseFilterDefaultWarningMessage
[
    'default' => 'abusefilter-warning'
]
每个过滤器组的默认警告信息
$wgAbuseFilterDefaultDisallowMessage
[
    'default' => 'abusefilter-disallowed'
]
每个过滤器组的默认禁止消息
$wgAbuseFilterLogIP
true
是否在abuse_filter_log中包含IP
$wgAbuseFilterLogIPMaxAge
3 * 30 * 24 * 3600
清除旧IP日志数据时使用的时长作为截止值。默认为3个月。由维护脚本purgeOldLogIPData.php使用。
$wgAbuseFilterProfileActionsCap
10000
确定何时重置分析统计信息的操作数。
$wgAbuseFilterLogPrivateDetailsAccess
false
是否能夠從被記錄的過濾器日誌項目中存取私人資訊。
$wgAbuseFilterPrivateDetailsForceReason
false
是否強制用戶透過過濾器日誌項目存取私人資訊時需要提供原因。
$wgAbuseFilterSlowFilterRuntimeLimit
500
过滤器被认为较慢之前的运行时间(以毫秒为单位)。
$wgAbuseFilterRangeBlockSize
[
    'IPv4' => '16',
    'IPv6' => '19',
]
'rangeblock' 操作封禁的范围的大小。

緊急限制

防濫用過濾器有個功能是能夠自動節流(停用)過濾器,當過濾器最近編輯過且符合最近操作的數量達到一定門檻時運作。

這麼做是為了防止對過濾器進行有害的編輯,而導致阻止所有用戶對Wiki進行操作。

停用過濾器的條件根據這些變數:

  • $wgAbuseFilterEmergencyDisableThreshold - 觀測期間內匹配數在操作總數中的百分比。
  • $wgAbuseFilterEmergencyDisableCount - 觀察期間內過濾器的匹配數。
  • $wgAbuseFilterEmergencyDisableAge - 進行評估的過濾器年齡。如果過濾器的最後一次編輯時間早於該秒數,則不會對其進行限制,除非它已被限制。

被拦截过滤器的已启用, 高匹配率状态可以在的过滤器列表(Special:AbuseFilter)中查看。 拦截是无声的,我们没有办法看到过滤器何时被拦截。除非安裝了Extension:Echo ,然後通知最後修改篩選器的使用者。

当过滤器被拦截时,它不会执行任何危险的操作(通常限制為特殊權限才能使用的操作,例如封鎖使用者或從使用者群組中移除使用者,由$wgAbuseFilterActionRestrictions控制),并且只允许“安全”操作(可以警告或阻止嘗試的操作之類的)。 拦截过滤器不会自动启用。若要禁用拦截,则需要编辑过滤器设置。 请注意,您实际上需要更改过滤器:从过滤器的注释中更改内容就可以了。

请注意,编辑过滤器将会更新它的历史,如果它再次达到上次编辑后的短时间内被拦截的条件,则会导致它被禁用,如果您的wiki比合法的编辑有更多的滥用,则会导致无法使用的过滤器。

创建和管理过滤器

当安装好本插件,通过滥用管理器管理页Special:AbuseFilter查看过滤日志和创建、修改、测试、删除过滤器。

全域规则 优化过滤器条件限制指南

API

滥用过滤器有两个API的list模块,一个用于获得过滤器列表(“abusefilters”),另一个用于获得过滤日志。过滤日志是独立于其他MediaWiki日志的(日志名为“abuselog”)。不能通过API创建或修改滥用过滤器。

list = abusefilters

列出关于过滤器的信息

参数
  • abfstartid - 从该过滤器ID开始列举
  • abfendid - 列举到该过滤器ID为止
  • abfdir - 列举的方向(older、newer)
  • abfshow - 只显示符合对应属性的过滤器(enabled|!enabled|deleted|!deleted|private|!private)
  • abflimit - 每次列举最大数量
  • abfprop - 欲获取的属性(id|description|pattern|actions|hits|comments|lasteditor|lastedittime|status|private)

如果过滤器是非公开的且您没有查看它的权限,abfprop中某些参数则不会显示。

例子
列出非私有滥用过滤器
结果
{
    "batchcomplete": "",
    "continue": {
        "abfstartid": 18,
        "continue": "-||"
    },
    "query": {
        "abusefilters": [
            {
                "id": 1,
                "hits": 41430
            },
            {
                "id": 3,
                "hits": 957485
            },
            {
                "id": 5,
                "hits": 5931
            },
            {
                "id": 6,
                "hits": 19
            },
            {
                "id": 8,
                "hits": 7
            },
            {
                "id": 9,
                "hits": 41354
            },
            {
                "id": 11,
                "hits": 132971
            },
            {
                "id": 12,
                "hits": 139693
            },
            {
                "id": 14,
                "hits": 63
            },
            {
                "id": 15,
                "hits": 15
            }
        ]
    }
}

list = abuselog

列出过滤器的触发日志。

参数
  • aflstart - 从该时间戳开始列举
  • aflend - 列举到该时间戳为止
  • afldir - 列举的方向(older、newer)
  • afluser - 只显示该用户或IP地址触发过滤器的日志。
  • afltitle - 只显示该页面中触发过滤器的日志。
  • aflfilter - 只显示该过滤器ID的触发日志
  • afllimit - 每次列举最大数量
  • aflprop - 欲获取的属性: (ids|filter|user|ip|title|action|details|result|timestamp|hidden|revid|wiki)
示例
列出其中触发滥用过滤器响应用户“SineBot”的操作的实例
结果
{
    "batchcomplete": "",
    "continue": {
        "aflstart": "2018-03-06T02:34:18Z",
        "continue": "-||"
    },
    "query": {
        "abuselog": [
            {
                "id": 27219261,
                "filter_id": "1073"
            },
            {
                "id": 26938051,
                "filter_id": ""
            },
            {
                "id": 23388942,
                "filter_id": "1"
            },
            {
                "id": 22044912,
                "filter_id": ""
            },
            {
                "id": 22032235,
                "filter_id": ""
            },
            {
                "id": 22032196,
                "filter_id": ""
            },
            {
                "id": 21983882,
                "filter_id": ""
            },
            {
                "id": 20594818,
                "filter_id": "904"
            },
            {
                "id": 20593489,
                "filter_id": "904"
            },
            {
                "id": 20590442,
                "filter_id": "904"
            }
        ]
    }
}

可能的错误

  • 有些用户可能会遇到创建新的过滤器器或修改旧过滤器器失败了,随后用户被重定向到原始页面的情况。 如果Wiki使用的是SSL证书,则此错误可能是由于$wgServer 的值,该值可能使用的是“http://”而不是“https://”。 对此错误的一个提示是,浏览器的Special:AbuseFilter标签页弹出https警告。(Topic:T23dyyih0ofjada5)

整合其他擴充功能

您可以通過多種方式將防濫用過濾器與其他擴展整合。

添加用於過濾的變數

可以添加新的变量用于滥用过滤器。示例列表可用 。要做到这一点,您应该:

  • AbuseFilter-builder 钩子添加一个处理程序。 要添加变量,您应该使用$builder['vars']['variable_name'] = 'i18n-key';,其中variable_name是变量的名称,i18n-key是i18n秘钥的片段。 这整段秘钥应该是abusefilter-edit-builder-vars-{$your_key}
  • 添加您在上一点选择的 i18n 消息。
  • 選擇要計算變數的鉤子處理程式。根據您的使用情況,您可以:
    • Implement the AbuseFilter-generateTitleVars hook; this is specifically thought for page-related variables;
    • Implement the AbuseFilter-generateUserVars hook; this is specifically thought for user-related variables;
    • Implement the AbuseFilter-generateGenericVars hook; this is for variables not bound to a specific page or user;
    • Implement the AbuseFilterAlterVariables hook; this is a bit more flexible than the other hooks, but it has a downside: your variable will not be available when examining past RecentChanges entries. 如果您要實作該功能(建議您這樣做),您應該使用上面列出的其中一個鉤子,並使用它的第三個參數 ($RCRow)。
  • Inside the hook handler, there are two ways to add a variable:
    • The "direct" way is calling $vars->setVar( 'var_name', var_value );. This is ideal only when the value is easy and quick to compute: the value is computed even if no active filter will use it.
    • The "lazy" way is calling $vars->setLazyLoadVar( 'var_name', 'method_name', $params );. Here, 'method_name' is a (unique) identifier that will be used to compute the variable (it's recommended to prefix it with the name of your extension). To register the method, you should add a handler for the AbuseFilter-computeVariable hook; therein, you should check if the $method passed matches your 'method_name', and if so, compute the variable. Lastly, $params is an array of parameters that you'll need to compute the variable; these are passed to the computeVariable hook handler. For an example of this, you can check out CentralAuth's global_user_groups.

新增自訂動作

您可以新增自訂動作處理程式,讓每個篩選器可以執行進一步的動作。 To do that, you choose a name for the action ('my-action' from now on), and then:

  • Create a class named e.g. MyAction, that should extend \MediaWiki\Extension\AbuseFilter\Consequence, which can also implement HookAborterConsequence or ConsequencesDisablerConsequence
  • 新增訂閱者到 AbuseFilterCustomActions 鈎結;訂閱者應該提供鈎結文件中記載的回呼,例如回傳上面建立的類別的實例:
class MyAction extends \MediaWiki\Extension\AbuseFilter\Consequence {
    public function run() {
        throw new \Exception( 'Write me' );
    }
}
public function onAbuseFilterCustomActions( &$actions ) {
    $actions[] = function ( \MediaWiki\Extension\AbuseFilter\Consequence\Parameters $params, array $rawParams ) : MyConsequence {
        return new MyAction( $params, $rawParams );
    };
}

Then you should add the following i18n messages; you can replace 'my_action' with e.g. 'block' to see what the messages are for:

  • 'abusefilter-edit-action-${my_action}'
  • 'abusefilter-action-${my_action}'

添加規則組

您也可以新增額外的規則群組,用來將現有的濫用篩選器分組。 Note that, at the moment, each filter can only be in a single group (T116642). Currently, the only known consumer of this feature is 扩展:结构式讨论 . 要做到這一點,您應該:

  • Append the name of the group to $wgAbuseFilterValidGroups.
  • 加入一些程式碼,讓您的群組執行過濾器。請注意 AbuseFilter 不會自己執行。要做到這一點,您應該建立一個 AbuseFilterRunner 物件,並傳入您的群組的名稱。

參見