Heim > Backend-Entwicklung > PHP-Tutorial > Anwendungsbeispiel der PHP-Frequenzbegrenzungsklasse

Anwendungsbeispiel der PHP-Frequenzbegrenzungsklasse

不言
Freigeben: 2023-04-05 18:34:02
nach vorne
2846 Leute haben es durchsucht

Dieser Artikel enthält Anwendungsbeispiele für die PHP-Frequenzbegrenzungsklasse. Freunde in Not können darauf verweisen.

Zum Beispiel:

Ein einzelnes IP-Limit einmal alle 60 Sekunden realisieren

Ein einzelnes Schlüsselwort, wie z. B. eine Mobiltelefonnummer, einmal alle 60 Sekunden, 10 Mal alle 3600 Sekunden

<?php
class Sina_Mail_WebAntispam {

    const PREFIX_WHITELIST = &#39;w:&#39;;
    const PREFIX_KILL = &#39;k:&#39;;
    const PREFIX_VERIFYCODE = &#39;c:&#39;;
    const PREFIX_VERIFIED = &#39;v:&#39;;
    const STATUS_UPDATE = &#39;[U]&#39;;

    private $mc = null;
    private $config = null;
    private $whitelist = array();
    private $keyPrefix = &#39;&#39;;
    private $intervals = array();
    private $updates = array();
    private $status = array();

    public function __construct($mc, $config) {
        $this->mc = $mc;
        $this->config = $config;
        if (isset($this->config->prefix)) {
            $this->keyPrefix = $this->config->prefix;
        }
        if (isset($this->config->whitelistKey)) {
            $wls = $this->mc->get($this->config->whitelistKey);
            if (!empty($wls)) {
                $this->whitelist = & $wls;
            }
        }
    }

    public function setWhitelist(&$whitelist) {
        $this->whitelist = & $whitelist;
    }
    /*验证限制规则*/
    public function check($ip = null, $key = null) {
        if (!$ip && !$key) {
            return false;
        }

        if ($key) {
            if (!is_array($key)) {
                $keys = array($key);
            } else {
                $keys = $key;
            }
        }

        // first filter by whitelist
        if (!empty($this->whitelist)) {
            if ($ip && $this->filterByWhitelist($ip, &#39;ip&#39;)) {
                $this->status[self::PREFIX_WHITELIST . $ip] = 1;
                return true;
            }
            if ($keys) {
                foreach ($keys as $key) {
                    if ($this->filterByWhitelist($key, &#39;key&#39;)) {
                        $this->status[self::PREFIX_WHITELIST . $key] = 1;
                        return true;
                    }
                }
            }
        }

        if ($ip) {
            $ip = $this->keyPrefix . $ip;
        }

        // second, check verified ok
        if (!empty($this->config->verified)) {
            if ($ip && $this->mc->get(self::PREFIX_VERIFIED . $ip)) {
                $this->status[self::PREFIX_VERIFIED . $ip] = 1;
                return true;
            }
            if ($keys) {
                foreach ($keys as $key) {
                    $verifiedKey = self::PREFIX_VERIFIED . $this->keyPrefix . $key;
                    if ($this->mc->get($verifiedKey)) {
                        $this->status[$verifiedKey] = 1;
                        return true;
                    }
                }
            }
        }

        $kos = !empty($this->config->kill);
        // check killed
        if ($kos) {
            if ($ip && $this->mc->get(self::PREFIX_KILL . $ip)) {
                $this->status[self::PREFIX_KILL . $ip] = 1;
                return false;
            }
            if ($keys) {
                foreach ($keys as $key) {
                    $killKey = self::PREFIX_KILL . $this->keyPrefix . $key;
                    if ($this->mc->get($killKey)) {
                        $this->status[$killKey] = 1;
                        return false;
                    }
                }
            }
        }

        // check ip rule
        if ($ip && isset($this->config->ip)) {
            if (!$this->checkRule($ip, $this->config->ip)) {
                if ($kos && $this->mc->set(self::PREFIX_KILL . $ip, 1, intval($this->config->kill))) {
                    $this->status[self::PREFIX_KILL . $ip] = 1;
                }
                return false;
            }
        }

        // check keys rule
        if ($keys && isset($this->config->key)) {
            foreach ($keys as $key) {
                if (!$this->checkRule($this->keyPrefix . $key, $this->config->key)) {
                    $killKey = self::PREFIX_KILL . $this->keyPrefix . $key;
                    if ($kos && $this->mc->set($killKey, 1, intval($this->config->kill))) {
                        $this->status[$killKey] = 1;
                    }
                    return false;
                }
            }
        }

        return true;
    }
    /*更新限制规则*/
    public function update($c = 1, $ip = null, $key = null) {
        if (is_null($ip) && is_null($key)) {
            if (!empty($this->updates)) {
                foreach ($this->updates as $k => $v) {
                    if (!$v && isset($this->intervals[$k])) {
                        if ($this->mc->add($k, $c, false,$this->intervals[$k])) {
                            $this->status[self::STATUS_UPDATE . $k] = $c;
                            continue;
                        }
                    }
                    $r = $this->mc->increment($k, $c);
                    $this->status[self::STATUS_UPDATE . $k] = $r;
                }
            }
        } else {
            if (!is_null($ip) && isset($this->config->ip)) {
                $rule = $this->config->ip;
                foreach ($rule as $interval => $limit) {
                    $k = $this->keyPrefix . $ip . &#39;_&#39; . $interval;
                    if ($this->mc->add($k, $c,false,$interval)) {
                        $this->status[self::STATUS_UPDATE . $k] = true;
                        continue;
                    }
                    $r = $this->mc->increment($k, $c);
                    $this->status[self::STATUS_UPDATE . $k] = $r;
                }
            }
            if (!is_null($key) && isset($this->config->key)) {
                $rule = $this->config->key;
                if (!is_array($key)) {
                    $keys = array($key);
                } else {
                    $keys = $key;
                }
                foreach ($keys as $key) {
                    foreach ($rule as $interval => $limit) {
                        $k = $this->keyPrefix . $key . &#39;_&#39; . $interval;
                        if ($this->mc->add($k, $c,false,$interval)) {
                            $this->status[self::STATUS_UPDATE . $k] = true;
                            continue;
                        }
                        $r = $this->mc->increment($k, $c);
                        $this->status[self::STATUS_UPDATE . $k] = $r;
                    }
                }
            }
        }
    }

    public function checkVerifyCode($key, $code) {
        $servcode = $this->mc->get(self::PREFIX_VERIFYCODE . $this->keyPrefix . $key);
        if (strcasecmp($servcode, $code) == 0) {
            $verified = intval($this->config->verified);
            if ($verified > 0) {
                $r = $this->mc->set(self::PREFIX_VERIFIED . $this->keyPrefix . $key, 1, false, $verified);
            } else {
                $r = true;
            }
            if ($r) {
                $this->mc->delete(self::PREFIX_VERIFYCODE . $this->keyPrefix . $key);
            }
            return $r;
        }
        return false;
    }

    public function isVerified($key) {
        $r = $this->mc->get(self::PREFIX_VERIFIED . $this->keyPrefix . $key);
        if (!empty($r)) {
            return true;
        } else {
            return false;
        }
    }

    public function setVerifyCode($key, $code) {
        $verifytime = intval($this->config->verifytime);
        if ($verifytime < 1) {
            return false;
        }
        return $this->mc->set(self::PREFIX_VERIFYCODE . $this->keyPrefix . $key, $code, false, $verifytime);
    }

    public function getStatus() {
        return $this->status;
    }

    private function filterByWhitelist($value, $key) {
//        if (empty($this->whitelist[$key])) {
//            return false;
//        }
//        $ls = & $this->whitelist[$key];
        $ls = & $this->whitelist;
        foreach ($ls as $i) {
            if ($i[strlen($i) - 1] == &#39;.&#39;) { // ip segment
                if (strpos($value, $i) === 0) {
                    return true;
                }
            } else {
                if (strcmp($i, $value) === 0) {
                    return true;
                }
            }
        }
        return false;
    }

    private function checkRule($key, $rule) {
        $flag = true;
        if (!empty($rule)) {
            foreach ($rule as $interval => $limit) {
                $k = $key . &#39;_&#39; . $interval;
                $c = $this->mc->get($k);
                if (!$c) {
                    $this->updates[$k] = 0;
                    $this->intervals[$k] = $interval;
                    $this->status[$k] = 0;
                } else {
                    $this->updates[$k] = $c;
                    $this->status[$k] = $c;
                    if ($c >= $limit) {
                        $flag = false;
                    }
                }
            }
        }
        return $flag;
    }

    public static function getInstance($conf) {
        $mc = new Memcache();
        $mc->connect("115.159.28.112");
        $conf=json_decode(json_encode($conf));
        return new self($mc, $conf);
    }

}
/*
单个ip限制60秒1次
单个关键字,比如手机号,限制60秒1次,3600秒10次
*/
$conf=array(
            &#39;prefix&#39; => &#39;selfservice:&#39;,
            &#39;key&#39; => array(60 => 1,3600=>10),
            &#39;ip&#39; => array(60 => 1),
        );
$spam=Sina_Mail_WebAntispam::getInstance($conf);
if(!$spam->check(&#39;127.25.12.123&#39;,17610725730)){
	echo "limit...";
	exit;
}

//更新频率限制
$spam->update();
Nach dem Login kopieren

Der endgültige Speicherschlüssel in Memache

[Empfohlener Kurs: PHP Video-Tutorial]

Das obige ist der detaillierte Inhalt vonAnwendungsbeispiel der PHP-Frequenzbegrenzungsklasse. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
php
Quelle:segmentfault.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage