Extension:AbuseFilter(滥用过滤器)
发行状态: 稳定版 |
|
|---|---|
| 实现 | 用户活动, 特殊页面, API |
| 描述 | 可針對維基活動設定特定的行為式限制。 |
| 作者 |
|
| 兼容性政策 | 快照跟随MediaWiki发布。 master分支不向后兼容。 |
| 数据库更改 | 是 |
| Composer | mediawiki/abuse-filter |
|
|
|
|
|
|
|
|
| 许可证 | GNU General Public License 2.0 or later |
| 下載 | |
| 前往translatewiki.net翻譯AbuseFilter扩展 | |
| 問題 | 开启的任务 · 报告错误 |
滥用过滤器(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安裝後,請切換到包含擴充功能的目錄(例如:"../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"设置用户权限。
| 权限 | 描述 | 备注 | 默认拥有此权限的用户组 | Versions |
|---|---|---|---|---|
| abusefilter-modify | 创建或修改滥用过滤器 | 需要abusefilter-view权限
|
sysop | 1.19+ |
| abusefilter-view | 查看滥用过滤器 | * | 1.19+ | |
| abusefilter-log | 查看滥用日志 | * | 1.19+ | |
| abusefilter-log-detail | 查看详细滥用日志 | 需要abusefilter-log权限
|
sysop | 1.19+ |
| abusefilter-privatedetails | 查看滥用日志中的非公开数据 | 1.34前此权限称为abusefilter-private - 需要abusefilter-log-detail权限
|
— | 1.19+ |
| abusefilter-modify-restricted | 修改包含受限动作的滥用过滤器 | 需要abusefilter-modify权限
|
sysop | 1.19+ |
| abusefilter-revert | 撤销指定滥用过滤器作出的所有更改 | sysop | 1.19+ | |
| abusefilter-view-private | 查看被标记为非公开的滥用过滤器 | 需要abusefilter-view权限 (用户组已有abusefilter-modify权限时不需要)
|
sysop | 1.19+ |
| abusefilter-hide-log | 将条目在滥用日志中隐藏 | 需要abusefilter-log权限
|
suppress | 1.19+ |
| abusefilter-hidden-log | 查看隐藏的滥用日志条目 | 需要abusefilter-log权限
|
suppress | 1.19+ |
| abusefilter-log-private | 查看标记为非公开的滥用过滤器的过滤日志 | 需要abusefilter-log权限 (用户组已有abusefilter-modify或abusefilter-view-private权限时不需要)
|
sysop | 1.20+ |
| abusefilter-modify-global | 创建或修改全域滥用过滤器 | 需要abusefilter-modify权限
|
— | 1.21+ |
| abusefilter-privatedetails-log | 查看滥用过滤器非公开详情访问日志 | 1.34前此权限称为abusefilter-private-log
|
— | 1.31+ |
| abusefilter-modify-blocked-external-domains | 创建或修改禁止被链接的外部域名 | sysop | 1.41+ | |
| abusefilter-bypass-blocked-external-domains | 绕过被屏蔽的外部域名 | 需要edit权限
|
bot | 1.41+ |
| abusefilter-access-protected-vars | 查看和创建使用受保护变量的过滤器 | sysop | 1.43+ | |
| abusefilter-protected-vars-log | 查看关于访问受保护变量的日志 | sysop | 1.43+ |
举个例子,如果按照以下配置的话,管理员能对滥用过滤器做任何设定,而任何人都能查看过滤日志和已公开的过滤器过滤代码:
$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;
$wgGroupPermissions['sysop']['abusefilter-access-protected-vars'] = true;
$wgGroupPermissions['sysop']['abusefilter-protected-vars-log'] = true;
abusefilter-access-protected-vars权限的用户创建和查看。 只有拥有abusefilter-protected-vars-log权限的用户才能查看与这些过滤器相关的日志。 有关更多信息,参见规则格式。suppressrevision权限的用户可以将过滤器标记为已隐藏。 只有拥有viewsuppressed权限的用户才能查看和修改这些过滤器,并且他们创建的所有滥用日志都会被自动隐藏。
参数
| 值名 | 默认值 | 描述 |
|---|---|---|
$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,请使用
$wgExtensionFunctions[] = static function () { global $wgLogRestrictions; 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' 操作封禁的范围的大小。 |
$wgAbuseFilterProtectedVariables
|
[ "user_unnamed_ip" ]
|
被视为受保护(访问受限)的变量数组,需具备abusefilter-access-protected-vars权限方可使用或查看。
|
緊急限制
防濫用過濾器有個功能是能夠自動節流(停用)過濾器,當過濾器最近編輯過且符合最近操作的數量達到一定門檻時運作。
這麼做是為了防止對過濾器進行有害的編輯,而導致阻止所有用戶對Wiki進行操作。
停用過濾器的條件根據這些變數:
$wgAbuseFilterEmergencyDisableThreshold– 觀測期間內匹配數在操作總數中的百分比。$wgAbuseFilterEmergencyDisableCount– 觀察期間內過濾器的匹配數。$wgAbuseFilterEmergencyDisableAge– 進行評估的過濾器年齡。如果過濾器的最後一次編輯時間早於該秒數,則不會對其進行限制,除非它已被限制。
被拦截过滤器的已启用, 高匹配率状态可以在的过滤器列表(Special:AbuseFilter)中查看。 拦截是无声的,我们没有办法看到过滤器何时被拦截。除非安裝了Extension:Echo,然後通知最後修改篩選器的使用者。
当过滤器被拦截时,它不会执行任何危险的操作(通常限制為特殊權限才能使用的操作,例如封鎖使用者或從使用者群組中移除使用者,由$wgAbuseFilterActionRestrictions控制),并且只允许“安全”操作(可以警告或阻止嘗試的操作之類的)。 拦截过滤器不会自动启用。若要禁用拦截,则需要编辑过滤器设置。 请注意,您实际上需要更改过滤器:从过滤器的注释中更改内容就可以了。
请注意,编辑过滤器将会更新它的历史,如果它再次达到上次编辑后的短时间内被拦截的条件,则会导致它被禁用,如果您的wiki比合法的编辑有更多的滥用,则会导致无法使用的过滤器。
创建和管理过滤器
当安装好本插件,通过滥用管理器管理页Special:AbuseFilter查看过滤日志和创建、修改、测试、删除过滤器。
- 规则格式 – 如何写一段过滤器的基础知识
- 操作
- 访问标识
- 全域规则
- 优化过滤器条件限制指南
- 要从Wikipedia导入过滤器:您需要在安装扩展之后,转到w:Special:AbuseFilter,选择一个过滤器(例如w:Special:AbuseFilter/3),然后单击“导出此过滤器”,复制随后出现的文本,转到目标wiki上的
Special:AbuseFilter/import,粘贴文本。 - m:Small wiki toolkits/Starter kit/AbuseFilter – Metawiki上針對小型Wiki的社區指南
API
滥用过滤器有两个API的list模块,一个用于获得过滤器列表(“abusefilters”),另一个用于获得过滤日志。过滤日志是独立于其他MediaWiki日志的(日志名为“abuselog”)。不能通过API创建或修改滥用过滤器。
list=abusefilters (abf)
列出关于过滤器的信息
- 参数
abfstartid- 从该过滤器ID开始列举abfendid- 列举到该过滤器ID为止abfdir- 列举的方向: older, newerabfshow- 只显示符合对应属性的过滤器: enabled|!enabled|deleted|!deleted|private|!private|protected|!protectedabflimit- 每次列举最大数量abfprop- 欲获取的属性: id|description|pattern|actions|hits|comments|lasteditor|lastedittime|status|private|protected|suppressed
如果过滤器是非公开的且您没有查看它的权限,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 (afl)
列出过滤器的触发日志。
- 参数
afllogid- 列出单个整数日志ID。aflstart- 从该时间戳开始列举aflend- 列举到该时间戳为止afldir- 列举的方向(older、newer)afluser- 只显示该用户或IP地址触发过滤器的日志。afltitle- 只显示该页面中触发过滤器的日志。aflfilter- 只显示该过滤器ID的触发日志afllimit- 每次列举最大数量aflprop- 欲获取的属性: (ids|filter|user|title|action|details|result|timestamp|hidden|revid|wiki)aflprop=wiki只会在中央wiki上被识别。
- 示例
| 结果 |
|---|
{
"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警告。 (Project:Support desk/Flow/2016/04#h-response?-2016-04-14T15:54:00.000Z)
整合其他擴充功能
您可以通過多種方式將防濫用過濾器與其他擴展整合。
添加用於過濾的變數
可以添加新的变量給滥用过滤器使用。 一份範例清單提供。要執行此操作,您應:
- 为AbuseFilter-builder钩子添加一个处理程序。 要添加变量,您应该使用
$builder['vars']['variable_name'] = 'i18n-key';,其中variable_name是变量的名称,i18n-key是i18n秘钥的片段。 这整段秘钥应该是abusefilter-edit-builder-vars-{$your_key}。 - 添加您在上一点选择的 i18n 消息。
- 選擇要計算變數的鉤子處理程式。根據您的使用情況,您可以:
- 实现AbuseFilter-generateTitleVars钩子;这是专门为页面相关变量设计的;
- 实现AbuseFilter-generateUserVars钩子;这是专门为用户相关变量设计的;
- 实现AbuseFilter-generateGenericVars钩子;这是为未归类为特定页面或用户的变量而设计的;
- 实现AbuseFilterAlterVariables钩子;它比其他钩子更灵活一些,但有一个缺点,即在检查过去的RecentChanges条目时,您的变量将不可用。 如果您要實作該功能(建議您這樣做),您應該使用上面列出的其中一個鉤子,並使用它的第三個參數 (
$RCRow)。
- 在钩子处理程序中,有两种方法可以添加变量:
- “直接”方法是调用
$vars->setVar( 'var_name', var_value );。这仅在值易于快速计算时才是理想的:即使没有活动的过滤器会使用该值,也会计算该值。 - “偷懒”的方法是调用
$vars->setLazyLoadVar( 'var_name', 'method_name', $params );。 此处的“method_name”是一个(唯一的)标识符,将用于计算变量(建议在其前面加上扩展的名称)。 要注册此方法,您应为AbuseFilter-computeVariable钩子添加一个处理程序;在其中,您应该检查传递的$method是否与您的“method_name”匹配,如果匹配,则计算该变量。 最后,$params是一个参数数组,用于计算变量;这些参数将传递给computeVariable钩子处理程序。 例如,您可以查看CentralAuth的global_user_groups。
- “直接”方法是调用
新增自訂動作
您可以新增自訂動作處理程式,讓每個篩選器可以執行進一步的動作。 为此,您需要为该操作选择一个名称(以下均用“my-action”),然后:
- 创建一个名为MyAction的类,该类应继承自\MediaWiki\Extension\AbuseFilter\Consequence,并且\MediaWiki\Extension\AbuseFilter\Consequence还可以实现HookAborterConsequence或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 );
};
}
然后,您应该添加以下i18n消息;您可以将“my_action”替换为例如“block”来查看这些消息的用途:
'abusefilter-edit-action-${my_action}''abusefilter-action-${my_action}'
添加規則組
您也可以新增額外的規則群組,用來將現有的濫用篩選器分組。 请注意,目前每个过滤器只能属于一个组(T116642)。 目前已知使用该功能的唯一用户是扩展:结构式讨论。 要做到這一點,您應該:
- 将组的名称添加到
$wgAbuseFilterValidGroups中。 - 加入一些程式碼,讓您的群組執行過濾器。請注意 AbuseFilter 不會自己執行。要做到這一點,您應該建立一個
AbuseFilterRunner物件,並傳入您的群組的名稱。
參見
- Help:BlockedExternalDomains
- 多个启用此擴展的WMF維基(以及使用的配置)
| 此扩展用于一个或多个维基媒体项目。 这可能意味着扩展足够稳定、运作足够良好,可以用在这样的高流量的网站上。 请在维基媒体的CommonSettings.php和InitialiseSettings.php配置文件中查找此扩展的名称以查看哪些网站安装了该扩展。 特定wiki上的已安装的扩展的完整列表位于Special:Version页面。 |
| 此扩展在以下wiki农场/托管网站和/或软件包中提供: |
- Stable extensions/zh
- User activity extensions/zh
- Special page extensions/zh
- API extensions/zh
- Extensions supporting Composer/zh
- ChangeTagsListActive extensions/zh
- CheckUserInsertChangesRow extensions/zh
- CheckUserInsertLogEventRow extensions/zh
- CheckUserInsertPrivateEventRow extensions/zh
- ContributionsToolLinks extensions/zh
- EditFilterMergedContent extensions/zh
- GetAutoPromoteGroups extensions/zh
- HistoryPageToolLinks extensions/zh
- HtmlPageLinkRendererEnd extensions/zh
- JsonValidateSave extensions/zh
- ListDefinedTags extensions/zh
- LoadExtensionSchemaUpdates extensions/zh
- PageDelete extensions/zh
- ParserOutputStashForEdit extensions/zh
- RecentChange save extensions/zh
- ResourceLoaderRegisterModules extensions/zh
- TitleMove extensions/zh
- UndeletePageToolLinks extensions/zh
- UploadStashFile extensions/zh
- UploadVerifyUpload extensions/zh
- UserMergeAccountFields extensions/zh
- GetUserPermissionsErrors extensions/zh
- GPL licensed extensions/zh
- Extensions in Wikimedia version control/zh
- All extensions/zh
- Pages using deprecated NoteTA template
- Extensions bundled with MediaWiki 1.38/zh
- Extensions requiring Composer with git/zh
- Extensions used on Wikimedia/zh
- Extensions included in Canasta/zh
- Extensions available as Debian packages/zh
- Extensions included in Fandom/zh
- Extensions included in Miraheze/zh
- Extensions included in MyWikis/zh
- Extensions included in ProWiki/zh
- Extensions included in ShoutWiki/zh
- Extensions included in Telepedia/zh
- Extensions included in Weird Gloop/zh
- Extensions included in wiki.gg/zh
- Spam management extensions/zh
