Skylar Ittner 1 год назад
Сommit
563399081b
45 измененных файлов: 503 добавлений и 0 удалений
  1. 5
    0
      .gitignore
  2. 9
    0
      LICENSE
  3. 90
    0
      api.php
  4. 58
    0
      captcheck.js
  5. 5
    0
      composer.json
  6. 77
    0
      composer.lock
  7. Двоичные данные
      database.mwb
  8. Двоичные данные
      images/bolt.png
  9. Двоичные данные
      images/building.png
  10. Двоичные данные
      images/camera.png
  11. Двоичные данные
      images/circle.png
  12. Двоичные данные
      images/cloud.png
  13. Двоичные данные
      images/cog.png
  14. Двоичные данные
      images/cube.png
  15. Двоичные данные
      images/envelope.png
  16. Двоичные данные
      images/female.png
  17. Двоичные данные
      images/file-o.png
  18. Двоичные данные
      images/flag.png
  19. Двоичные данные
      images/globe.png
  20. Двоичные данные
      images/heart.png
  21. Двоичные данные
      images/male.png
  22. Двоичные данные
      images/mobile.png
  23. Двоичные данные
      images/moon-o.png
  24. Двоичные данные
      images/paint-brush.png
  25. Двоичные данные
      images/pencil.png
  26. Двоичные данные
      images/picture-o.png
  27. Двоичные данные
      images/plane.png
  28. Двоичные данные
      images/print.png
  29. Двоичные данные
      images/puzzle-piece.png
  30. Двоичные данные
      images/shopping-basket.png
  31. Двоичные данные
      images/snowflake-o.png
  32. Двоичные данные
      images/square.png
  33. Двоичные данные
      images/star.png
  34. Двоичные данные
      images/sun-o.png
  35. Двоичные данные
      images/tree.png
  36. Двоичные данные
      images/truck.png
  37. Двоичные данные
      images/umbrella.png
  38. 2
    0
      index.php
  39. 7
    0
      nbproject/project.properties
  40. 9
    0
      nbproject/project.xml
  41. 60
    0
      readme.md
  42. 144
    0
      required.php
  43. 14
    0
      settings.template.php
  44. 17
    0
      test.html
  45. 6
    0
      test.php

+ 5
- 0
.gitignore Просмотреть файл

@@ -0,0 +1,5 @@
1
+nbproject/private
2
+settings.php
3
+database.mwb.bak
4
+debug
5
+vendor

+ 9
- 0
LICENSE Просмотреть файл

@@ -0,0 +1,9 @@
1
+Copyright (C) 2017 Netsyms Technologies.
2
+
3
+Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
4
+
5
+The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
6
+
7
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL NETSYMS TECHNOLOGIES BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
8
+
9
+Except as contained in this notice, the name and other identifying marks of Netsyms Technologies shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization from Netsyms Technologies.

+ 90
- 0
api.php Просмотреть файл

@@ -0,0 +1,90 @@
1
+<?php
2
+
3
+require __DIR__ . '/required.php';
4
+header("Content-Type: application/json");
5
+
6
+switch ($VARS['action']) {
7
+    case "ping":
8
+        $out = ["status" => "OK", "pong" => true];
9
+        exit(json_encode($out));
10
+    case "new":
11
+        // generate unique session ID that has an essentially zero chance of being a duplicate.
12
+        // Contains a hash of a secure random number, a hash of the user's IP, and 23 uniqid() characters.
13
+        $skey = uniqid(substr(hash("md5", mt_rand()), 3, 5) . hash("md5", getUserIP()), true);
14
+        $answers = $database->select('answers', ['aid', 'aname']);
15
+        shuffle($answers);
16
+        $answers = array_slice($answers, 0, 5);
17
+        //var_dump($answers);
18
+        $correct_answer = $answers[mt_rand(0, count($answers) - 1)];
19
+        $scrambled = ["real" => [], "fake" => []];
20
+        foreach ($answers as $a) {
21
+            $scrambled["real"][] = $a['aid'];
22
+            $scrambled["fake"][] = substr(hash("md5", mt_rand()), 0, 20);
23
+        }
24
+        $database->insert("sessions", ["skey" => $skey, "aid" => $correct_answer['aid'], "expired" => 0, "#timestamp" => "NOW()"]);
25
+        $sid = $database->id();
26
+        $scrambled_insert = [];
27
+        for ($i = 0; $i < count($scrambled['real']); $i++) {
28
+            $scrambled_insert[] = ["sid" => $sid, "aid" => $scrambled['real'][$i], "acode" => $scrambled['fake'][$i]];
29
+        }
30
+        $database->insert("scrambled_answers", $scrambled_insert);
31
+        $resp = [
32
+            "session" => $skey,
33
+            "question" => $correct_answer['aname'],
34
+            "answers" => $scrambled["fake"]
35
+        ];
36
+        exit(json_encode($resp));
37
+    case "img":
38
+        if (!$database->has('sessions', ['skey' => $VARS['s']])) {
39
+            sendError("Missing or invalid session ID.", "client");
40
+        }
41
+        $sid = $database->get('sessions', 'sid', ['skey' => $VARS['s']]);
42
+        if (!$database->has("scrambled_answers", ["AND" => ["sid" => $sid, "acode" => $VARS['c']]])) {
43
+            sendError("Missing or invalid image code.", "client");
44
+        }
45
+        $imgid = $database->get("scrambled_answers", ["[>]answers" => ["aid" => "aid"]], 'aimg', ["AND" => ["sid" => $sid, "acode" => $VARS['c']]]);
46
+        /* Load image, add some black/white noise, and send */
47
+        header('Content-Type: image/png');
48
+        $imgpath = __DIR__ . "/images/" . $imgid . ".png";
49
+        if (DEBUG) {
50
+            file_put_contents("debug", $imgpath . "\n", FILE_APPEND);
51
+        }
52
+        $img = imagecreatefrompng($imgpath);
53
+        imageAlphaBlending($img, true);
54
+        imageSaveAlpha($img, true);
55
+        $black = imagecolorallocate($img, 0, 0, 0);
56
+        $white = imagecolorallocate($img, 255, 255, 255);
57
+        for ($i = 0; $i < 512; $i++) {
58
+            imagesetpixel($img, mt_rand(0, 63), mt_rand(0, 63), $black);
59
+        }
60
+        for ($i = 0; $i < 256; $i++) {
61
+            imagesetpixel($img, mt_rand(0, 63), mt_rand(0, 63), $white);
62
+        }
63
+        imagepng($img);
64
+        exit();
65
+    case "verify":
66
+        if (!$database->has('sessions', ['skey' => $VARS['session_id']])) {
67
+            echo json_encode(["session" => $VARS['session_id'], "result" => false, "msg" => "Session invalid."]);
68
+            exit();
69
+        }
70
+        $sid = $database->get('sessions', 'sid', ['skey' => $VARS['session_id']]);
71
+        $expired = ($database->get('sessions', 'expired', ['skey' => $VARS['session_id']]) == 1 ? true : false);
72
+        if ($expired) {
73
+            echo json_encode(["session" => $VARS['session_id'], "result" => false, "msg" => "Session key already used."]);
74
+            exit();
75
+        }
76
+        if (!$database->has("scrambled_answers", ["AND" => ["sid" => $sid, "acode" => $VARS['answer_id']]])) {
77
+            echo json_encode(["session" => $VARS['session_id'], "result" => false, "msg" => "Answer invalid."]);
78
+            exit();
79
+        }
80
+        $aid = $database->get('scrambled_answers', 'aid', ["AND" => ["sid" => $sid, "acode" => $VARS['answer_id']]]);
81
+        if ($database->has('sessions', ["AND" => ["sid" => $sid, "aid" => $aid]])) {
82
+            echo json_encode(["session" => $VARS['session_id'], "result" => true]);
83
+        } else {
84
+            echo json_encode(["session" => $VARS['session_id'], "result" => false, "msg" => "Answer incorrect."]);
85
+        }
86
+        $database->update("sessions", ['expired' => 1], ["sid" => $sid]);
87
+        exit();
88
+    default:
89
+        sendError("Bad Request", "client");
90
+}

+ 58
- 0
captcheck.js Просмотреть файл

@@ -0,0 +1,58 @@
1
+window.onload = function () {
2
+    var api_url = "http://192.168.25.1/captcheck/api.php";
3
+    var getJSON = function (url, callback) {
4
+        var xhr = new XMLHttpRequest();
5
+        xhr.open('GET', url, true);
6
+        xhr.onreadystatechange = function () {
7
+            if (this.readyState == 4) {
8
+                callback(this.status, this.responseText);
9
+            }
10
+        };
11
+        xhr.send();
12
+    };
13
+    getJSON(api_url + "?action=new", function (status, json) {
14
+        /* Add custom styles */
15
+        var styles = document.createElement('style');
16
+        styles.innerHTML = ".captcheck_box {font-family: Ubuntu, Arial, sans-serif; border: 1px solid #e0e0e0; border-radius: 3px; display: inline-block; padding: 3px; margin: 5px 2px 5px 1px; background-color: #f5f5f5;} .captcheck_answer_label > input {visibility: hidden; position: absolute;} .captcheck_answer_label > input + img {cursor: pointer; border: 2px solid transparent; border-radius: 3px; min-width: 32px; width: 18%; max-width: 64px;} .captcheck_answer_label > input:checked + img {cursor: pointer; border: 2px solid #424242; border-radius: 3px;} .captcheck_error_message { color: red; }";
17
+        document.body.appendChild(styles);
18
+
19
+        /* Get captcha container div */
20
+        var container = document.getElementById("captcheck_container");
21
+        /* Create captcha div */
22
+        var captcha = document.createElement("div");
23
+        captcha.setAttribute("class", "captcheck_box");
24
+        container.appendChild(captcha);
25
+        
26
+        if (status == 200) {
27
+            var data = JSON.parse(json);
28
+            /* Create answer buttons */
29
+            var answers = "";
30
+            for (var i = 0, len = data.answers.length; i < len; i++) {
31
+                var src = api_url + "?action=img&s=" + data.session + "&c=" + data.answers[i];
32
+                answers += "<span class='captcheck_answer_label' onclick='chooseAnswer(\"" + data.answers[i] + "\")'><input id='captcheck_answer_" + data.answers[i] + "' type='radio' name='captcheck_selected_answer' value='" + data.answers[i] + "' /><img src='" + src + "' /></span>";
33
+            }
34
+            var answer_div = document.createElement("div");
35
+            answer_div.innerHTML = answers;
36
+            /* Create question */
37
+            var question_div = document.createElement("div");
38
+            question_div.innerHTML = "Click on the <b>" + data.question + "</b>:";
39
+
40
+            /* Add question and answers */
41
+            captcha.appendChild(question_div);
42
+            captcha.appendChild(answer_div);
43
+
44
+            /* Add hidden session ID element */
45
+            var skey_input = document.createElement("span");
46
+            skey_input.innerHTML = "<input type='hidden' name='captcheck_session_code' value='" + data.session + "' />";
47
+            captcha.appendChild(skey_input);
48
+        } else {
49
+            /* Add error message */
50
+            captcha.innerHTML = "<span class='captcheck_error_message'>There was a problem loading the CAPTCHA.</span>";
51
+        }
52
+    });
53
+}
54
+
55
+function chooseAnswer(ans) {
56
+    var box = document.getElementById("captcheck_answer_" + ans);
57
+    box.checked = true;
58
+}

+ 5
- 0
composer.json Просмотреть файл

@@ -0,0 +1,5 @@
1
+{
2
+    "require": {
3
+        "catfan/medoo": "^1.4"
4
+    }
5
+}

+ 77
- 0
composer.lock Просмотреть файл

@@ -0,0 +1,77 @@
1
+{
2
+    "_readme": [
3
+        "This file locks the dependencies of your project to a known state",
4
+        "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file",
5
+        "This file is @generated automatically"
6
+    ],
7
+    "content-hash": "3d60b6d6d1ba750afa45d307e067f006",
8
+    "packages": [
9
+        {
10
+            "name": "catfan/medoo",
11
+            "version": "v1.4.4",
12
+            "source": {
13
+                "type": "git",
14
+                "url": "https://github.com/catfan/Medoo.git",
15
+                "reference": "bcabbef4d8355d52fc4d19f17463e5e816c9ef44"
16
+            },
17
+            "dist": {
18
+                "type": "zip",
19
+                "url": "https://api.github.com/repos/catfan/Medoo/zipball/bcabbef4d8355d52fc4d19f17463e5e816c9ef44",
20
+                "reference": "bcabbef4d8355d52fc4d19f17463e5e816c9ef44",
21
+                "shasum": ""
22
+            },
23
+            "require": {
24
+                "ext-pdo": "*",
25
+                "php": ">=5.4"
26
+            },
27
+            "suggest": {
28
+                "ext-pdo_dblib": "For MSSQL or Sybase database on Linux/UNIX platform",
29
+                "ext-pdo_mysql": "For MySQL or MariaDB database",
30
+                "ext-pdo_oci": "For Oracle database",
31
+                "ext-pdo_oci8": "For Oracle version 8 database",
32
+                "ext-pdo_pqsql": "For PostgreSQL database",
33
+                "ext-pdo_sqlite": "For SQLite database",
34
+                "ext-pdo_sqlsrv": "For MSSQL database on Windows platform"
35
+            },
36
+            "type": "framework",
37
+            "autoload": {
38
+                "psr-4": {
39
+                    "Medoo\\": "/src"
40
+                }
41
+            },
42
+            "notification-url": "https://packagist.org/downloads/",
43
+            "license": [
44
+                "MIT"
45
+            ],
46
+            "authors": [
47
+                {
48
+                    "name": "Angel Lai",
49
+                    "email": "angel@catfan.me"
50
+                }
51
+            ],
52
+            "description": "The lightest PHP database framework to accelerate development",
53
+            "homepage": "https://medoo.in",
54
+            "keywords": [
55
+                "database",
56
+                "lightweight",
57
+                "mariadb",
58
+                "mssql",
59
+                "mysql",
60
+                "oracle",
61
+                "php framework",
62
+                "postgresql",
63
+                "sql",
64
+                "sqlite"
65
+            ],
66
+            "time": "2017-06-02T15:25:04+00:00"
67
+        }
68
+    ],
69
+    "packages-dev": [],
70
+    "aliases": [],
71
+    "minimum-stability": "stable",
72
+    "stability-flags": [],
73
+    "prefer-stable": false,
74
+    "prefer-lowest": false,
75
+    "platform": [],
76
+    "platform-dev": []
77
+}

Двоичные данные
database.mwb Просмотреть файл


Двоичные данные
images/bolt.png Просмотреть файл


Двоичные данные
images/building.png Просмотреть файл


Двоичные данные
images/camera.png Просмотреть файл


Двоичные данные
images/circle.png Просмотреть файл


Двоичные данные
images/cloud.png Просмотреть файл


Двоичные данные
images/cog.png Просмотреть файл


Двоичные данные
images/cube.png Просмотреть файл


Двоичные данные
images/envelope.png Просмотреть файл


Двоичные данные
images/female.png Просмотреть файл


Двоичные данные
images/file-o.png Просмотреть файл


Двоичные данные
images/flag.png Просмотреть файл


Двоичные данные
images/globe.png Просмотреть файл


Двоичные данные
images/heart.png Просмотреть файл


Двоичные данные
images/male.png Просмотреть файл


Двоичные данные
images/mobile.png Просмотреть файл


Двоичные данные
images/moon-o.png Просмотреть файл


Двоичные данные
images/paint-brush.png Просмотреть файл


Двоичные данные
images/pencil.png Просмотреть файл


Двоичные данные
images/picture-o.png Просмотреть файл


Двоичные данные
images/plane.png Просмотреть файл


Двоичные данные
images/print.png Просмотреть файл


Двоичные данные
images/puzzle-piece.png Просмотреть файл


Двоичные данные
images/shopping-basket.png Просмотреть файл


Двоичные данные
images/snowflake-o.png Просмотреть файл


Двоичные данные
images/square.png Просмотреть файл


Двоичные данные
images/star.png Просмотреть файл


Двоичные данные
images/sun-o.png Просмотреть файл


Двоичные данные
images/tree.png Просмотреть файл


Двоичные данные
images/truck.png Просмотреть файл


Двоичные данные
images/umbrella.png Просмотреть файл


+ 2
- 0
index.php Просмотреть файл

@@ -0,0 +1,2 @@
1
+<?php
2
+header("Location: test.html");

+ 7
- 0
nbproject/project.properties Просмотреть файл

@@ -0,0 +1,7 @@
1
+include.path=${php.global.include.path}
2
+php.version=PHP_70
3
+source.encoding=UTF-8
4
+src.dir=.
5
+tags.asp=false
6
+tags.short=false
7
+web.root=.

+ 9
- 0
nbproject/project.xml Просмотреть файл

@@ -0,0 +1,9 @@
1
+<?xml version="1.0" encoding="UTF-8"?>
2
+<project xmlns="http://www.netbeans.org/ns/project/1">
3
+    <type>org.netbeans.modules.php.project</type>
4
+    <configuration>
5
+        <data xmlns="http://www.netbeans.org/ns/php-project/1">
6
+            <name>Captcheck</name>
7
+        </data>
8
+    </configuration>
9
+</project>

+ 60
- 0
readme.md Просмотреть файл

@@ -0,0 +1,60 @@
1
+Captcheck
2
+=========
3
+
4
+Easy, light, self-hostable CAPTCHA service.  Works on all modern browsers and 
5
+IE9+.  Uses icons from Font-Awesome.
6
+
7
+How to use
8
+----------
9
+
10
+In your form, put an empty div with the ID "captcheck_container". 
11
+Add `captcheck.js` into your page.
12
+
13
+    <!DOCTYPE html>
14
+    <html>
15
+        <head>
16
+            <title>Captcheck Sample Form</title>
17
+            <meta charset="UTF-8">
18
+            <meta name="viewport" content="width=device-width, initial-scale=1.0">
19
+            <script src="captcheck.js"></script>
20
+        </head>
21
+        <body>
22
+            <form action="submit.php">
23
+                <input type="text" name="form_field" placeholder="Some random form field" />
24
+                <div id="captcheck_container">
25
+                </div>
26
+                <button type="submit">Submit Form</button>
27
+            </form>
28
+        </body>
29
+    </html>
30
+
31
+When the form is submitted, your server will receive two extra form fields: 
32
+`captcheck_session_code` and `captcheck_selected_answer`.
33
+In your form handling code, send a request to `http(s)://captcheck-url/api.php`. 
34
+Pass the variables `session_id` and `answer_id` with the values sent with the form, 
35
+and also pass the variable `action` with the value `verify`.  
36
+You will receive a JSON response with (among other things) `"result": true` or 
37
+`"result": false`.  If result is false, the user failed the test, and another 
38
+variable `msg` is available with an explanation.
39
+
40
+Example URL:  
41
+`http(s)://captcheck-url/api.php?action=verify&session_id=<captcheck_session_code>&answer_id=<captcheck_selected_answer>`
42
+
43
+Example responses:  
44
+`{"session":"some_session_id","result":true}`  
45
+`{"session":"some_session_id","result":false,"msg":"Answer incorrect."}`
46
+
47
+
48
+Execution Flow
49
+--------------
50
+
51
+    JS = captcheck.js, API = api.php, FORM = parent form, 
52
+    SITE = form processing code, -> = some action taken on the right by the left
53
+
54
+    JS -> API:      Request session ID, question, and answers (with scrambled random codes)
55
+    API -> JS:      Sends info, saves session ID, correct answer, and scrambled answer codes in DB
56
+    JS -> API:      Requests answer images by sending scrambled value and session ID
57
+    JS -> FORM:     Adds hidden field with value=session ID, displays question and images
58
+    [USER SUBMITS FORM]
59
+    SITE -> API:    Sends session ID and scrambled answer
60
+    API -> SITE:    Responds with true/false to indicate if the answer is valid, marks session as expired to prevent CAPTCHA reuse

+ 144
- 0
required.php Просмотреть файл

@@ -0,0 +1,144 @@
1
+<?php
2
+
3
+/**
4
+ * This file contains global settings and utility functions.
5
+ */
6
+ob_start(); // allow sending headers after content
7
+//
8
+// Unicode, solves almost all stupid encoding problems
9
+header('Content-Type: application/json; charset=utf-8');
10
+header('X-Content-Type-Options: nosniff');
11
+header('Access-Control-Allow-Origin: *');
12
+
13
+
14
+$session_length = (60 * 60) * 8; // 1 hour x 8 = 8 hours
15
+session_set_cookie_params($session_length, "/", null, false, true);
16
+
17
+session_start(); // stick some cookies in it
18
+// renew session cookie
19
+setcookie(session_name(), session_id(), time() + $session_length);
20
+
21
+// Composer
22
+require __DIR__ . '/vendor/autoload.php';
23
+
24
+require __DIR__ . '/settings.php';
25
+
26
+/**
27
+ * Kill off the running process and spit out an error message
28
+ * @param string $error error message
29
+ * @param string $fault who's fault the error is: "server" (default) or "client".
30
+ */
31
+function sendError($error, $fault = "server") {
32
+    if ($fault == "server") {
33
+        header('HTTP/1.1 500 Internal Server Error');
34
+        $code = 500;
35
+    } else {
36
+        header('HTTP/1.1 400 Bad Request');
37
+        $code = 400;
38
+    }
39
+    die(json_encode(["error" => $error, "code" => $code]));
40
+}
41
+
42
+// Database settings
43
+// Also inits database and stuff
44
+use Medoo\Medoo;
45
+
46
+$database;
47
+try {
48
+    $database = new Medoo([
49
+        'database_type' => DB_TYPE,
50
+        'database_name' => DB_NAME,
51
+        'server' => DB_SERVER,
52
+        'username' => DB_USER,
53
+        'password' => DB_PASS,
54
+        'charset' => DB_CHARSET
55
+    ]);
56
+} catch (Exception $ex) {
57
+    sendError("Database error.  Try again later.");
58
+}
59
+
60
+
61
+if (!DEBUG) {
62
+    error_reporting(0);
63
+} else {
64
+    error_reporting(E_ALL);
65
+    ini_set('display_errors', 'On');
66
+}
67
+
68
+
69
+$VARS;
70
+if ($_SERVER['REQUEST_METHOD'] === 'POST') {
71
+    $VARS = $_POST;
72
+    define("GET", false);
73
+} else {
74
+    $VARS = $_GET;
75
+    define("GET", true);
76
+}
77
+
78
+/**
79
+ * Checks if a string or whatever is empty.
80
+ * @param $str The thingy to check
81
+ * @return boolean True if it's empty or whatever.
82
+ */
83
+function is_empty($str) {
84
+    return (is_null($str) || !isset($str) || $str == '');
85
+}
86
+
87
+/*
88
+ * http://stackoverflow.com/a/20075147/2534036
89
+ */
90
+if (!function_exists('base_url')) {
91
+
92
+    function base_url($atRoot = FALSE, $atCore = FALSE, $parse = FALSE) {
93
+        if (isset($_SERVER['HTTP_HOST'])) {
94
+            $http = isset($_SERVER['HTTPS']) && strtolower($_SERVER['HTTPS']) !== 'off' ? 'https' : 'http';
95
+            $hostname = $_SERVER['HTTP_HOST'];
96
+            $dir = str_replace(basename($_SERVER['SCRIPT_NAME']), '', $_SERVER['SCRIPT_NAME']);
97
+
98
+            $core = preg_split('@/@', str_replace($_SERVER['DOCUMENT_ROOT'], '', realpath(dirname(__FILE__))), NULL, PREG_SPLIT_NO_EMPTY);
99
+            $core = $core[0];
100
+
101
+            $tmplt = $atRoot ? ($atCore ? "%s://%s/%s/" : "%s://%s/") : ($atCore ? "%s://%s/%s/" : "%s://%s%s");
102
+            $end = $atRoot ? ($atCore ? $core : $hostname) : ($atCore ? $core : $dir);
103
+            $base_url = sprintf($tmplt, $http, $hostname, $end);
104
+        } else
105
+            $base_url = 'http://localhost/';
106
+
107
+        if ($parse) {
108
+            $base_url = parse_url($base_url);
109
+            if (isset($base_url['path']))
110
+                if ($base_url['path'] == '/')
111
+                    $base_url['path'] = '';
112
+        }
113
+
114
+        return $base_url;
115
+    }
116
+
117
+}
118
+
119
+
120
+/**
121
+ * Attempts to discover the user's IP address.
122
+ * @return string IP string or "NOT FOUND".
123
+ */
124
+function getUserIP() {
125
+    $ip = "";
126
+    if (isset($_SERVER["HTTP_CF_CONNECTING_IP"])) {
127
+        $ip = $_SERVER["HTTP_CF_CONNECTING_IP"];
128
+    } else if (isset($_SERVER["HTTP_CLIENT_IP"])) {
129
+        $ip = $_SERVER["HTTP_CLIENT_IP"];
130
+    } else if (isset($_SERVER["HTTP_X_FORWARDED_FOR"])) {
131
+        $ip = $_SERVER["HTTP_X_FORWARDED_FOR"];
132
+    } else if (isset($_SERVER["HTTP_X_FORWARDED"])) {
133
+        $ip = $_SERVER["HTTP_X_FORWARDED"];
134
+    } else if (isset($_SERVER["HTTP_FORWARDED_FOR"])) {
135
+        $ip = $_SERVER["HTTP_FORWARDED_FOR"];
136
+    } else if (isset($_SERVER["HTTP_FORWARDED"])) {
137
+        $ip = $_SERVER["HTTP_FORWARDED"];
138
+    } else if (isset($_SERVER["REMOTE_ADDR"])) {
139
+        $ip = $_SERVER["REMOTE_ADDR"];
140
+    } else {
141
+        $ip = "NOT FOUND";
142
+    }
143
+    return $ip;
144
+}

+ 14
- 0
settings.template.php Просмотреть файл

@@ -0,0 +1,14 @@
1
+<?php
2
+
3
+// Whether to show debugging data in output.
4
+// DO NOT SET TO TRUE IN PRODUCTION!!!
5
+define("DEBUG", false);
6
+
7
+// Database connection settings
8
+// See http://medoo.in/api/new for info
9
+define("DB_TYPE", "mysql");
10
+define("DB_NAME", "captcheck");
11
+define("DB_SERVER", "localhost");
12
+define("DB_USER", "");
13
+define("DB_PASS", "");
14
+define("DB_CHARSET", "utf8");

+ 17
- 0
test.html Просмотреть файл

@@ -0,0 +1,17 @@
1
+<!DOCTYPE html>
2
+<html>
3
+    <head>
4
+        <title>Captcheck Test Page</title>
5
+        <meta charset="UTF-8">
6
+        <meta name="viewport" content="width=device-width, initial-scale=1.0">
7
+        <script src="captcheck.js"></script>
8
+    </head>
9
+    <body>
10
+        <form action="test.php" method="GET">
11
+            <input type="text" name="junk" placeholder="Junk" />
12
+            <div id="captcheck_container">
13
+            </div>
14
+            <button type="submit">Submit Form</button>
15
+        </form>
16
+    </body>
17
+</html>

+ 6
- 0
test.php Просмотреть файл

@@ -0,0 +1,6 @@
1
+<?php
2
+
3
+//header("Content-Type: application/json");
4
+header("Content-Type: text/plain");
5
+
6
+echo json_encode(["get" => $_GET, "api" => json_decode(file_get_contents("http://localhost/captcheck/api.php?action=verify&session_id=" . $_GET["captcheck_session_code"] . "&answer_id=".$_GET["captcheck_selected_answer"]), true)]);

Загрузка…
Отмена
Сохранить