The internet isn't the place it used to be anymore. Everything good gets corrupted and so it is with Wikis. WikiSpam, like Spam in blogs and email, is on the rise. If you use DokuWiki in your Intranet this is no problem for you. But if you intend to use it on the open Internet you may want to blacklist some known Spam words.
For using a blacklist in DokuWiki:
conf/wordblock.local.conf
file. You can have a look inside the file conf/wordblock.conf
for a list of existing word blocks.The file contains Regular Expressions (Perl compatible) if any of these match saving is disallowed. To understand why a certain text was banned for spam, you can use the whyspam plugin to analyze the text.
IP based blocking can be done using Apache's deny from directives or the ipban plugin.
You can add your own block words by creating a conf/wordblock.local.conf
file and placing your abbreviations.
(long|loud) shouting
Disable default block words by prefixing with (!
):
!woww gold
Updating the blacklist from a public source through a daily cronjob is recommended, here is a list of sources you can use to do so.
The nice people at Wikipedia maintain a similar blacklist. You can use the following command for updating your blacklist from this source:
$> curl -sk https://meta.wikimedia.org/wiki/Spam_blacklist?action=raw | egrep -v '<?pre>' > conf/wordblock.local.conf
Don't forget to create conf/wordblock.local.conf
file.
This small change in original DokuWiki file inc/common.php makes it possible to log blocked attacks in /data/meta/wordblock.log
and can also be used for block lists debugging.
Search Line:
function checkwordblock($text=''){ [...] if(count($re) && preg_match('#('.join('|',$re).')#si',$text,$matches)) { // prepare event data $data['matches'] = $matches; $data['userinfo']['ip'] = $_SERVER['REMOTE_ADDR']; [...]
Change it to:
function checkwordblock($text=''){ [...] if(count($re) && preg_match('#('.join('|',$re).')#si',$text,$matches)) { // prepare event data io_saveFile($conf['metadir'].'/wordblock.log', strftime($conf['dformat'])."\t".$matches[0]."\t".$ID.$_SERVER['REMOTE_USER']."\t".$_SERVER['REMOTE_ADDR'].":".$_SERVER['SERVER_PORT']."\t".gethostbyaddr($_SERVER['REMOTE_ADDR'])."\t".$_SERVER['HTTP_USER_AGENT']."\n", true); $data['matches'] = $matches; $data['userinfo']['ip'] = $_SERVER['REMOTE_ADDR']; [...]