php实现请求限流人机验证真人验证代码

代码语言:php

所属分类:其他

代码描述:php实现请求限流人机验证真人验证代码,可检测是否机器爬虫操作进行验证,可手动触发验证机制,可设置频率。

代码标签: php 请求 限流 人机 验证 真人 代码

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

<?php
/**
 * guard.php - PHP 5.6 单文件人机验证脚本
 * 用法:在任意需要保护的 PHP 页顶引入:require __DIR__.'/guard.php';
 * 提示:必须在任何输出前引入,否则 setcookie/header 可能失败。
 */

if (!defined('GUARD_LOADED')) {
    define('GUARD_LOADED', 1);

    // ========== 配置 ==========
    $GUARD = array(
        'secret'              => 'CHANGE1_ME_TO_A_RANDOM_32_64_CHARS', // 必改
        'cookie_name'         => 'guard_clearance',
        'cookie_ttl'          => 10,  // clearance 生效时长(秒)
        'rate_limit_per_min'  => 2,   // 每分钟最大请求数(超过触发挑战)
        'challenge_wait'      => 3,     // 挑战页等待秒数
        'trust_proxy'         => false, // 若站点在可信代理后,请根据实际开启并正确取源 IP
        'force_param'         => 'guard_verify', // 手动触发验证的 GET 参数
    );

    // ========== Polyfill ==========
    if (!function_exists('hash_equals')) {
        function hash_equals($a, $b) {
            if (!is_string($a) || !is_string($b) || strlen($a) !== strlen($b)) return false;
            $res = $a ^ $b;
            $ret = 0;
            for ($i = 0; $i < strlen($res); $i++) $ret |= ord($res[$i]);
            return $ret === 0;
        }
    }

    // ========== 工具函数 ==========
    function guard_ip() {
        global $GUARD;
        $ip = isset($_SERVER['REMOTE_ADDR']) ? $_SERVER['REMOTE_ADDR'] : '0.0.0.0';
        if ($GUARD['trust_proxy']) {
            if (!empty($_SERVER['HTTP_CF_CONNECTING_IP'])) {
                $ip = $_SERVER['HTTP_CF_CONNECTING_IP'];
            } elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
                $parts = explode(',', $_SERVER['HTTP_X_FORWARDED_FOR']);
                $ip = trim($parts[0]);
            }
        }
        return preg_replace('/[^0-9a-fA-F\:\.]/', '', $ip);
    }

    function guard_ua() {
        return isset($_SERVER['HTTP_USER_AGENT']) ? substr($_SERVER['HTTP_USER_AGENT'], 0, 512) : '';
    }

    function guard_random_hex($len = 16) {
        if (function_exists('openssl_random_pseudo_bytes')) {
            $bytes = @openssl_random_pseudo_bytes($len / 2);
            if ($bytes !== false) return bin2hex($bytes);
        }
        $hex = '';
        for ($i = 0; $i < $len; $i++) $hex .= dechex(mt_rand(0, 15));
        return $hex;
    }

    function guard_tempfile_for_ip($ip) {
        return sys_get_temp_dir() . DIRECTORY_SEPARATOR . 'guard_rl_' . md5($ip) . '.json';
    }

    // ========== Clearance Cookie ==========
    func.........完整代码请登录后点击上方下载按钮下载查看

网友评论0