summaryrefslogtreecommitdiff
path: root/captcha.php
diff options
context:
space:
mode:
Diffstat (limited to 'captcha.php')
-rwxr-xr-xcaptcha.php126
1 files changed, 91 insertions, 35 deletions
diff --git a/captcha.php b/captcha.php
index 21da034..a92b0ee 100755
--- a/captcha.php
+++ b/captcha.php
@@ -1,47 +1,104 @@
<?php
if(
- !isset($_GET["k"]) ||
+ isset($_GET["v"]) === false ||
+ is_array($_GET["v"]) === true ||
preg_match(
- '/^c\.[0-9]+$/',
- $_GET["k"]
- )
+ '/^c[0-9]+\.[A-Za-z0-9_]{20}$/',
+ $_GET["v"]
+ ) === 0
){
+ http_response_code(401);
header("Content-Type: text/plain");
- echo "Fuck you";
+ echo "Fuck my feathered cloaca";
die();
}
-header("Content-Type: image/jpeg");
+//header("Content-Type: image/jpeg");
+include "data/config.php";
+
+if(config::BOT_PROTECTION !== 1){
+
+ header("Content-Type: text/plain");
+ echo "The IQ test is disabled";
+ die();
+}
-$grid = apcu_fetch($_GET["k"]);
+$grid = apcu_fetch($_GET["v"]);
-if(
- $grid === false ||
- $grid[3] === true // has already been generated
-){
+if($grid !== false){
+ // captcha already generated
http_response_code(304); // not modified
die();
}
+header("Content-Type: image/jpeg");
header("Last-Modified: Thu, 01 Oct 1970 00:00:00 GMT");
-// only generate one captcha with this config
+// ** generate captcha data
+// get the positions for the answers
+// will return between 3 and 6 answer positions
+$range = range(0, 15);
+$answer_pos = [];
+
+array_splice($range, 0, 1);
+
+$picks = random_int(3, 6);
+
+for($i=0; $i<$picks; $i++){
+
+ $answer_pos_tmp =
+ array_splice(
+ $range,
+ random_int(
+ 0,
+ 14 - $i
+ ),
+ 1
+ );
+
+ $answer_pos[] = $answer_pos_tmp[0];
+}
+
+// choose a dataset
+$c = count(config::CAPTCHA_DATASET);
+$choosen = config::CAPTCHA_DATASET[random_int(0, $c - 1)];
+$choices = [];
+
+for($i=0; $i<$c; $i++){
+
+ if(config::CAPTCHA_DATASET[$i][0] == $choosen[0]){
+
+ continue;
+ }
+
+ $choices[] = config::CAPTCHA_DATASET[$i];
+}
+
+// generate grid data
+$grid = [];
+
+for($i=0; $i<16; $i++){
+
+ if(in_array($i, $answer_pos)){
+
+ $grid[] = $choosen;
+ }else{
+
+ $grid[] = $choices[random_int(0, count($choices) - 1)];
+ }
+}
+
+// store grid data for form validation on captcha_gen.php
apcu_store(
- $_GET["k"],
- [
- $grid[0],
- $grid[1],
- $grid[2],
- true // has captcha been generated?
- ],
- 120 // we give user another 2 minutes to solve
+ $_GET["v"],
+ $answer_pos,
+ 60 // we give user 1 minute to solve
);
// generate image
-
if(random_int(0,1) === 0){
$theme = [
@@ -57,7 +114,7 @@ if(random_int(0,1) === 0){
}
$im = new Imagick();
-$im->newImage(400, 400, $theme["bg"]);
+$im->newImage(400, 427, $theme["bg"]);
$im->setImageBackgroundColor($theme["bg"]);
$im->setImageFormat("jpg");
@@ -76,12 +133,18 @@ for($y=0; $y<4; $y++){
for($x=0; $x<4; $x++){
- $tmp = new Imagick("./data/captcha/" . $grid[0][$i][0] . "/" . random_int(1, $grid[0][$i][1]) . ".png");
+ $tmp = new Imagick("./data/captcha/" . $grid[$i][0] . "/" . random_int(1, $grid[$i][1]) . ".png");
// convert transparency correctly
$tmp->setImageBackgroundColor("black");
$tmp->setImageAlphaChannel(Imagick::ALPHACHANNEL_REMOVE);
-
+
+ // randomly mirror
+ if(random_int(0,1) === 1){
+
+ $tmp->flopImage();
+ }
+
// distort $tmp
$tmp->distortImage(
$distort[random_int(0,1)],
@@ -101,21 +164,15 @@ for($y=0; $y<4; $y++){
false
);
+ $tmp->addNoiseImage($noise[random_int(0, 1)]);
+
// append image
- $im->compositeImage($tmp->getImage(), Imagick::COMPOSITE_DEFAULT, $x * 100, $y * 100);
+ $im->compositeImage($tmp->getImage(), Imagick::COMPOSITE_DEFAULT, $x * 100, ($y * 100) + 27);
$i++;
}
}
-// add noise
-$im->addNoiseImage($noise[random_int(0, 1)]);
-
-// expand top of image
-$im->setImageGravity(Imagick::GRAVITY_SOUTH);
-$im->chopImage(0, -27, 400, 400);
-$im->extentImage(0, 0, 0, -27);
-
// add text
$draw = new ImagickDraw();
$draw->setFontSize(20);
@@ -123,7 +180,7 @@ $draw->setFillColor($theme["fg"]);
//$draw->setTextAntialias(false);
$draw->setFont("./data/captcha/font.ttf");
-$text = "Pick " . $grid[1] . " images of " . str_replace("_", " ", $grid[2]);
+$text = "Pick " . $picks . " images of " . str_replace("_", " ", $choosen[0]);
$pos = 200 - ($im->queryFontMetrics($draw, $text)["textWidth"] / 2);
@@ -143,5 +200,4 @@ for($i=0; $i<strlen($text); $i++){
$im->setFormat("jpeg");
$im->setImageCompressionQuality(90);
-$im->setImageCompression(Imagick::COMPRESSION_JPEG2000);
echo $im->getImageBlob();