Вы не зашли.
Главная » PHP » Скажем нет капче!
#11. tipsun Off (19)
Moderator
2011.09.20 09:09
Я вот подумал и надумал вот что. Видел один демотиватор, как там типа человек может читать слова, даже если буквы кроме первой и последней (вроде или 2х первых и последних) в нем разбросаны/переставлены/не на своих местах. Думаю сделать такую каптчу. Давать слова разбросанные, а вводили чтоб нормальные или числа (чтеыре=4).
Пока не знаю как реализовать, но думаю стоит попробовать. smile
- - - -
Ну может быть сначала нормальное слово в мд5 заширить, потом в input hidden. И после перемещать исходное и показать пользователю.
Вот эта тема: habrahabr.ru/blogs/programming/122163/
а там до меня уже додумались big_smile
Отредактировано tipsun (2011.09.20 10:10)
#12. Gemorroj Off (107)
Administrator
2011.09.20 10:10
интересная идея.
вот только md5 хэш нельзя светить, иначе просто переставляя буквы и сверяя хэш, можно получить правильное слово.
тут нужен просто массив соответствий array('чтеыре' => 'четыре');
#13. tipsun Off (19)
Moderator
2011.09.20 11:11
Цифры будет легко разгадать. Там всего то: 1, 4-20, 30-90-1000 ну одно слово чтоб было.
#14. tipsun Off (19)
Moderator
2011.09.20 11:11
С телефона писал, может че неправильно. Уже забыл код smile
Код:
span style="color: #0000BB"><?php$random = 'vosem';$len = strlen($random);$toMix = substr($random, 1, $len-2);$mixed = str_shuffle($toMix);echo $random{0}.$mixed.$random{$len-1};?>
Отредактировано tipsun (2011.09.20 12:12)
#15. Gemorroj Off (107)
Administrator
2011.09.20 12:12
нет, так не получится с мультбайтовой кодировкой.
#16. tipsun Off (19)
Moderator
2011.09.20 12:12
Ну я вспомнил сейчас smile
Там mb_substr(), mb_strlen(). А вот суффле нет sad
Добавлено спустя   1 минуту  56 секунд:
С php.net
Код:
span style="color: #0000BB"><?phpfunction unicode_shuffle($string, $chars, $format = 'UTF-8'){ for($i=0; $i<$chars; $i++) $rands[$i] = rand(0, mb_strlen($string, $format)); $s = NULL; foreach($rands as $r) $s.= mb_substr($string, $r, 1, $format); return $s;}?>
#17. tipsun Off (19)
Moderator
2011.09.20 20:08
Чет у меня пока нет хороших мыслей как реализовать: первую и последнюю не трогая перемещать буквы.

Код:
preg_split('//u', 'слово') дает [0]=null, [1]='c' ... [last]=null
 
unset($array[0], $array[последний ключ/знач])
можно...
Отредактировано tipsun (2011.09.20 20:08)
#18. tipsun Off (19)
Moderator
2011.09.20 21:09
Код:
span style="color: #0000BB"><?php$captchaLib = array('один' => 1,'четыре' => 4,'пять' => 5,'шесть' => 6,'семь' => 7,'восемь' => 8,'девять' => 9,'десять' => 10,'одиннадцать' => 11,'двенадцать' => 12,'тринадцать' => 13,'четырнадцать' => 14,'пятнадцать' => 15,'шестнадцать' => 16,'семнадцать' => 17,'восемнадцать' => 18,'девятнадцать' => 19,'двадцать' => 20,'тридцать' => 30,'сорок' => 40,'пятьдесят' => 50,'шестьдесят' => 60,'семьдесят' => 70,'восемьдесят' => 80,'девяносто' => 90,'двести' => 200,'тристо' => 300,'четыресто' => 400,'пятьсот' => 500,'шестьсот' => 600,'семьсот' => 700,'восемьсот' => 800,'девятьсот' => 900,'тысяча' => 1000);function captcha($lib=0) { if(!is_array($lib)) return false; $word = array_rand($lib); preg_match_all('/.{1}/u', $word, $letters); $letters = $letters[0]; $count = sizeof($letters); define('LLN', $count-1); define('FL', $letters[0]); define('LL', $letters[LLN]); unset($letters[0], $letters[LLN]); shuffle($letters); return FL.implode($letters).LL; }echo captcha($captchaLib);?>
Отредактировано tipsun (2011.09.20 22:10)
#19. tipsun Off (19)
Moderator
2011.09.20 22:10
Я уже знаю что ответят: "Сделай класс!" big_smile
Да и так все класс big_smile
Ну а по делу, да надо бы.
Сразу там же проверку сделать.
- - - -
Можно было бы просто массив со словами >3 букв.
Код:
span style="color: #0000BB"><?php//Проверкаif(in_array($_GET['captcha'], $captchaLib)) { echo 'All right!'; }//Бред, не смотрите =)?>
Отредактировано tipsun (2011.09.21 19:07)
#20. Gemorroj Off (107)
Administrator
2011.09.20 22:10
ну если знаешь, то почему не делаешь?)
Страниц: 1 2 3 46 Все
Главная
WEB
PunBB Mod v0.6.2
0.016 s