Русское сообщество fluxbb

Быстрый лёгкий надёжный форумный движок

Вы не вошли.

Объявление

Вы можете внести свой вклад в содержание сайта. Жертвователи попадут в почетную группу "Спонсоры". Поддержать сайт.

#1 2016-01-17 15:12:38

artoodetoo
Admin by chance
Зарегистрирован: 2008-09-09
Сообщений: 876
Сайт

[MOD] Copyable captcha

Каптча, которую вы можете просто скопировать

С недавних пор эта штука работает здесь, на форуме "Русское сообщество fluxbb". Название было трудно придумать, поэтому назову просто по заметной особенности: это такая каптча, которую реально выделить мышкой и скопировать-вставить.

Как такое может быть и неужели такая каптча может защищать? По факту — да, она работает. В ней заложены такие ключевых идеи:

  • универсальные регистрационные боты ищут картинку — у нас её не будет

  • в отличие от ботов, человек видит в браузере только то, что не скрыто стилями — используем это

  • раз уж мы видим не то же самое, что бот, незачем делать этот образ плохо различимым

  • используем те же механизмы, что и авторизация fluxbb: куки "подпиcанные" секретным ключем, устаревающим по времени.

  • дополнительных зависимостей вроде новых таблиц, сессии или javascript не будет!

Пара скришнотов:

newcaptcha1.png
newcaptcha2.png

Как каптча выглядит в теле страницы
<strong class="masq"><i>R</i><i>S</i><i>D</i><i>1</i><i>m</i><i>j</i><i>M</i></strong>

При этом некоторые из элементов <i> сделаны невидимыми. Поэтому мы видим
RDmjM, а не
RSD1mjM.

Архив с readme и готовыми файлами

Скачайте ZIP и распакуйте во временное место.

Если у вас fluxbb v1.5.9 без модов, то можете просто скопировать файлы из папки /files/ поверх ваших. Если версия другая, кастомная сборка или ставились моды, то НЕ копируйте, а меняйте всё по инструкции из readme.txt!
Edited: используйте релиз 1.0.1, с ним можно ничего не редактировать и не менять в ядре.

Плагин на оффсайте

http://fluxbb.org/resources/mods/copyable-captcha/
http://fluxbb.org/forums/viewtopic.php?id=8738


There are two hard things in computer science: cache invalidation, naming things, and off-by-one errors.

Offline

#2 2016-01-17 17:00:05

Visman
Administrator
Из Сибирь
Зарегистрирован: 2009-06-08
Сообщений: 2,107
Сайт

Re: [MOD] Copyable captcha

@artoodetoo, надо было капчу делать в виде расширения, чтобы код файла не менять wink

Offline

#3 2016-01-17 18:53:32

artoodetoo
Admin by chance
Зарегистрирован: 2008-09-09
Сообщений: 876
Сайт

Re: [MOD] Copyable captcha

Это интересно. Ты имеешь в виду эту хрень addons? Как раз думал спросить: у неё вообще есть примеры применения?


There are two hard things in computer science: cache invalidation, naming things, and off-by-one errors.

Offline

#4 2016-01-17 19:03:51

Visman
Administrator
Из Сибирь
Зарегистрирован: 2009-06-08
Сообщений: 2,107
Сайт

Re: [MOD] Copyable captcha

@artoodetoo, я на основе каптчи от Франца делал свои расширения.

Offline

#5 2016-01-17 19:18:28

artoodetoo
Admin by chance
Зарегистрирован: 2008-09-09
Сообщений: 876
Сайт

Re: [MOD] Copyable captcha

Лениво что-то менять. Это сделал только потому что ты попросил на форум что-то такое поставить.
И вообще не фанат флаксбб.  sad


There are two hard things in computer science: cache invalidation, naming things, and off-by-one errors.

Offline

#6 2016-01-18 08:18:15

artoodetoo
Admin by chance
Зарегистрирован: 2008-09-09
Сообщений: 876
Сайт

Re: [MOD] Copyable captcha

P.S. Если поможешь, я буду благодарен. Конечно хуки это прогрессивно, они облегчают обновления.


There are two hard things in computer science: cache invalidation, naming things, and off-by-one errors.

Offline

#7 2016-01-18 11:28:07

Visman
Administrator
Из Сибирь
Зарегистрирован: 2009-06-08
Сообщений: 2,107
Сайт

Re: [MOD] Copyable captcha

1. Файл /addons/copyable_captcha.php

<?php

/**
 * Copyright (C) 2016
 * License: http://www.gnu.org/licenses/gpl.html GPL version 2 or higher
 */

class addon_copyable_captcha extends flux_addon
{
	var $lang;
	var $user_lang;
	var $styles;
	var $spans;

	function register($manager)
	{
		global $pun_user;

		if (!$pun_user['is_guest']) return;

		$this->user_lang = $pun_user['language'];

		$manager->bind('register_after_validation', array($this, 'hook_register_after_validation'));
		$manager->bind('register_before_header', array($this, 'hook_register_before_header'));
		$manager->bind('register_before_submit', array($this, 'hook_register_before_submit'));
	}

	function load_lang()
	{
		if (is_array($this->lang)) return;

		if (file_exists(PUN_ROOT.'lang/'.($this->user_lang).'/copyable_captcha.php'))
			require PUN_ROOT.'lang/'.($this->user_lang).'/copyable_captcha.php';
		else
			require PUN_ROOT.'lang/English/copyable_captcha.php';

		$this->lang = $lang;
	}

	function hook_register_after_validation()
	{
		global $errors, $cookie_seed;

		if (isset($_POST['req_word']) && isset($_COOKIE['sign']) && substr_count($_COOKIE['sign'], '-') === 1) { // strpos($_COOKIE['sign'], '-')
			list($hash, $time) = explode('-', $_COOKIE['sign']);
			$word = $_POST['req_word'];
			if ((int)$time <= time() - 120 || $hash !== sha1(strtolower($word).$cookie_seed.'secret'.$time)) {
				$this->load_lang();
				$errors[] = $this->lang['Captcha error'];
			}
		} else {
			$this->load_lang();
			$errors[] = $this->lang['Captcha error'];
		}
	}


	function hook_register_before_header()
	{
		global $required_fields, $errors, $cookie_seed;

		$this->load_lang();
		$required_fields['req_word'] = $this->lang['Captcha'];

		$time = time();
		$word = random_pass(mt_rand(4, 6));
		$hash = sha1(strtolower($word).$cookie_seed.'secret'.$time);
		setcookie('sign', $hash.'-'.$time, 0, '/');

		$array = str_split($word);
		$mixin = random_pass(mt_rand(1, 3));
		$i = -1;
		$this->styles = '';
		foreach (str_split($mixin) as $ch) {
			$i = mt_rand($i+1, count($array));
			array_splice($array, $i, 0, $ch);
			$this->styles .= '.masq i:nth-child('.($i + 1).'){display:none;} ';
		}
		$this->spans = '<i>'.implode('</i><i>', $array).'</i>';
	}


	function hook_register_before_submit()
	{
		global $lang_common;

		$this->load_lang();

?>
			<div class="inform">
				<fieldset>
					<legend><?php echo $this->lang['Captcha legend'] ?></legend>
					<div class="infldset">
						<style> .masq i {font-style:normal;} <?php echo $this->styles ?></style>
						<p><?php echo sprintf($this->lang['Captcha info'], $this->spans) ?></p>
						<label class="required"><strong><?php echo $this->lang['Captcha'] ?> <span><?php echo $lang_common['Required'] ?></span></strong><br /><input type="text" name="req_word" size="25" maxlength="25" /><br /></label>
					</div>
				</fieldset>
			</div>
<?php

	}
}

2. Файл /lang/English/copyable_captcha.php

<?php
$lang = array (
// Captcha
'Captcha'					=>	'Captcha',
'Captcha legend'			=>	'Confirm that you\'re not robot',
'Captcha info'				=>	'Captcha is valid for 2 min only. Refresh page if needed.<br />Please enter this characters: <strong class="masq">%1$s</strong>',
'Captcha error'				=>	'Wrong or expired captcha',

);

3. Файл /lang/Russian/copyable_captcha.php

<?php
$lang = array (
// Captcha
'Captcha'					=>	'Каптча',
'Captcha legend'			=>	'Подтвердите, что вы не робот',
'Captcha info'				=>	'Каптча действительна только в течении 2 мин. Обновите страницу если надо.<br />Пожалуйста введите эти символы: <strong class="masq">%1$s</strong>',
'Captcha error'				=>	'Неправильная или устаревшая каптча',

);

Offline

#8 2016-01-18 14:55:36

artoodetoo
Admin by chance
Зарегистрирован: 2008-09-09
Сообщений: 876
Сайт

Re: [MOD] Copyable captcha

Большое спасибо! Оформил так с небольшими изменениями.
http://fluxbb.org/resources/mods/copyab … ses/1.0.1/
https://github.com/fluxbb-org-ru/copyable-captcha


There are two hard things in computer science: cache invalidation, naming things, and off-by-one errors.

Offline

Подвал доски

Под управлением FluxBB. Хостинг Hostens