Advertisement
Guest User

Captcha.php

a guest
Jul 12th, 2016
285
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.77 KB | None | 0 0
  1. <?php
  2. /**
  3. * MyBB 1.8
  4. * Copyright 2014 MyBB Group, All Rights Reserved
  5. *
  6. * Website: http://www.mybb.com
  7. * License: http://www.mybb.com/about/license
  8. *
  9. */
  10.  
  11. define("IN_MYBB", 1);
  12. define("NO_ONLINE", 1);
  13. define('THIS_SCRIPT', 'captcha.php');
  14. define("ALLOWABLE_PAGE", 1);
  15.  
  16. require_once "./global.php";
  17.  
  18. $img_width = 200;
  19. $img_height = 60;
  20.  
  21. // The following settings are only used for TTF fonts
  22. $min_size = 20;
  23. $max_size = 32;
  24.  
  25. $min_angle = -30;
  26. $max_angle = 30;
  27.  
  28. $mybb->input['imagehash'] = $mybb->get_input('imagehash');
  29. if($mybb->input['imagehash'])
  30. {
  31. $query = $db->simple_select("captcha", "*", "imagehash='".$db->escape_string($mybb->get_input('imagehash'))."' AND used=0", array("limit" => 1));
  32. $regimage = $db->fetch_array($query);
  33. if(!$regimage)
  34. {
  35. exit;
  36. }
  37. // Mark captcha as used
  38. $db->update_query('captcha', array('used' => 1), "imagehash='".$db->escape_string($regimage['imagehash'])."'");
  39. $imagestring = $regimage['imagestring'];
  40. }
  41. else
  42. {
  43. exit;
  44. }
  45.  
  46. $ttf_fonts = array();
  47.  
  48. // We have support for true-type fonts (FreeType 2)
  49. if(function_exists("imagefttext"))
  50. {
  51. // Get a list of the files in the 'catpcha_fonts' directory
  52. $ttfdir = @opendir(MYBB_ROOT."inc/captcha_fonts");
  53. if($ttfdir !== false)
  54. {
  55. while(($file = readdir($ttfdir)) !== false)
  56. {
  57. // If this file is a ttf file, add it to the list
  58. if(is_file(MYBB_ROOT."inc/captcha_fonts/".$file) && get_extension($file) == "ttf")
  59. {
  60. $ttf_fonts[] = MYBB_ROOT."inc/captcha_fonts/".$file;
  61. }
  62. }
  63. closedir($ttfdir);
  64. }
  65. }
  66.  
  67. // Have one or more TTF fonts in our array, we can use TTF captha's
  68. if(count($ttf_fonts) > 0)
  69. {
  70. $use_ttf = 1;
  71. }
  72. else
  73. {
  74. $use_ttf = 0;
  75. }
  76.  
  77. // Check for GD >= 2, create base image
  78. if(gd_version() >= 2)
  79. {
  80. $im = imagecreatetruecolor($img_width, $img_height);
  81. }
  82. else
  83. {
  84. $im = imagecreate($img_width, $img_height);
  85. }
  86.  
  87. // No GD support, die.
  88. if(!$im)
  89. {
  90. die("No GD support.");
  91. }
  92.  
  93. // Fill the background with white
  94. $bg_color = imagecolorallocate($im, 255, 255, 255);
  95. imagefill($im, 0, 0, $bg_color);
  96.  
  97. // Draw random circles, squares or lines?
  98. $to_draw = my_rand(0, 2);
  99. if($to_draw == 1)
  100. {
  101. draw_circles($im);
  102. }
  103. else if($to_draw == 2)
  104. {
  105. draw_squares($im);
  106. }
  107. else
  108. {
  109. draw_lines($im);
  110. }
  111.  
  112. // Draw dots on the image
  113. draw_dots($im);
  114.  
  115. // Write the image string to the image
  116. draw_string($im, $imagestring);
  117.  
  118. // Draw a nice border around the image
  119. $border_color = imagecolorallocate($im, 0, 0, 0);
  120. imagerectangle($im, 0, 0, $img_width-1, $img_height-1, $border_color);
  121.  
  122. // Output the image
  123. header("Content-type: image/png");
  124. imagepng($im);
  125. imagedestroy($im);
  126.  
  127. /**
  128. * Draws a random number of lines on the image.
  129. *
  130. * @param resource $im The image.
  131. */
  132. function draw_lines(&$im)
  133. {
  134. global $img_width, $img_height;
  135.  
  136. for($i = 10; $i < $img_width; $i += 10)
  137. {
  138. $color = imagecolorallocate($im, my_rand(150, 255), my_rand(150, 255), my_rand(150, 255));
  139. imageline($im, $i, 0, $i, $img_height, $color);
  140. }
  141. for($i = 10; $i < $img_height; $i += 10)
  142. {
  143. $color = imagecolorallocate($im, my_rand(150, 255), my_rand(150, 255), my_rand(150, 255));
  144. imageline($im, 0, $i, $img_width, $i, $color);
  145. }
  146. }
  147.  
  148. /**
  149. * Draws a random number of circles on the image.
  150. *
  151. * @param resource $im The image.
  152. */
  153. function draw_circles(&$im)
  154. {
  155. global $img_width, $img_height;
  156.  
  157. $circles = $img_width*$img_height / 100;
  158. for($i = 0; $i <= $circles; ++$i)
  159. {
  160. $color = imagecolorallocate($im, my_rand(180, 255), my_rand(180, 255), my_rand(180, 255));
  161. $pos_x = my_rand(1, $img_width);
  162. $pos_y = my_rand(1, $img_height);
  163. $circ_width = ceil(my_rand(1, $img_width)/2);
  164. $circ_height = my_rand(1, $img_height);
  165. imagearc($im, $pos_x, $pos_y, $circ_width, $circ_height, 0, my_rand(200, 360), $color);
  166. }
  167. }
  168.  
  169. /**
  170. * Draws a random number of dots on the image.
  171. *
  172. * @param resource $im The image.
  173. */
  174. function draw_dots(&$im)
  175. {
  176. global $img_width, $img_height;
  177.  
  178. $dot_count = $img_width*$img_height/5;
  179. for($i = 0; $i <= $dot_count; ++$i)
  180. {
  181. $color = imagecolorallocate($im, my_rand(200, 255), my_rand(200, 255), my_rand(200, 255));
  182. imagesetpixel($im, my_rand(0, $img_width), my_rand(0, $img_height), $color);
  183. }
  184. }
  185.  
  186. /**
  187. * Draws a random number of squares on the image.
  188. *
  189. * @param resource $im The image.
  190. */
  191. function draw_squares(&$im)
  192. {
  193. global $img_width, $img_height;
  194.  
  195. $square_count = 30;
  196. for($i = 0; $i <= $square_count; ++$i)
  197. {
  198. $color = imagecolorallocate($im, my_rand(150, 255), my_rand(150, 255), my_rand(150, 255));
  199. $pos_x = my_rand(1, $img_width);
  200. $pos_y = my_rand(1, $img_height);
  201. $sq_width = $sq_height = my_rand(10, 20);
  202. $pos_x2 = $pos_x + $sq_height;
  203. $pos_y2 = $pos_y + $sq_width;
  204. imagefilledrectangle($im, $pos_x, $pos_y, $pos_x2, $pos_y2, $color);
  205. }
  206. }
  207.  
  208. /**
  209. * Writes text to the image.
  210. *
  211. * @param resource $im The image.
  212. * @param string $string The string to be written
  213. *
  214. * @return bool False if string is empty, true otherwise
  215. */
  216. function draw_string(&$im, $string)
  217. {
  218. global $use_ttf, $min_size, $max_size, $min_angle, $max_angle, $ttf_fonts, $img_height, $img_width;
  219.  
  220. if(empty($string))
  221. {
  222. return false;
  223. }
  224.  
  225. $spacing = $img_width / my_strlen($string);
  226. $string_length = my_strlen($string);
  227. for($i = 0; $i < $string_length; ++$i)
  228. {
  229. // Using TTF fonts
  230. if($use_ttf)
  231. {
  232. // Select a random font size
  233. $font_size = my_rand($min_size, $max_size);
  234.  
  235. // Select a random font
  236. $font = array_rand($ttf_fonts);
  237. $font = $ttf_fonts[$font];
  238.  
  239. // Select a random rotation
  240. $rotation = my_rand($min_angle, $max_angle);
  241.  
  242. // Set the colour
  243. $r = my_rand(0, 200);
  244. $g = my_rand(0, 200);
  245. $b = my_rand(0, 200);
  246. $color = imagecolorallocate($im, $r, $g, $b);
  247.  
  248. // Fetch the dimensions of the character being added
  249. $dimensions = imageftbbox($font_size, $rotation, $font, $string[$i], array());
  250. $string_width = $dimensions[2] - $dimensions[0];
  251. $string_height = $dimensions[3] - $dimensions[5];
  252.  
  253. // Calculate character offsets
  254. //$pos_x = $pos_x + $string_width + ($string_width/4);
  255. $pos_x = $spacing / 4 + $i * $spacing;
  256. $pos_y = ceil(($img_height-$string_height/2));
  257.  
  258. // Draw a shadow
  259. $shadow_x = my_rand(-3, 3) + $pos_x;
  260. $shadow_y = my_rand(-3, 3) + $pos_y;
  261. $shadow_color = imagecolorallocate($im, $r+20, $g+20, $b+20);
  262. imagefttext($im, $font_size, $rotation, $shadow_x, $shadow_y, $shadow_color, $font, $string[$i], array());
  263.  
  264. // Write the character to the image
  265. imagefttext($im, $font_size, $rotation, $pos_x, $pos_y, $color, $font, $string[$i], array());
  266. }
  267. else
  268. {
  269. // Get width/height of the character
  270. $string_width = imagefontwidth(5);
  271. $string_height = imagefontheight(5);
  272.  
  273. // Calculate character offsets
  274. $pos_x = $spacing / 4 + $i * $spacing;
  275. $pos_y = $img_height / 2 - $string_height -10 + my_rand(-3, 3);
  276.  
  277. // Create a temporary image for this character
  278. if(gd_version() >= 2)
  279. {
  280. $temp_im = imagecreatetruecolor(15, 20);
  281. }
  282. else
  283. {
  284. $temp_im = imagecreate(15, 20);
  285. }
  286. $bg_color = imagecolorallocate($temp_im, 255, 255, 255);
  287. imagefill($temp_im, 0, 0, $bg_color);
  288. imagecolortransparent($temp_im, $bg_color);
  289.  
  290. // Set the colour
  291. $r = my_rand(0, 200);
  292. $g = my_rand(0, 200);
  293. $b = my_rand(0, 200);
  294. $color = imagecolorallocate($temp_im, $r, $g, $b);
  295.  
  296. // Draw a shadow
  297. $shadow_x = my_rand(-1, 1);
  298. $shadow_y = my_rand(-1, 1);
  299. $shadow_color = imagecolorallocate($temp_im, $r+50, $g+50, $b+50);
  300. imagestring($temp_im, 5, 1+$shadow_x, 1+$shadow_y, $string[$i], $shadow_color);
  301.  
  302. imagestring($temp_im, 5, 1, 1, $string[$i], $color);
  303.  
  304. // Copy to main image
  305. imagecopyresized($im, $temp_im, $pos_x, $pos_y, 0, 0, 40, 55, 15, 20);
  306. imagedestroy($temp_im);
  307. }
  308. }
  309. return true;
  310. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement