1
|
|
|
<?php |
2
|
|
|
namespace Rocket\UI\Forms\Fields; |
3
|
|
|
|
4
|
|
|
/** |
5
|
|
|
* Captcha form field |
6
|
|
|
* |
7
|
|
|
* @author Stéphane Goetz |
8
|
|
|
*/ |
9
|
|
|
|
10
|
|
|
/** |
11
|
|
|
* A Math Captcha Library that displays a number captcha similar to the drupal captcha. |
12
|
|
|
* |
13
|
|
|
* INSTRUCTIONS |
14
|
|
|
* |
15
|
|
|
* Place this class into you application/library directory and name it kaptcha.php |
16
|
|
|
* |
17
|
|
|
* create MY_Form_validation.php, add this code and save it in the application/libraries folder. |
18
|
|
|
* |
19
|
|
|
* public function kaptcha($value) { |
20
|
|
|
* $answer = $this->CI->input->post('kaptcha_answer'); |
21
|
|
|
* if ($this->CI->kaptcha->validate_kaptcha($value, $answer)) { |
22
|
|
|
* return true; |
23
|
|
|
* } |
24
|
|
|
* return false; |
25
|
|
|
* } |
26
|
|
|
* |
27
|
|
|
* |
28
|
|
|
* Add this to your controller form validation rules |
29
|
|
|
* $this->form_validation->set_rules('kaptcha', 'Math Question', 'required|is_numeric|kaptcha'); |
30
|
|
|
* |
31
|
|
|
* You can either add this to your form using a single line <?php $this->kaptcha->display_kaptcha(); ?> |
32
|
|
|
* or call it as an array <?php $kaptcha = $this->kaptcha->create_kaptcha() ;?> which will give you three items |
33
|
|
|
* First Number, Second Number and an encrypted answer which needs to be put in a hidden input value with the |
34
|
|
|
* name and id set to kaptcha_answer. |
35
|
|
|
* |
36
|
|
|
* The CSS is you bit! |
37
|
|
|
*/ |
38
|
|
|
class Kaptcha extends Field |
39
|
|
|
{ |
40
|
|
|
protected function getDefaults() |
41
|
|
|
{ |
42
|
|
|
return parent::getDefaults() + [ |
43
|
|
|
'kaptcha' => [ |
44
|
|
|
'tip' => t( |
45
|
|
|
'Resolvez ce calcul et entrez le resultat. Par exemple 1+3 = 4.' . |
46
|
|
|
'Il s\'agit de définir que vous êtes bien humain et pour éviter les spams' |
47
|
|
|
), |
48
|
|
|
'title' => 'Calcul : !first + !second =', |
49
|
|
|
'hidden_field' => 'kaptcha_answer', |
50
|
|
|
], |
51
|
|
|
]; |
52
|
|
|
} |
53
|
|
|
|
54
|
|
|
protected $kaptcha; |
55
|
|
|
|
56
|
|
|
public function __construct($name, $data = []) |
57
|
|
|
{ |
58
|
|
|
parent::__construct($name, $data); |
59
|
|
|
|
60
|
|
|
$this->kaptcha = [ |
61
|
|
|
'first' => rand(1, 10), |
62
|
|
|
'second' => rand(1, 10), |
63
|
|
|
]; |
64
|
|
|
|
65
|
|
|
$this->kaptcha['answer'] = \Crypt::encrypt($this->kaptcha['first'] + $this->kaptcha['second']); |
66
|
|
|
|
67
|
|
|
$this->params['tip'] = $this->params['kaptcha']['tip']; |
68
|
|
|
$this->params['title'] = t( |
69
|
|
|
$this->params['kaptcha']['title'], |
70
|
|
|
['!first' => $this->kaptcha['first'], '!second' => $this->kaptcha['second']] |
71
|
|
|
); |
72
|
|
|
} |
73
|
|
|
|
74
|
|
|
/** |
75
|
|
|
* Render the inner field |
76
|
|
|
*/ |
77
|
|
|
protected function renderInner() |
78
|
|
|
{ |
79
|
|
|
parent::renderInner(); |
80
|
|
|
|
81
|
|
|
$this->result .= "<input type=hidden name='{$this->params['kaptcha']['hidden_field']}' value='{$this->kaptcha['answer']}' />"; |
82
|
|
|
} |
83
|
|
|
|
84
|
|
|
/** |
85
|
|
|
* Function that validates the user answer against the encrypted answer |
86
|
|
|
* @param string $kaptcha |
87
|
|
|
* @param string $answer |
88
|
|
|
* @return bool |
89
|
|
|
*/ |
90
|
|
|
public static function validate_kaptcha($kaptcha = null, $answer = null) |
91
|
|
|
{ |
92
|
|
|
if ($kaptcha && $answer) { |
|
|
|
|
93
|
|
|
$value = \Crypt::decrypt($answer); |
94
|
|
|
if ($kaptcha == $value) { |
95
|
|
|
return true; |
96
|
|
|
} |
97
|
|
|
} |
98
|
|
|
|
99
|
|
|
return false; |
100
|
|
|
} |
101
|
|
|
} |
102
|
|
|
|
In PHP, under loose comparison (like
==
, or!=
, orswitch
conditions), values of different types might be equal.For
string
values, the empty string''
is a special case, in particular the following results might be unexpected: