Friendly, easy, lightweight, self-hostable CAPTCHA service.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
Skylar Ittner 1c725e7170 Minor text fix 1 年之前
db_upgrade Add (much) better text questions. 3 年之前
images Initial commit 3 年之前
nbproject Initial commit 3 年之前
.gitignore Initial commit 3 年之前
.htaccess Rename captcheck.dist.js to captcheck.min.js, update docs 1 年之前
LICENSE Update license year 1 年之前
api.php Fix a thing 3 年之前
captcheck.css Override website theme link borders 2 年之前
captcheck.js Fix bug where some containers end up with two CAPTCHAs inside 1 年之前
captcheck.min.js Minor text fix 1 年之前
composer.json Initial commit 3 年之前
composer.lock Initial commit 3 年之前
database.mwb Add (much) better text questions. 3 年之前
database.sql Add (much) better text questions. 3 年之前
index.html Rename captcheck.dist.js to captcheck.min.js, update docs 1 年之前
logo.png Add logo 3 年之前 Rename captcheck.dist.js to captcheck.min.js, update docs 1 年之前
required.php Update readme, add SQL code, remove unused function in required.php 3 年之前
scrapetexts.php Add (much) better text questions. 3 年之前
settings.template.php Automatically delete old sessions 3 年之前
test.html Rename captcheck.dist.js to captcheck.min.js, update docs 1 年之前
test.php Improve output of test.php 2 年之前


Easy, light, self-hostable CAPTCHA service. Works on modern browsers (and IE9+). Uses a selection of icons from Font-Awesome. Text-only accessibility mode and support for keyboard-only operation.

Thanks to for supplying the data for the text CAPTCHA.

How to use

In your form, put an empty div with the class “captcheck_container”. Add captcheck.js (or captcheck.min.js) into your page.

<!DOCTYPE html>
        <title>Captcheck Sample Form</title>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <script src="captcheck.js"></script>
        <form action="submit.php">
            <input type="text" name="form_field" placeholder="Some random form field" />
            <div class="captcheck_container">
            <button type="submit">Submit Form</button>

When the form is submitted, your server will receive two extra form fields: captcheck_session_code and captcheck_selected_answer. In your form handling code, send a request to http(s)://captcheck-url/api.php. Pass the variables session_id and answer_id with the values sent with the form, and also pass the variable action with the value verify. You will receive a JSON response with (among other things) "result": true or "result": false. If result is false, the user failed the test, and another variable msg is available with an explanation.

Example URL: http(s)://captcheck-url/api.php?action=verify&session_id=<captcheck_session_code>&answer_id=<captcheck_selected_answer>

Example responses: {"session":"some_session_id","result":true} {"session":"some_session_id","result":false,"msg":"Answer incorrect."}

###Content-Security-Policy and Nonces

Add data-stylenonce="nonce_here" to the .captcheck_container div. If you have multiple CAPTCHAs on one page, only one of them needs the nonce specified.


  1. Run composer install.
  2. Copy settings.template.php to settings.php and plug in your settings.
  3. Install the database.
  4. Customize captcheck.js with the correct api_url.
  5. Follow the How to Use section and the example setup in test.html and test.php.

Execution Flow

JS = captcheck.js, API = api.php, FORM = parent form,
SITE = form processing code, -> = some action taken on the right by the left

JS -> API:      Request session ID, question, and answers (with scrambled random codes)
API -> JS:      Sends info, saves session ID, correct answer, and scrambled answer codes in DB
JS -> API:      Requests answer images by sending scrambled value and session ID
JS -> FORM:     Adds hidden field with value=session ID, displays question and images (or text box)
SITE -> API:    Sends session ID and answer
API -> SITE:    Responds with true/false to indicate if the answer is valid, marks session as expired to prevent CAPTCHA reuse