Maison >développement back-end >tutoriel php >如何防止网站被注册机轰炸

如何防止网站被注册机轰炸

WBOY
WBOYoriginal
2016-09-19 09:16:281588parcourir

现在有的防护是手机验证码和token验证,注册机注册的都是空号,却能收到验证码,也做了同一ip一小时注册一次,大神还有什么法子能防住

回复内容:

现在有的防护是手机验证码和token验证,注册机注册的都是空号,却能收到验证码,也做了同一ip一小时注册一次,大神还有什么法子能防住

我我语文不太好,看不懂题目!

之前帮朋友写过一个,他们使用了一个在网上找的验证码生成程序,估计用的人太多了,竟然没防住。我个人比较喜欢JS去解决问题,最终使用本方案之后,就没有再出问题。

TokenCode,防止机器人模拟提交方式注册
TokenCode 使用演示脚本

<code><?php #=====================================================================
    #=                 Copyright (c) 2015 猫七(QQ:77068320)              =
    #=                      All rights reserverd.                        =
    #=====================================================================
    #=           TokenCode 防模拟提交程序 类(PHP版本)                    =
    #=  使用说明:http://www.miaoqiyuan.cn/products/tokencode/last.zip   =
    #=  演示地址:http://www.miaoqiyuan.cn/products/tokencode/           =
    #=  使用说明:http://www.miaoqiyuan.cn/p/tokencode                   =
    #=  邮箱地址:mqycn@126.com   QQ:77068320 1301425789                =
    #=====================================================================
     
    class TokenCode {
        public $value, $code ;
        public $OperationList;
        public function __construct() {
            $resultValue = $this -> RandomKey($this -> RandomIntger());
            $resultCode = "'" . $resultValue . "'";
            $this -> OperationList = Array("+", "-" ,"*");
             
            for( $i = 0 ; $i  RandomIntger() + 3; $i++){
                $op =  $this -> RandOperation();
                switch($op){
                    case "+":
                    case "-":
                        $random = $this -> RandEquations();
                        $resultValue .= $random["value"];
                        $resultCode .= "+(" . $random["code"] . ")";
                        break;
                    default:
                        $random = $this -> RandomKey($this -> RandomIntger());
                        $resultValue .= $random;
                        $resultCode .= "+'" . $random . "'";
                        break;
                }
            }
             
            $rnd1 = $this -> RandomIntger();
            $rnd2 = $this -> RandomIntger() + 8;
            $this -> value = substr($resultValue, $rnd1, $rnd2);
            $this -> code = "(" . $resultCode . ").substring(" . $rnd1 . "," . ($rnd1 + $rnd2) . ")";
        }
         
        private function RandEquations(){
            $va = $str = $this -> RandomLong();
            $this -> OperationList = Array("+", "-" ,"*");
             
            for( $i = 0 ; $i  RandomIntger(); $i++){
                $op =  $this -> RandOperation();
                $vb = $this -> RandomLong();
                switch($op){
                    case "+":
                        $va += $vb;
                        $str .= "+" . $vb;
                        break;
                    case "-":
                        $va -= $vb;
                        $str .= "-" . $vb;
                        break;
                    case "*":
                        $va *= $vb;
                        $str = "(" . $str . ")*" . $vb;
                        break;
                }
            }
            return Array(
                "code" => $str,
                "value" => $va
            );
        }
         
        private function RandOperation(){
            return $this -> OperationList[rand() % count($this -> OperationList)];
        }
         
        private function RandomIntger(){
            return (int)substr(rand(), 1, 1) + 1;
        }
         
        private function RandomLong(){
            return (int)substr(rand(), 1, 3) + 1;
        }
         
        private function RandomKey($len = 10){
            return substr(md5(rand()), 1, $len + 5);
        }
         
    }
?>
</code>

调用方法:

<code><?php require("TokenCode.php");
    $token = new TokenCode();
    $tokenValue = $token -> value ;
    $tokenCode = $token -> code ;
         
    //代码段
        $_SESSION["_TOKENCODE"] = $token -> value ;
         
    //代码段
    echo '<script type="text/javascript">_TOKENCODE=' . $token -> code . ';</script>';
?></code>

保存好session后,到验证页验证提交的code和验证结果即可,程序改动非常少,只需要js改动一下即可。

<code>#AJAX方式
$.post("/", {mob : $("#mob").val() , token : _TOKENCODE }, function(){ } );
 
#URL方式
$("#send").click(function(){
    if(this.href.indexOf('&token=')==-1){
        this.href+='&token=' + _TOKENCODE
    };
});</code>

ip限制加高强度验证码

用的是虚拟号码注册的吧?

注册机注册的都是空号,却能收到验证码

楼主能说明下吗,这是什么注册机,什么样的手机号?

我想到的方法
方法1.注册时再增加一层校验,比如:12306的图片选择、淘宝的滑动模块+背景图片
方法2.加生物检测,比如人脸识别、唇动检测, 生物检测通过后才真正创建用户,

国内的微众银行在它的app里已经使用了活体检测技术,不过这种技术目前主要还是应用在安全要求比较高的场景里,并且也只是作为辅助验证的手段,并不能100%依赖,总之效果还是不错的。

做验证码或者添加IP限制,相同IP不能连续注册

获取验证码的方式变一下。
使用语音的方式获取验证码。网页上面填写手机号以后,利用呼叫平台,给机主拨打语音电话。

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn