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 = true)
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:
124: <noscript>
125: <iframe src="'. $server . '/noscript?k=' . $pubkey . $errorpart . '" height="300" width="500" frameborder="0"></iframe><br/>
126: <textarea name="recaptcha_challenge_field" rows="3" cols="40"></textarea>
127: <input type="hidden" name="recaptcha_response_field" value="manual_challenge"/>
128: </noscript>';
129: }
130:
131:
132:
133:
134: 135: 136:
137: class ReCaptchaResponse {
138: var $is_valid;
139: var $error;
140: }
141:
142:
143: 144: 145: 146: 147: 148: 149: 150: 151:
152: function recaptcha_check_answer ($privkey, $remoteip, $challenge, $response, $extra_params = array())
153: {
154: if ($privkey == null || $privkey == '') {
155: 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>");
156: }
157:
158: if ($remoteip == null || $remoteip == '') {
159: die ("For security reasons, you must pass the remote ip to reCAPTCHA");
160: }
161:
162:
163:
164:
165: if ($challenge == null || strlen($challenge) == 0 || $response == null || strlen($response) == 0) {
166: $recaptcha_response = new ReCaptchaResponse();
167: $recaptcha_response->is_valid = false;
168: $recaptcha_response->error = 'incorrect-captcha-sol';
169: return $recaptcha_response;
170: }
171:
172: $response = _recaptcha_http_post (RECAPTCHA_VERIFY_SERVER, "/recaptcha/api/verify",
173: array (
174: 'privatekey' => $privkey,
175: 'remoteip' => $remoteip,
176: 'challenge' => $challenge,
177: 'response' => $response
178: ) + $extra_params
179: );
180:
181: $answers = explode ("\n", $response [1]);
182: $recaptcha_response = new ReCaptchaResponse();
183:
184: if (trim ($answers [0]) == 'true') {
185: $recaptcha_response->is_valid = true;
186: }
187: else {
188: $recaptcha_response->is_valid = false;
189: $recaptcha_response->error = $answers [1];
190: }
191: return $recaptcha_response;
192:
193: }
194:
195: 196: 197: 198: 199: 200: 201:
202: function recaptcha_get_signup_url ($domain = null, $appname = null) {
203: return "https://www.google.com/recaptcha/admin/create?" . _recaptcha_qsencode (array ('domains' => $domain, 'app' => $appname));
204: }
205:
206: function _recaptcha_aes_pad($val) {
207: $block_size = 16;
208: $numpad = $block_size - (strlen ($val) % $block_size);
209: return str_pad($val, strlen ($val) + $numpad, chr($numpad));
210: }
211:
212:
213:
214: function _recaptcha_aes_encrypt($val,$ky) {
215: if (! function_exists ("mcrypt_encrypt")) {
216: die ("To use reCAPTCHA Mailhide, you need to have the mcrypt php module installed.");
217: }
218: $mode=MCRYPT_MODE_CBC;
219: $enc=MCRYPT_RIJNDAEL_128;
220: $val=_recaptcha_aes_pad($val);
221: return mcrypt_encrypt($enc, $ky, $val, $mode, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0");
222: }
223:
224:
225: function _recaptcha_mailhide_urlbase64 ($x) {
226: return strtr(base64_encode ($x), '+/', '-_');
227: }
228:
229:
230: function recaptcha_mailhide_url($pubkey, $privkey, $email) {
231: if ($pubkey == '' || $pubkey == null || $privkey == "" || $privkey == null) {
232: die ("To use reCAPTCHA Mailhide, you have to sign up for a public and private key, " .
233: "you can do so at <a href='http://www.google.com/recaptcha/mailhide/apikey'>http://www.google.com/recaptcha/mailhide/apikey</a>");
234: }
235:
236:
237: $ky = pack('H*', $privkey);
238: $cryptmail = _recaptcha_aes_encrypt ($email, $ky);
239:
240: return "http://www.google.com/recaptcha/mailhide/d?k=" . $pubkey . "&c=" . _recaptcha_mailhide_urlbase64 ($cryptmail);
241: }
242:
243: 244: 245: 246: 247:
248: function _recaptcha_mailhide_email_parts ($email) {
249: $arr = preg_split("/@/", $email );
250:
251: if (strlen ($arr[0]) <= 4) {
252: $arr[0] = substr ($arr[0], 0, 1);
253: } else if (strlen ($arr[0]) <= 6) {
254: $arr[0] = substr ($arr[0], 0, 3);
255: } else {
256: $arr[0] = substr ($arr[0], 0, 4);
257: }
258: return $arr;
259: }
260:
261: 262: 263: 264: 265: 266:
267: function recaptcha_mailhide_html($pubkey, $privkey, $email) {
268: $emailparts = _recaptcha_mailhide_email_parts ($email);
269: $url = recaptcha_mailhide_url ($pubkey, $privkey, $email);
270:
271: return htmlentities($emailparts[0]) . "<a href='" . htmlentities ($url) .
272: "' 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]);
273:
274: }
275:
276:
277: ?>
278: