分页:1 / 1

phpBB3.2.X 注册开启双验证

发表于 : 2018-11-27 16:27
IOsetting
防范机器人注册是一个比较让人头疼的问题, 因为现在大部分机器人都已经配备了图片验证码识别, 无论是否开启GD, 生成的验证码图片都不能完全防住机器人注册.

phpBB3自带的比较有效的验证工具reCaptcha则要依赖于Google的服务, 这个在目前的环境下是无法使用的. 在phpBB官网上提供的验证码扩展很多也是这个情况, 需要依赖于第三方服务, 问题是一样的, 这里不作讨论.

现在比较有效的就是开启次数限制, 和问答验证. 其中次数限制是因为机器人识别图片有一定差错概率, 开启错误次数限制后, 能排除掉一些多次尝试错误的机器人. 问答验证是有针对性的, 比如中文的问题就会让背后是非中文使用者的机器人无所适从. 会有人说机器人可以调用Google Search来寻找问题答案, 但这是可以通过一些手段来规避的, 例如使用㊋星呅, 使用脱离上下文语境就无法回答的问题, 等等.

下面这个修改, 是从另一个角度来增加机器人注册的难度, 设置双重验证. 应该说, 任何与标准版不同的验证方式, 都能提升防御机器人注册的效果, 因为大部分使用注册机的人, 从性价比考虑, 不会仅仅为了攻破你的论坛的注册体系就去修改代码.

这个修改后, 将在注册表单处增加一个额外的验证, 你可以使用 GD或非GD, 后台则配置为QA.
注意不能使用两个GD或非GD, 也不能同时使用两个QA, 因为它们是等价的, 互相冲突.

需要修改的文件有5个:
ucp.php
includes/ucp/ucp_confirm.php
includes/ucp/ucp_register.php
styles/prosilver/template/ucp_register.html
phpbb/captcha/plugins/captcha_abstract.php
修改前请备份这五个文件

1. ucp.php
找到

代码: 全选

$mode	= $request->variable('mode', '');
在下面添加

代码: 全选

$sub_mode  = $request->variable('sub_mode', '');
找到

代码: 全选

$module->load('ucp', 'confirm');
替换为

代码: 全选

$module->load('ucp', 'confirm', $sub_mode);
2. includes/ucp/ucp_confirm.php
找到

代码: 全选

$captcha = $phpbb_container->get('captcha.factory')->get_instance($config['captcha_plugin']);
替换为

代码: 全选

if ($mode == 'default') {
    $captcha = $phpbb_container->get('captcha.factory')->get_instance('core.captcha.plugins.no_gd');
} else {
    $captcha = $phpbb_container->get('captcha.factory')->get_instance($config['captcha_plugin']);
}
3. includes/ucp/ucp_register.php
在239行附近, 找到

代码: 全选

// The CAPTCHA kicks in here. We can't help that the information gets lost on language change.
if ($config['enable_confirm'])
{
在下面添加

代码: 全选

$captcha_default = $phpbb_container->get('captcha.factory')->get_instance('core.captcha.plugins.no_gd');
$captcha_default->init(CONFIRM_REG);
在293行附近, 找到

代码: 全选

// Replace "error" strings with their real, localised form
$error = array_map(array($user, 'lang'), $error);

if ($config['enable_confirm'])
{
在下面添加

代码: 全选

$vc_response = $captcha_default->validate($data);
if ($vc_response !== false)
{
    $error[] = $vc_response;
}
在430行附近找到

代码: 全选

// Okay, captcha, your job is done.
if ($config['enable_confirm'] && isset($captcha))
{
	$captcha->reset();
}
替换为

代码: 全选

// Okay, captcha, your job is done.

if ($config['enable_confirm'])
{
    if (isset($captcha_default))
    {
        $captcha_default->reset();
    }
    if (isset($captcha))
    {
        $captcha->reset();
    }
}
在578行附近, 找到

代码: 全选

$s_hidden_fields = array_merge($s_hidden_fields, $captcha->get_hidden_fields());
在前面添加

代码: 全选

$s_hidden_fields = array_merge($s_hidden_fields, $captcha_default->get_hidden_fields());
在584行附近找到

代码: 全选

$template->assign_vars(array(
	'CAPTCHA_TEMPLATE'		=> $captcha->get_template(),
));
在前面添加

代码: 全选

$template->assign_vars(array(
    'CAPTCHA_TEMPLATE_DEFAULT'	=> $captcha_default->get_template(),
));
4. styles/prosilver/template/ucp_register.html
找到

代码: 全选

<!-- IF CAPTCHA_TEMPLATE -->
在前面添加

代码: 全选

<!-- IF CAPTCHA_TEMPLATE_DEFAULT -->
	<!-- DEFINE $CAPTCHA_TAB_INDEX = 8 -->
	<!-- INCLUDE {CAPTCHA_TEMPLATE_DEFAULT} -->
<!-- ENDIF -->
5. phpbb/captcha/plugins/captcha_abstract.php
找到

代码: 全选

$link = append_sid($phpbb_root_path . 'ucp.' . $phpEx,  'mode=confirm&amp;confirm_id=' . $this->confirm_id . '&amp;type=' . $this->type);
替换为

代码: 全选

$link = append_sid($phpbb_root_path . 'ucp.' . $phpEx,  'mode=confirm&amp;sub_mode=default&amp;confirm_id=' . $this->confirm_id . '&amp;type=' . $this->type);
完成后, 清理模板缓存, 刷新注册页面查看效果.

Re: phpBB3.2.X 注册开启双验证

发表于 : 2019-01-09 9:24
anicca
手机登录注册,顶部出现如下信息,也能注册成功:

phpBB Debug] PHP Warning: in file [ROOT]/phpbb/captcha/plugins/qa.php on line 87: count(): Parameter must be an array or an object that implements Countable
[phpBB Debug] PHP Warning: in file [ROOT]/phpbb/captcha/plugins/qa.php on line 104: count(): Parameter must be an array or an object that implements Countable

请教如何处理?

Re: phpBB3.2.X 注册开启双验证

发表于 : 2019-01-10 23:23
IOsetting
你的论坛是不是装了多个语言? 要避免这个警告, 对应每个语言都设置上问题和答案就可以了

Re: phpBB3.2.X 注册开启双验证

发表于 : 2019-02-09 18:07
nonolee
手机咋登陆啊?高手写个教程吧,跪求啦!