249 lines
7.7 KiB
PHP
249 lines
7.7 KiB
PHP
<?php
|
|
|
|
// if we have to generate a CAPTCHA image
|
|
if (isset($_GET['captcha']) && ($_GET['captcha'] == 1 || $_GET['captcha'] == 2)) {
|
|
|
|
// storage method
|
|
$storage = ($_GET['captcha'] == 2 ? 'session' : 'cookie');
|
|
|
|
// if storage method is "session", start a session
|
|
if ($storage == 'session') session_start();
|
|
|
|
// as this file actually generates an image we set the headers accordingly
|
|
header('Content-type:image/jpeg');
|
|
|
|
$font_path = rtrim(implode(DIRECTORY_SEPARATOR, array_slice(explode(DIRECTORY_SEPARATOR, __FILE__), 0, -2)), DIRECTORY_SEPARATOR) . DIRECTORY_SEPARATOR . basename(dirname(__FILE__)) . DIRECTORY_SEPARATOR . 'includes/';
|
|
|
|
// the number of characters to be used in the generated image
|
|
$charactersNumber = 5;
|
|
|
|
// spacing between characters (this can also be a negative number)
|
|
// you should leave this as it is (unless you want to increase it)
|
|
// decreasing this value may result in characters overlapping and being hardly distinguishable
|
|
$characterSpacing = -2;
|
|
|
|
// each character's size will be randomly selected from this range
|
|
$fontSizeVariation = array(20, 40);
|
|
|
|
// each character's angle will be randomly selected from this range
|
|
// (remember to also change the character spacing if you change these to avoid character overlapping)
|
|
$fontAngleVariation = array(-10, 10);
|
|
|
|
// if you changed anything above, you should probably change this too si that all the characters fit into the image
|
|
// and there's not too much of blank space
|
|
$imageWidth = 140;
|
|
|
|
// if you changed anything above, you should probably change this too si that all the characters fit into the image
|
|
// and there's not too much of blank space
|
|
$imageHeight = 50;
|
|
|
|
// the quality, in percents, of the generated image
|
|
$imageQuality = 70;
|
|
|
|
// list of characters from which to choose
|
|
// (notice that characters that can be (in some circumstances) confused with others, are missing)
|
|
// you should not alter this setting
|
|
$charList = 'bcdkmpsx345678';
|
|
|
|
$captcha = array();
|
|
|
|
$resultString = '';
|
|
|
|
$totalWidth = 0;
|
|
|
|
// this is the used font
|
|
$font = $font_path . 'babelsans-bold.ttf';
|
|
|
|
// first we figure out how much space the character would take
|
|
for ($i = 0; $i < $charactersNumber; $i++) {
|
|
|
|
// get a random character
|
|
$char = $charList[rand(0, strlen($charList) - 1)];
|
|
|
|
$resultString .= $char;
|
|
|
|
// get a random size for the character
|
|
$charSize = rand($fontSizeVariation[0], $fontSizeVariation[1]);
|
|
|
|
// get a random angle for the character
|
|
$charAngle = rand($fontAngleVariation[0], $fontAngleVariation[1]);
|
|
|
|
// get the bounding box of the character
|
|
$bbox = imagettfbbox($charSize, $charAngle, $font, $char);
|
|
|
|
// resolve the returned measurements
|
|
$bbox['left'] = abs(min($bbox[0], $bbox[2], $bbox[4], $bbox[6]));
|
|
|
|
$bbox['top'] = abs(min($bbox[1], $bbox[3], $bbox[5], $bbox[7]));
|
|
|
|
$bbox['width'] = max($bbox[0], $bbox[2], $bbox[4], $bbox[6]) - min($bbox[0], $bbox[2], $bbox[4], $bbox[6]);
|
|
|
|
$bbox['height'] = max($bbox[1], $bbox[3], $bbox[5], $bbox[7]) - min($bbox[1], $bbox[3], $bbox[5], $bbox[7]);
|
|
|
|
// this will be the total width of the random generated word
|
|
$totalWidth += $bbox['width'] + $characterSpacing;
|
|
|
|
// save info about the current character
|
|
$captcha[] = array(
|
|
|
|
'char' => $char,
|
|
'size' => $charSize,
|
|
'angle' => $charAngle,
|
|
'box' => $bbox
|
|
|
|
);
|
|
|
|
}
|
|
|
|
// encode value
|
|
$value = md5(md5(md5($resultString)));
|
|
|
|
// if storage is "session", store the value in session
|
|
if ($storage == 'session') $_SESSION['captcha'] = $value;
|
|
|
|
// otherwise, store the value in a cookie
|
|
else setcookie('captcha', $value, time() + 3600, '/');
|
|
|
|
// either ways, the value will later be read by the form generator
|
|
// and used to see if the user entered the correct characters
|
|
|
|
// create the image
|
|
$img = imagecreatetruecolor($imageWidth, $imageHeight);
|
|
|
|
// allocate some colors
|
|
$white = imagecolorallocate($img, 255, 255, 255);
|
|
|
|
$black = imagecolorallocate($img, 0, 0, 0);
|
|
|
|
// fill the canvas to white
|
|
imagefilledrectangle($img, 0, 0, $imageWidth, $imageHeight, $white);
|
|
|
|
// write some random characters in the background
|
|
for ($i = 0; $i <10; $i++) {
|
|
|
|
// ...having random washed-out colors
|
|
$color = imagecolorallocate($img, rand(150, 200), rand(150, 200), rand(150, 200));
|
|
|
|
imagettftext(
|
|
$img,
|
|
20,
|
|
rand($fontAngleVariation[0],
|
|
$fontAngleVariation[1]),
|
|
rand(0, $imageWidth),
|
|
rand(20, $imageHeight) ,
|
|
$color,
|
|
$font,
|
|
chr(rand(65, 90))
|
|
);
|
|
|
|
}
|
|
|
|
// draw a bounding rectangle
|
|
// imagerectangle($img, 0, 0, $imageWidth - 1, $imageHeight - 1, $black);
|
|
|
|
// this is to keep the word centered in the box
|
|
$left = (($imageWidth - $totalWidth) / 2);
|
|
|
|
// iterate through the chosen characters
|
|
foreach ($captcha as $values) {
|
|
|
|
// print each character
|
|
imagettftext(
|
|
$img,
|
|
$values['size'],
|
|
$values['angle'],
|
|
$left ,
|
|
($imageHeight + $values['box']['height']) / 2 ,
|
|
$black,
|
|
$font,
|
|
$values['char']
|
|
);
|
|
|
|
// compute the position of the next character
|
|
$left += $values['box']['width'] + $characterSpacing;
|
|
|
|
}
|
|
|
|
// and finally output the image at the specified quality
|
|
imagejpeg($img, null, $imageQuality);
|
|
|
|
// free memory
|
|
imagedestroy($img);
|
|
|
|
// if we're performing a file upload
|
|
} elseif (
|
|
|
|
isset($_FILES) &&
|
|
is_array($_FILES) &&
|
|
!empty($_FILES) &&
|
|
isset($_GET['form']) &&
|
|
isset($_GET['control']) &&
|
|
isset($_FILES[$_GET['control']])
|
|
|
|
) {
|
|
|
|
function process() {
|
|
|
|
// the form that initiated the request
|
|
$form = $_GET['form'];
|
|
|
|
// the file upload control on the form that initiated the request
|
|
$control = $_GET['control'];
|
|
|
|
// if file could be uploaded
|
|
if (isset($_FILES[$_GET['control']])) {
|
|
|
|
// save some information about the uploaded file
|
|
$file['name'] = $_FILES[$control]['name'];
|
|
$file['type'] = $_FILES[$control]['type'];
|
|
$file['error'] = $_FILES[$control]['error'];
|
|
$file['size'] = $_FILES[$control]['size'];
|
|
|
|
// if there were problems uploading the file
|
|
} elseif (empty($_POST) && empty($_FILES) && isset($_SERVER['CONTENT_LENGTH']) && isset($_SERVER['CONTENT_TYPE']) && (strpos($_SERVER['CONTENT_TYPE'], 'multipart/form-data') !== false || strpos($_SERVER['CONTENT_TYPE'], 'application/x-www-form-urlencoded') !== false)) {
|
|
|
|
// send these values
|
|
$file['name'] = '';
|
|
$file['type'] = 'unknown';
|
|
$file['error'] = 1;
|
|
$file['size'] = $_SERVER['CONTENT_LENGTH'];
|
|
}
|
|
|
|
ob_start();
|
|
|
|
?>
|
|
|
|
<script type="text/javascript">
|
|
var f=parent.window.$('#<?php echo $form?>');
|
|
if(undefined!=f){
|
|
f.data('Zebra_Form').end_file_upload('<?php echo $control . '\'' . (isset($file) ? ',[\'' . addcslashes($file['name'], '\'') . '\',\'' . $file['type'] . '\',\'' . $file['error'] . '\',\'' . $file['size'] . '\']' : '')?>)
|
|
}
|
|
</script>
|
|
|
|
<?php
|
|
|
|
$contents = ob_get_contents();
|
|
|
|
ob_end_clean();
|
|
|
|
$patterns = array(
|
|
'/^\s*/m',
|
|
'/\r/m',
|
|
'/\n/m',
|
|
'/\r\n/m',
|
|
);
|
|
|
|
$replacements = array(
|
|
'',
|
|
);
|
|
|
|
echo preg_replace($patterns, $replacements, $contents);
|
|
|
|
}
|
|
|
|
register_shutdown_function('process');
|
|
|
|
}
|
|
|
|
?>
|