1: <?php
2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33:
34:
35: 36: 37:
38: define("RECAPTCHA_API_SERVER", "http://www.google.com/recaptcha/api");
39: define("RECAPTCHA_API_SECURE_SERVER", "https://www.google.com/recaptcha/api");
40: define("RECAPTCHA_VERIFY_SERVER", "www.google.com");
41:
42: 43: 44: 45: 46:
47: function _recaptcha_qsencode ($data) {
48: $req = "";
49: foreach ( $data as $key => $value )
50: $req .= $key . '=' . urlencode( stripslashes($value) ) . '&';
51:
52:
53: $req=substr($req,0,strlen($req)-1);
54: return $req;
55: }
56:
57:
58:
59: 60: 61: 62: 63: 64: 65: 66:
67: function _recaptcha_http_post($host, $path, $data, $port = 80) {
68:
69: $req = _recaptcha_qsencode ($data);
70:
71: $http_request = "POST $path HTTP/1.0\r\n";
72: $http_request .= "Host: $host\r\n";
73: $http_request .= "Content-Type: application/x-www-form-urlencoded;\r\n";
74: $http_request .= "Content-Length: " . strlen($req) . "\r\n";
75: $http_request .= "User-Agent: reCAPTCHA/PHP\r\n";
76: $http_request .= "\r\n";
77: $http_request .= $req;
78:
79: $response = '';
80: if( false == ( $fs = @fsockopen($host, $port, $errno, $errstr, 10) ) ) {
81: die ('Could not open socket');
82: }
83:
84: fwrite($fs, $http_request);
85:
86: while ( !feof($fs) )
87: $response .= fgets($fs, 1160);
88: fclose($fs);
89: $response = explode("\r\n\r\n", $response, 2);
90:
91: return $response;
92: }
93:
94:
95:
96: 97: 98: 99: 100: 101: 102: 103: 104: 105:
106: function recaptcha_get_html ($pubkey, $error = null, $use_ssl = false)
107: {
108: if ($pubkey == null || $pubkey == '') {
109: die ("To use reCAPTCHA you must get an API key from <a href='https://www.google.com/recaptcha/admin/create'>https://www.google.com/recaptcha/admin/create</a>");
110: }
111:
112: if ($use_ssl) {
113: $server = RECAPTCHA_API_SECURE_SERVER;
114: } else {
115: $server = RECAPTCHA_API_SERVER;
116: }
117:
118: $errorpart = "";
119: if ($error) {
120: $errorpart = "&error=" . $error;
121: }
122: return '<script type="text/javascript" src="'. $server . '/challenge?k=' . $pubkey . $errorpart . '"></script>
123: <noscript>
124: <iframe src="'. $server . '/noscript?k=' . $pubkey . $errorpart . '" seamless="seamless"></iframe><br/>
125: <textarea name="recaptcha_challenge_field" rows="3" cols="40"></textarea>
126: <input type="hidden" name="recaptcha_response_field" value="manual_challenge"/>
127: </noscript>';
128: }
129:
130:
131:
132:
133: 134: 135:
136: class ReCaptchaResponse {
137: var $is_valid;
138: var $error;
139: }
140:
141:
142: 143: 144: 145: 146: 147: 148: 149: 150:
151: function recaptcha_check_answer ($privkey, $remoteip, $challenge, $response, $extra_params = array())
152: {
153: if ($privkey == null || $privkey == '') {
154: die ("To use reCAPTCHA you must get an API key from <a href='https://www.google.com/recaptcha/admin/create'>https://www.google.com/recaptcha/admin/create</a>");
155: }
156:
157: if ($remoteip == null || $remoteip == '') {
158: die ("For security reasons, you must pass the remote ip to reCAPTCHA");
159: }
160:
161:
162:
163:
164: if ($challenge == null || strlen($challenge) == 0 || $response == null || strlen($response) == 0) {
165: $recaptcha_response = new ReCaptchaResponse();
166: $recaptcha_response->is_valid = false;
167: $recaptcha_response->error = 'incorrect-captcha-sol';
168: return $recaptcha_response;
169: }
170:
171: $response = _recaptcha_http_post (RECAPTCHA_VERIFY_SERVER, "/recaptcha/api/verify",
172: array (
173: 'privatekey' => $privkey,
174: 'remoteip' => $remoteip,
175: 'challenge' => $challenge,
176: 'response' => $response
177: ) + $extra_params
178: );
179:
180: $answers = explode ("\n", $response [1]);
181: $recaptcha_response = new ReCaptchaResponse();
182:
183: if (trim ($answers [0]) == 'true') {
184: $recaptcha_response->is_valid = true;
185: }
186: else {
187: $recaptcha_response->is_valid = false;
188: $recaptcha_response->error = $answers [1];
189: }
190: return $recaptcha_response;
191:
192: }
193:
194: 195: 196: 197: 198: 199: 200:
201: function recaptcha_get_signup_url ($domain = null, $appname = null) {
202: return "https://www.google.com/recaptcha/admin/create?" . _recaptcha_qsencode (array ('domains' => $domain, 'app' => $appname));
203: }
204:
205: function _recaptcha_aes_pad($val) {
206: $block_size = 16;
207: $numpad = $block_size - (strlen ($val) % $block_size);
208: return str_pad($val, strlen ($val) + $numpad, chr($numpad));
209: }
210:
211:
212:
213: function _recaptcha_aes_encrypt($val,$ky) {
214: if (! function_exists ("mcrypt_encrypt")) {
215: die ("To use reCAPTCHA Mailhide, you need to have the mcrypt php module installed.");
216: }
217: $mode=MCRYPT_MODE_CBC;
218: $enc=MCRYPT_RIJNDAEL_128;
219: $val=_recaptcha_aes_pad($val);
220: return mcrypt_encrypt($enc, $ky, $val, $mode, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0");
221: }
222:
223:
224: function _recaptcha_mailhide_urlbase64 ($x) {
225: return strtr(base64_encode ($x), '+/', '-_');
226: }
227:
228:
229: function recaptcha_mailhide_url($pubkey, $privkey, $email) {
230: if ($pubkey == '' || $pubkey == null || $privkey == "" || $privkey == null) {
231: die ("To use reCAPTCHA Mailhide, you have to sign up for a public and private key, " .
232: "you can do so at <a href='http://www.google.com/recaptcha/mailhide/apikey'>http://www.google.com/recaptcha/mailhide/apikey</a>");
233: }
234:
235:
236: $ky = pack('H*', $privkey);
237: $cryptmail = _recaptcha_aes_encrypt ($email, $ky);
238:
239: return "http://www.google.com/recaptcha/mailhide/d?k=" . $pubkey . "&c=" . _recaptcha_mailhide_urlbase64 ($cryptmail);
240: }
241:
242: 243: 244: 245: 246:
247: function _recaptcha_mailhide_email_parts ($email) {
248: $arr = preg_split("/@/", $email );
249:
250: if (strlen ($arr[0]) <= 4) {
251: $arr[0] = substr ($arr[0], 0, 1);
252: } else if (strlen ($arr[0]) <= 6) {
253: $arr[0] = substr ($arr[0], 0, 3);
254: } else {
255: $arr[0] = substr ($arr[0], 0, 4);
256: }
257: return $arr;
258: }
259:
260: 261: 262: 263: 264: 265:
266: function recaptcha_mailhide_html($pubkey, $privkey, $email) {
267: $emailparts = _recaptcha_mailhide_email_parts ($email);
268: $url = recaptcha_mailhide_url ($pubkey, $privkey, $email);
269:
270: return htmlentities($emailparts[0]) . "<a href='" . htmlentities ($url) .
271: "' onclick=\"window.open('" . htmlentities ($url) . "', '', 'toolbar=0,scrollbars=0,location=0,statusbar=0,menubar=0,resizable=0,width=500,height=300'); return false;\" title=\"Reveal this e-mail address\">...</a>@" . htmlentities ($emailparts [1]);
272:
273: }
274:
275:
276: ?>
277: