Extension:ConfirmEdit - MediaWiki
Jump to content
From mediawiki.org
Translate this page
Languages:
Türkçe
català
italiano
polski
português
sicilianu
čeština
русский
العربية
中文
MediaWiki extensions manual
ConfirmEdit
Release status:
stable
Implementation
Page action
Description
Adds CAPTCHAs for page saves and other user actions
Author(s)
Brooke Vibber
Florian Schmidt
Sam Reed
Latest version
1.6.0 (Continuous updates)
Compatibility policy
Snapshots releases along with MediaWiki. Master is not backward compatible.
Parameters
$wgCaptchaBadLoginPerUserAttempts
$wgConfirmEditLoadedCaptchas
$wgCaptchaRegexes
$wgCaptchaBypassIPs
$wgHCaptchaDeveloperMode
$wgHCaptchaUseRiskScore
$wgHCaptchaProxy
$wgHCaptchaSiteKey
$wgCaptchaTriggersOnNamespace
$wgHCaptchaApiUrlIntegrityHash
$wgHCaptchaVerifyUrl
$wgHCaptchaEnterpriseHealthCheckApiUrlRetryCount
$wgHCaptchaApiUrl
$wgCaptchaBadLoginAttempts
$wgHCaptchaEnabledInMobileFrontend
$wgCaptchaStorageClass
$wgCaptchaSessionExpiration
$wgHCaptchaEnterpriseHealthCheckSiteVerifyErrorThreshold
$wgHCaptchaSecureEnclave
$wgHCaptchaSendRemoteIP
$wgCaptchaTriggers
$wgHCaptchaInvisibleMode
$wgHCaptchaEnterpriseHealthCheckApiUrlErrorThreshold
$wgConfirmEditEnabledAbuseFilterCustomActions
$wgCaptchaBadLoginPerUserExpiration
$wgCaptchaAbuseFilterCaptchaConsequenceTTL
$wgHCaptchaEnterpriseHealthCheckApiUrlRetryDelayMs
$wgCaptchaBadLoginExpiration
$wgHCaptchaSecretKey
$wgCaptchaClass
$wgHCaptchaEnterpriseHealthCheckFailoverDuration
$wgHCaptchaEnterprise
$wgHCaptchaCSPRules
$wgHCaptchaVisualEditorOnLoadIntegrationEnabled
$wgCaptchaIgnoredUrls
Added rights
skipcaptcha
Hooks used
APIGetAllowedParams
AbuseFilterCustomActions
AlternateEditPreview
AuthChangeFormFields
EditFilterMergedContent
EditPage::showEditForm:fields
EditPageBeforeEditButtons
EmailUser
EmailUserForm
MakeGlobalVariablesScript
PageSaveComplete
ResourceLoaderRegisterModules
TitleReadWhitelist
Licence
GNU General Public License 2.0 or later
Download extension
Git
Browse repository
GitHub
Gerrit code review
Git commit log
Download source tarball
Translate the ConfirmEdit extension
if it is available at translatewiki.net
Vagrant role
confirmedit
Issues
Open tasks
Report a bug
The
ConfirmEdit
extension lets you use various
CAPTCHA
techniques to try to prevent
spambots
and other automated tools from editing your wiki, as well as to foil automated login attempts that try to guess passwords.
ConfirmEdit ships with several techniques/modules to generate a captcha.
Module
Description
Effectiveness at stopping spam
SimpleCaptcha
Users have to solve a
simple
math problem.
Low
FancyCaptcha
Users have to identify a series of characters displayed in a stylized way.
Low
QuestyCaptcha
Users have to answer a question out of a series of questions defined by the administrator(s).
Very high, until cracked
ReCaptchaNoCaptcha
Users are presented with a JavaScript-based check of humanity. If the check is failed, a puzzle is presented.
Medium to low
hCaptcha
Similar to reCAPTCHA, but is arguably more effective than reCAPTCHA because of its
different approach to accessibility-friendly captchas
Low
Turnstile
Cloudflare
Turnstile
. Human actionless (or click the box) bot detector.
Proof of work
based.
Very high
Some of these modules require additional setup work:
FancyCaptcha requires running a preliminary setup script in Python.
Drawbacks
CAPTCHAs reduce accessibility and cause inconvenience to human users.
They also are not 100% effective against bots, and they will not protect your wiki from spammers who are willing and able to use human labor to get through the CAPTCHAs.
You may wish to use ConfirmEdit in conjunction with other
anti-spam features
Regardless of the solution you use, if you have a publicly-editable wiki, it's important to keep monitoring the "Recent changes" page.
Installation
This extension
comes with MediaWiki 1.18
and later, so you do not need to download it. The remaining configuration instructions must still be followed.
ConfirmEdit may not work if used with a MediaWiki version different from the one specified when downloading via the "Extension distributor".
and move the extracted
ConfirmEdit
folder to your
extensions/
directory.
Developers and code contributors should install the extension
from Git
instead, using:
cd
extensions/
git
clone
Add the following code at the bottom of your
LocalSettings.php
file:
wfLoadExtension
'ConfirmEdit'
);
Explicitly
enable the CAPTCHA type
(setting
$wgCaptchaClass
) which should be used
Configure
as needed
Done
– Navigate to
Special:Version
on your wiki to verify that the extension is successfully installed.
Vagrant installation:
If using
Vagrant
, install with
vagrant roles enable confirmedit --provision
CAPTCHA types
There are numerous different CAPTCHA types included with ConfirmEdit. Note that
MathCaptcha
was removed in 2024 (
change 1015991
).
QuestyCaptcha
This module presents a question, and the user supplies the answer.
You provide the questions in the configuration.
This module has proven to offer a strong mechanism against spambots; it should also have the advantage of better
, as textual questions can be read by text-to-speech software allowing visually impaired users (but not bots) to answer correctly.
Add the following to
LocalSettings.php
to enable this CAPTCHA, editing the Q&A:
wfLoadExtensions
([
'ConfirmEdit'
'ConfirmEdit/QuestyCaptcha'
]);
$wgCaptchaClass
'QuestyCaptcha'
// Add your questions in LocalSettings.php using this format:
$wgCaptchaQuestions
'What is the capital of France?'
=>
'Paris'
'What is the capital of Spain'
=>
'MADRID'
// Answers are case insensitive
'What is the name of this wiki?'
=>
$wgSitename
// You can use variables
'How many fingers does a hand have?'
=>
'five'
],
// A question may have many answers
];
It will randomly choose a question from those supplied.
The minimum is one.
QuestyCaptcha is case-insensitive. If the answer is "Paris" and the user writes "paris", or if the answer is "paris" and the user writes "Paris", it will still work.
If the answer has a special character like "ó", you may write an answer with "ó" and another with "o" (where "o" replaces "ó"), just in case. For example, if the answer is "canción" you can use
[ 'cancion', 'canción' ]
in case the user writes "cancion".
The answer must be easy to guess for a human interested in your wiki, but not by an automatic program. Ideally, it should not be contained in the text of the question; you can try and edit the captcha help messages and provide the solution to the captcha response there.
Change the questions when/if they start proving ineffective; this may never happen if your wiki is not specifically targeted.
Don't ever reuse questions already used by you or others in the past: spambots are known to remember a question and its answer forever once they break it.
You can even
dynamically generate questy captchas
in the configuration.
DO NOT
use an exact copy of the dynamic questions from the link. Spammers have cracked them. However, other dynamic questions are highly effective in the style of the questions presented.
There is a separate extension to ConfirmEdit called
QuestyCaptchaEditor
which provides an on-wiki special page for managing QuestyCaptcha question+answer(s) pairings. You may wish to consider installing it if it's desirable to reduce sysadmin intervention when it comes to managing the CAPTCHA questions and their answers.
ReCaptcha (NoCaptcha)
Warning:
ReCaptcha has been cracked by most spambots targeting wikis, mainly due to its accessible captcha alternative.
The new generation of ReCaptcha, called
NoCaptcha
, was introduced by Google back in December 2014 and reduces the need for humans to solve a CAPTCHA.
Based on a user-side JavaScript (which can't be
controlled
by the user, the administrator), reCaptcha tries to identify the site user as a human by analyzing their browsing behavior on the page.
The user then has to click an "I'm not a robot" checkbox and (in the best case) doesn't have to do anything further to prove they're a human.
In some cases, the user still has to solve a CAPTCHA image.
ReCaptcha will not work with the Mobile Source Editor and some extensions.
This module implements the new ReCaptcha NoCaptcha solution in ConfirmEdit.
You still need a public and a secret key (which you can retrieve from the
ReCaptcha admin panel
– change v2, v3 not work) and install the plugin with:
wfLoadExtensions
([
'ConfirmEdit'
'ConfirmEdit/ReCaptchaNoCaptcha'
]);
$wgCaptchaClass
'ReCaptchaNoCaptcha'
$wgReCaptchaSiteKey
'your public/site key here'
$wgReCaptchaSecretKey
'your private key here'
There is an additional configuration option for this module,
$wgReCaptchaSendRemoteIP
(default:
false
), which, if set to
true
, sends the IP address of the current user to a server from Google while verifying the CAPTCHA.
You can improve the privacy for your users if you keep this set to
false
However
, remember that this module adds a client-side JavaScript code, directly loaded from a server from Google, which already can collect the IP address of the user (combined with other data, too) and can
not
be limited by a configuration option.
This will only work on the standard MediaWiki editor.
reCAPTCHA v3
Currently, there is no official way to implement version 3 of Google reCAPTCHA.
SimpleCaptcha (calculation)
Warning:
This type is used by very few wikis, if any, probably because of scarce effectiveness.
A simple math question
This is the default CAPTCHA.
This module provides a simple addition or subtraction question for the user.
Add the following lines to
LocalSettings.php
in the root of your MediaWiki to enable this CAPTCHA:
wfLoadExtension
'ConfirmEdit'
);
$wgCaptchaClass
'SimpleCaptcha'
Note that the display of a trivial maths problem as plaintext yields a captcha which can be trivially solved by automated means; as of 2012, sites using SimpleCaptcha are receiving significant amounts of spam and many automated registrations of spurious new accounts.
Wikis currently using this as the default should therefore migrate to one of the other CAPTCHAs.
FancyCaptcha
Warning:
This type is used by very few wikis outside WMF, if any, probably because of scarce effectiveness.
This module displays a stylized image of a set of characters.
Pillow
must be installed to create the set of images initially, but isn't needed after that (can be installed with
pip install Pillow
in most environments).
Add the following lines to
LocalSettings.php
in the root of your MediaWiki installation:
wfLoadExtensions([ 'ConfirmEdit', 'ConfirmEdit/FancyCaptcha' ]);
$wgCaptchaClass = 'FancyCaptcha';
In
LocalSettings.php
, set the variable
$wgCaptchaDirectory
to the directory where you will store Captcha images.
Note:
use the absolute directory path or relative to your wiki's installation directory Below it set
$wgCaptchaSecret
to your passphrase.
Create the images by running the following:
python /path/to/captcha.py --font= --wordlist= --key= --output= --count=
where
font
is a path to some font, for instance AriBlk.TTF.
wordlist
is a path to some word list, for instance
/usr/share/dict/words
. (Note: on Debian/Ubuntu, the 'wbritish' and 'wamerican' packages provide such lists. On Fedora, use the 'words' package)
key
is the exact passphrase you set
$wgCaptchaSecret
to. Use quotes if necessary.
output
is the path to where the images should be stored (defined in
$wgCaptchaDirectory
).
count
is how many images to generate.
An example, assuming you're in the
extensions/ConfirmEdit
directory (font location from Ubuntu 6.06, probably different on other operating systems):
python captcha.py --font=/usr/share/fonts/truetype/freefont/FreeSans.ttf --wordlist=/usr/share/dict/words --key=FOO --output=../../../captcha --count=100
If you are not satisfied with the results of the words you've generated, you can remove the images and create a new set. Comic_Sans_MS_Bold.ttf seems to generate relatively legible words, and you could also edit the last line of captcha.py to increase the font size from the default of 40.
Put the images you get into
captcha
directory in your installation.
Edit your wiki's
LocalSettings.php
: specify the full path to your captcha directory in
$wgCaptchaDirectory
and secret key you've been using while generating captures in
$wgCaptchaSecret
$wgCaptchaDirectory
"/.php-data/my-wiki.org/wiki/captcha"
$wgCaptchaDirectoryLevels
// Set this to a value greater than zero to break the images into subdirectories
$wgCaptchaSecret
"FOO"
// Same value you used in --key option in captcha.py
See also
wikitech:Generating CAPTCHAs
for how the Wikimedia Foundation does it.
How to avoid common problems running Python on Windows
Install the most recent version of
Pillow
Make the installation of Python on a short folder name, like
C:\Python\
Create a folder like
C:\Ex
and place files
CAPTCHA.py / FONT.ttf / LIST.txt
into the folder.
To execute easily, run the following example as a
batch
file:
C:\python\python.exe C:\Ex\CAPTCHA.py --font C:\Ex\FONT.ttf --wordlist C:\Ex\LIST.txt --key=YOURPASSWORD --output C:\Ex\ --count=20
MathCaptcha
MediaWiki version:
1.39
Warning:
This type is used by very few wikis, if any, probably because of scarce effectiveness.
This requires the
Math
extension to be installed. Also, since this requires the PNG mode of the Math extension, it no longer works since MediaWiki 1.40.
This module generates an image using TeX to ask a basic math question.
Set the following to enable this CAPTCHA:
wfLoadExtensions
([
'ConfirmEdit'
'ConfirmEdit/MathCaptcha'
]);
See the
README
file in the math folder to install this captcha.
hCaptcha
MediaWiki version:
1.35
See
The configuration is similar to ReCaptcha:
wfLoadExtensions
([
'ConfirmEdit'
'ConfirmEdit/hCaptcha'
]);
$wgCaptchaClass
MediaWiki\Extension\ConfirmEdit\hCaptcha\HCaptcha
::
class
$wgHCaptchaSiteKey
'your public/site key here'
$wgHCaptchaSecretKey
'your private key here'
Other configuration is available, depending on requirements of the setup of the wiki.
Configuration
hCaptcha brings in various configuration variables, some of which are considered
enterprise features
You will be required to create an account with hCaptcha to use this extension.
Configuration Flag
Default Value
Description
$wgHCaptchaProxy
false
Proxy to use for outbound PHP web requests to hCaptcha servers (HCaptchaVerifyUrl)
$wgHCaptchaSiteKey
""
Sitekey from hCaptcha (requires creating an account)
$wgHCaptchaSecretKey
""
Secret key from hCaptcha (requires creating an account)
$wgHCaptchaSendRemoteIP
false
Whether to send the client's IP address to hCaptcha
$wgHCaptchaApiUrl
Url that the hCaptcha JS is loaded from; may want to use
for Chinese visitors
$wgHCaptchaVerifyUrl
Url that the hCaptcha requested is verified against; may want to use
if server is in China
$wgHCaptchaEnterprise
false
Whether the provided sitekey is for hCaptcha Enterprise features. See
$wgHCaptchaInvisibleMode
false
Enable this to make the hCaptcha checkbox invisible and only show a challenge if hCaptcha determines it is needed. This forces the inclusion of a message with the hCaptcha Privacy Policy and Terms of Service
$wgHCaptchaCSPRules
[ "
", "
" ]
Urls to add to the Content Security Policies (CSP) for hcaptcha.com and *.hcaptcha.com to a page when loading a hCaptcha
$wgHCaptchaSecureEnclave
false
Whether to use hCaptcha's Secure Enclave mode. If enabled, then $wgHCaptchaEnterprise must be true (because it is an Enterprise feature). You will need to modify $wgHCaptchaApiUrl as appropriate, such as to use
and make rendering explicit – See
$wgHCaptchaDeveloperMode
false
Whether to place hCaptcha integration in developer mode. When in developer mode, potentially sensitive information is logged to debug logs.
Do not
enable on production wikis.
$wgHCaptchaUseRiskScore
false
Whether to use captcha risk signal. Unless specifically enabled or in developer mode, we do not want that sensitive information to be stored.
Turnstile
MediaWiki version:
1.42
The configuration is similar to
#ReCaptcha
or
#hCaptcha
wfLoadExtensions
([
'ConfirmEdit'
'ConfirmEdit/Turnstile'
]);
$wgCaptchaClass
MediaWiki\Extension\ConfirmEdit\Turnstile\Turnstile
::
class
$wgTurnstileSiteKey
'your public/site key here'
$wgTurnstileSecretKey
'your private key here'
$wgTurnstileSendRemoteIP
is also available.
Configuration
Integration with
Extension:AbuseFilter
See also:
Extension:AbuseFilter/Actions#Show_a_CAPTCHA
If ConfirmEdit and
Extension:AbuseFilter
are installed, then an AbuseFilter can be configured to show a CAPTCHA as a consequence for matching against a filter.
It is recommended to load the ConfirmEdit extension before the AbuseFilter extension to ensure that this consequence functions correctly.
Don't require CAPTCHA from some users
ConfirmEdit introduces a
'skipcaptcha'
permission type to
wgGroupPermissions
This lets you set certain groups never to see CAPTCHAs.
All of the following can be added to
LocalSettings.php
Defaults from
ConfirmEdit.php
$wgGroupPermissions
'*'
][
'skipcaptcha'
false
$wgGroupPermissions
'user'
][
'skipcaptcha'
false
$wgGroupPermissions
'autoconfirmed'
][
'skipcaptcha'
false
$wgGroupPermissions
'bot'
][
'skipcaptcha'
true
// registered bots
$wgGroupPermissions
'sysop'
][
'skipcaptcha'
true
To skip captchas for users who confirmed their email, you need to set both:
$wgGroupPermissions
'emailconfirmed'
][
'skipcaptcha'
true
$wgAllowConfirmedEmail
true
Set actions that require CAPTCHA
The following conditions can trigger a CAPTCHA to be displayed:
'edit' – triggered on every attempted page save
'create' – triggered on page creation
'sendemail' – triggered when using
Special:Emailuser
'addurl' – triggered on a page save that would add one or more URLs to the page
'createaccount' – triggered on creation of a new account
'badlogin' – triggered after several failed login attempts from the same IP address
'badloginperuser' – triggered after several failed login attempts using the same username
The default values for these are:
$wgCaptchaTriggers
'edit'
false
$wgCaptchaTriggers
'create'
false
$wgCaptchaTriggers
'sendemail'
false
$wgCaptchaTriggers
'addurl'
true
$wgCaptchaTriggers
'createaccount'
true
$wgCaptchaTriggers
'badlogin'
true
$wgCaptchaTriggers
'badloginperuser'
true
The triggers
edit
create
and
addurl
can be configured per namespace using the
$wgCaptchaTriggersOnNamespace
setting.
If there is no
$wgCaptchaTriggersOnNamespace
for the current namespace, the normal
$wgCaptchaTriggers
apply.
So suppose that in addition to the above
$wgCaptchaTriggers
defaults we configure the following:
$wgCaptchaTriggersOnNamespace
NS_TALK
][
'addurl'
false
$wgCaptchaTriggersOnNamespace
NS_PROJECT
][
'edit'
true
Then the CAPTCHA will not trigger when adding URLs to a talk page, but on the other hand user will need to solve a CAPTCHA any time they try to edit a page in the project namespace, even if they aren't adding a link.
URL and IP allow lists
It is possible to define a allow of known good sites for which the CAPTCHA should not kick in when the
'addurl'
action is triggered.
Sysop users can edit the system message page called
MediaWiki:Captcha-addurl-whitelist
The expected format is a set of regex's one per line.
Comments can be added with
prefix.
You can see an example of this usage
on OpenStreetMap
This set of regexes can also be defined using the
$wgCaptchaIgnoredUrls
config variable in
LocalSettings.php
, to keep the value(s) a secret.
Some other variables you can add to
LocalSettings.php
$wgCaptchaBypassIPs – List of IP ranges to allow to skip the CAPTCHA (you can also use
MediaWiki:Captcha-ip-whitelist
; see below for details).
$wgAllowConfirmedEmail – Allow users who have confirmed their e-mail addresses to post URL links.
These are described more thoroughly in the code comments
MediaWiki:Captcha-ip-whitelist
can change the allowed IP addresses and IP ranges on the wiki.
They should be separated by newlines.
If any other character (apart from a valid IP address or range) is found on a line, it will be ignored, but leading and trailing whitespace characters are allowed.
For example, a line with only
127.0.0.1
is considered valid but
#127.0.0.1
will be ignored.
Regular expressions
The global variable wgCaptchaRegexes accepts an array of regexes to be tested against the page text and triggers the CAPTCHA if a match is found.
Failed login attempts
When using the
badlogin
or
badloginperuser
triggers, the following configuration variables control how many failed login attempts per-IP and per-user are allowed before a CAPTCHA is required, and how long it takes until the CAPTCHA requirement expires:
$wgCaptchaBadLoginAttempts
$wgCaptchaBadLoginExpiration
300
// 300 seconds = 5 minutes
$wgCaptchaBadLoginPerUserAttempts
20
$wgCaptchaBadLoginPerUserExpiration
600
// 600 seconds = 10 minutes
The triggers require
$wgMainCacheType
to be set to something other than
CACHE_NONE
in your
LocalSettings.php
, if in doubt the following will always work.
$wgMainCacheType
CACHE_ANYTHING
Note that these triggers do not trigger CAPTCHAs on API login but block them outright until the CAPTCHA requirement expires.
Wikimedia configuration
For example,
Wikimedia Foundation
wikis use FancyCaptcha with a custom set of images and the default configuration, modified by what follows.
$wgGroupPermissions
'autoconfirmed'
][
'skipcaptcha'
true
This means only unregistered and
newly registered users
have to pass the CAPTCHA.
EmergencyCaptcha mode
Additionally, the shortcut named
$wmgEmergencyCaptcha
is designed for use in a limited number of emergencies, for instance, in case of massive vandalism or spam attacks: it changes the default trigger values (see above) into the following:
$wgCaptchaTriggers
'edit'
true
$wgCaptchaTriggers
'create'
true
So, in addition to the normal situation, all anonymous and new users have to solve a CAPTCHA before being able to save an edit or create a new page.
Rate-limiting
ConfirmEdit supports rate limiting for false CAPTCHA.
For more information about
$wgRateLimits
and how to set it up, read
Manual:$wgRateLimits
, the action key is
badcaptcha
Authors
The basic framework was primarily designed by
Brooke Vibber
, who also wrote the SimpleCaptcha and FancyCaptcha modules.
The MathCaptcha module was written by
Rob Church
The QuestyCaptcha module was written by
Benjamin Lees
Additional maintenance work was done by
Yaron Koren
See also
Anti-spam features
Extension:ConfirmAccount
Extension:InviteSignup
Extension:SpamRegex
Extension:SpecialPageCaptcha
References
MediaWiki:Questycaptchahelp-text, MediaWiki:Questycaptcha-edit, MediaWiki:Questycaptcha-addurl, MediaWiki:Questycaptcha-create, MediaWiki:Questycaptcha-createaccount
Google Blog
Are you a robot? Introducing “No CAPTCHA reCAPTCHA”
4 December 2014
Manual:$wgSpamRegex
This extension is being used on one or more
Wikimedia projects
. This probably means that the extension is stable and works well enough to be used by such high-traffic websites. Look for this extension's name in Wikimedia's
CommonSettings.php
and
InitialiseSettings.php
configuration files to see where it's installed. A full list of the extensions installed on a particular wiki can be seen on the wiki's
Special:Version
page.
This extension is included in the following wiki farms/hosts and/or packages:
BlueSpice
Canasta
Debian
Fandom
Miraheze
MyWikis
ProWiki
semantic::core
ShoutWiki
Telepedia
wiki.gg
Retrieved from "
Categories
Stable extensions
Page action extensions
APIGetAllowedParams extensions
AbuseFilterCustomActions extensions
AlternateEditPreview extensions
AuthChangeFormFields extensions
EditFilterMergedContent extensions
EditPage::showEditForm:fields extensions
EditPageBeforeEditButtons extensions
EmailUser extensions
EmailUserForm extensions
MakeGlobalVariablesScript extensions
PageSaveComplete extensions
ResourceLoaderRegisterModules extensions
TitleReadWhitelist extensions
GPL licensed extensions
Extensions in Wikimedia version control
All extensions
Extensions bundled with MediaWiki 1.18
Extensions used on Wikimedia
Extensions included in BlueSpice
Extensions included in Canasta
Extensions available as Debian packages
Extensions included in Fandom
Extensions included in Miraheze
Extensions included in MyWikis
Extensions included in ProWiki
Extensions included in semantic::core
Extensions included in ShoutWiki
Extensions included in Telepedia
Extensions included in wiki.gg
Edit extensions
Spam management extensions
Hidden category:
Extensions with release branches compatibility policy
Extension
ConfirmEdit
Add topic