php+html实现鼠标光标跟随圆点绘图人机验证前后端代码

代码语言:php

所属分类:其他

代码描述:php+html实现鼠标光标跟随圆点绘图人机验证前后端代码,每次的图案不一样,有5次机会,5次错误后要等半个小时,数据加密传输。

代码标签: php html 鼠标 光标 跟随 圆点 绘图 人机 验证 代码

下面为部分代码预览,完整代码请点击下载或在bfwstudio webide中打开

<?php
// PHP 5.6 Compatible Version

// --- START: Configuration ---
define('RATE_LIMIT_FILE', dirname(__FILE__) . '/rate_limit_logs.json');
define('MAX_FAILURES', 5);
define('BLOCK_MINUTES', 30);
// --- END: Configuration ---

if (session_status() == PHP_SESSION_NONE) {
    session_start();
}

// --- All helper functions (get_ip_address, rate limiting, etc.) ---
function get_ip_address() {
    if (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) { return explode(',', $_SERVER['HTTP_X_FORWARDED_FOR'])[0]; }
    return isset($_SERVER['REMOTE_ADDR']) ? $_SERVER['REMOTE_ADDR'] : 'unknown';
}

function check_rate_limit_status($ip) {
    $now = time(); $fp = @fopen(RATE_LIMIT_FILE, 'r');
    if (!$fp) return array('is_blocked' => false, 'message' => '');
    flock($fp, LOCK_SH); $raw_data = stream_get_contents($fp); flock($fp, LOCK_UN); fclose($fp);
    $ip_data = empty($raw_data) ? array() : json_decode($raw_data, true);
    $record = isset($ip_data[$ip]) ? $ip_data[$ip] : array('block_until' => 0);
    if ($record['block_until'] > $now) {
        $remaining = ceil(($record['block_until'] - $now) / 60);
        return array('is_blocked' => true, 'message' => "尝试次数过多,请在 {$remaining} 分钟后重试。");
    }
    return array('is_blocked' => false, 'message' => '');
}

function record_failure_and_get_status($ip) {
    $now = time(); $fp = fopen(RATE_LIMIT_FILE, 'c+');
    if (!$fp || !flock($fp, LOCK_EX)) { if ($fp) fclose($fp); return array('is_blocked' => false, 'message' => '无法写入日志'); }
    $raw_data = stream_get_contents($fp);
    $ip_data = empty($raw_data) ? array() : json_decode($raw_data, true);
    $record = isset($ip_data[$ip]) ? $ip_data[$ip] : array('failures' => 0, 'block_until' => 0);
    if (isset($record['block_until']) && $record['block_until'] > 0 && $record['block_until'] < $now) { $record['failures'] = 0; }
    $record['failures'] = isset($record['failures']) ? $record['failures'] + 1 : 1;
    $message = ''; $is_blocked = false;
    if ($record['failures'] >= MAX_FAILURES) {
        $record['block_until'] = $now + (BLOCK_MINUTES * 60);
        $remaining = BLOCK_MINUTES;
        $message = "尝试次数过多,请在 {$remaining} 分钟后重试。";
        $is_blocked = true;
    }
    $ip_data[$ip] = $record;
    ftruncate($fp, 0); rewind($fp); fwrite($fp, json_encode($ip_data)); flock($fp, LOCK_UN); fclose($fp);
    return array('is_blocked' => $is_blocked, 'message' => $message);
}

/**
 * Defines the shapes for tracing.
 */
function get_shapes() {
    $spiral_points = array();
    for ($i = 0; $i < 720; $i += 5) {
        $angle = 0.1 * $i;
        $radius = 0.05 + 0.45 * ($i / 720);
        $spiral_points[] = array(
            0.5 + $radius * cos(deg2rad($angle - 90)),
            0.5 + $radius * sin(deg2rad($angle - 90))
        );
    }

    $heart_points = array();
    for ($i = 0; $i <= 360; $i += 4) {
        $t = deg2rad($i);
        $heart_points[] = array(
            0.5 + 0.03 * (16 * pow(sin($t), 3)),
            0.5 - 0.03 * (13 * cos($t) - 5 * cos(2*$t) - 2 * cos(3*$t) - cos(4*$t))
        );
    }

    return array(
        �.........完整代码请登录后点击上方下载按钮下载查看

网友评论0