`
OrangeHolic
  • 浏览: 259523 次
  • 来自: 北京
社区版块
存档分类
最新评论

PHP简单的手机验证码验证过程

    博客分类:
  • PHP
阅读更多
做过一个需求:广告主后台发起调查活动,普通用户参加此调查后跳转值某个网址领取1Q点(1角钱);上线一段时间以后,广告主反馈得到的很多手机号都是伪造的(我们开始只用正则匹配判断手机号正确与否),然后产品让我们加上手机短信验证,就变成了下面的样子.




刚开始的思路应该很正常的那种,用rand生成随机码,然后存在redis里边,设置expire为60秒;后来考虑考虑,用户为了1角钱不至于如此,需要验证码的时候也不会瞎填写,系统还限制某ID用户明天每天只能参加5次这种活动,也为了不浪费系统资源的原则,公司发的短信已经需要2分钱一条,决定不用redis,用下面的思路:

用用户帐号+活动ID+手机号进行处理生成一个固定的数字,然后驾驶时间戳进行干扰生成4位数的数字,干扰以后只保证4位数对应的二进制的1、5、6、7、8、9位不被干扰,这样对应会生出pow(2,6)个不一样的4位数字,随机发送给用户一个。

用户验证验证码时候也只验证验证码的1、5、6、7、8、9位是否正确,为用户帐号+活动ID+手机号进行处理生成,这样就不用存储验证码,达到验证手机号的号码。

具体的测试例子在下面,为啥说是测试例子呢,因为最后还没有用,我就去封闭开发其他项目去了,下面代码也是偶尔翻到,看代码竟然是我工作一周年的时候写的  ,测试的代码生成的验证码散列的不是很好,也没有时间进行改善,主要介绍一下上面的思路。

<?php
/**
 *
 * User: shikiliu
 * Date: 13-7-11
 */
class TelephoneCheck
{


    /**
     * 取得某个用户某次活动的手机验证码
     * @param $uin 用户ID 小于10000系统保留
     * @param $actId 活动ID  小于1000系统保留
     * @param $telephone 用户手机号
     * @return bool|int 4位数的验证码
     */
    public function getTelephoneCode($uin, $actId, $telephone)
    {

        if ($uin < 10000 || $actId < 1000 || empty($telephone)) {
            return false;
        }

        $time = time();

        $timeFeature = hexdec(substr(md5($time), 0, 3)) & 0x1F1;

        $telephoneFeature = hexdec(substr(md5($telephone), 8, 4));

        $actIdFeature = hexdec(substr(md5($actId), 16, 4));

        $uinFeature = hexdec(substr(md5($uin), 24, 4));

        $sumFeature = $telephoneFeature + $actIdFeature + $uinFeature;

        $sumFeature = $sumFeature % 10000;

        if ($sumFeature < 1000) {
            $sumFeature = 5145;
        }

        $result = $sumFeature | $timeFeature;

        return $result;
    }


    /**
     * 验证用户的手机验证码
     * @param $uin 用户ID 小于10000系统保留
     * @param $actId 活动ID  小于1000系统保留
     * @param $telephone 用户手机号
     * @param $code getTelephoneCode生成的验证码
     * @return bool 是否正确
     */
    public function  checkTelephoneCode($uin, $actId, $telephone, $code)
    {

        if ($uin < 10000 || $actId < 1000 || empty($telephone) || empty($code)) {
            return false;
        }

        $telephoneFeature = hexdec(substr(md5($telephone), 8, 4));

        $actIdFeature = hexdec(substr(md5($actId), 16, 4));

        $uinFeature = hexdec(substr(md5($uin), 24, 4));

        $sumFeature = $telephoneFeature + $actIdFeature + $uinFeature;

        $sumFeature = $sumFeature % 10000;

        if ($sumFeature < 1000) {
            $sumFeature = 5145;
        }

        $sumFeature = $sumFeature & 0xE0E;

        $code = $code & 0xE0E;

        if ($sumFeature == $code) {
            return true;
        }
        return false;
    }
}


$actId = 10001;
$telephone = 13797025562;
$uin = 514540767;


$telCode = new TelephoneCheck();


$code = $telCode->getTelephoneCode($uin, $actId, $telephone);

var_dump($code);

var_dump($telCode->checkTelephoneCode($uin, $actId, $telephone, $code));

var_dump($telCode->checkTelephoneCode($uin, $actId, $telephone, $code+10));

  • 大小: 7.4 KB
分享到:
评论

相关推荐

    php手机验证码

    用户注册网站时,通过输入手机号码,获取验证码注册网站或商城

    手机短信验证码php版源代码

    验证通是业内首家提供语音验证码的网站,提供详细的客户接口示例。 账号更安全如:游戏玩家绑定了手机或固话,只可用绑定过的号码向验证通获取随机密码,才可以登录游戏或转账等一系列的操作等 用户信息更真实:只有...

    php注册登陆验证代码(精华)

    php注册登陆验证模块包含界面 极大地方便php开发注册用户的需要

    PHP - cURL实现短信验证码注册登录完整示例:PHP - cURL.php和附件说明

    PHP - cURL实现短信验证码注册登录完整示例:PHP - cURL.php和附件说明,RAR压缩包

    PHP谷歌验证器生成秘钥和验证

    谷歌验证器是谷歌公司... 不少割韭菜的项目需要使用到谷歌验证器,这个方法可以生成一个验证码(可以把验证码生成一个二维码,这样谷歌验证器就可以扫码直接绑定了),内置一个校验验证码的功能,可以匹配验证的结果。

    手机、电话语音验证码源代码(包括asp、jsp、php、asp.net版本).rar

    验证通是业内首家提供语音验证码的网站,提供详细的客户接口示例。为用户提供安全、全面、便捷的支付方式! 此示例包含4种主流开发平台代码,分别是PHP,JAVA,ASP,ASP.NET。详细请看里面的示例说明文档。 账号更...

    皕应HDK[验证码,手机短信验证码]

    4. 易用 系统对不同语言PHP/JSP/ASP/ASP.NET[C#、VB]等主流语言提供验证码的显示与验证端代码与例子,开发者可以在几乎不需要更改代码的情况下集成到任何系统。系统还提供验证码样式的管理设置功能,不需要更改代码...

    DEDE自定义表单加验证码功能+js必填项

    DEDE自定义表单加验证码功能+js必填项

    php阿里云短信验证码发送类.zipzip

    介绍一个php阿里云短信验证码发送类,账户短信开通状态不正确,短信签名不正确或签名状态不正确,短信模板Code不正确或者模板状态不正确,目标手机号不正确,单次发送数量不能超过100,短信模板中变量不是json格式,...

    php click captcha 验证码类

    现在常用的表单验证码大部分都是要用户输入为主,但这样对手机用户会不方便。 如果手机用户访问,可以不用输入,而是click某一位置便可确认验证码,这样就会方便很多。 原理: 1.使用PHP imagecreate创建PNG图象,...

    PHP生成各种随机验证码的方法总结【附demo源码】

    本文将通过实例讲解使用PHP生成各种常见的验证码包括数字验证码、数字+字母验证码、中文验证码、算术验证码等等以及其Ajax验证过程。 点击此处本站下载示例源码。 PHP生成验证码图片 PHP生成验证码的原理:使用PHP...

    手机短信验证码接口文件

    asp和php版的手机端口开发文档,可以改成.net的

    如何使用PHP对网站验证码进行破解

    所谓验证码,就是将一串随机产生的数字或符号,生成一幅图片,图片里加上一些干扰象素(防止OCR),由用户肉眼识别其中的验证码信息,输入表单提交网站验证,验证成功后才能使用某项功能。学习验证码的破解/识别技术...

    PHP简单验证码功能机制实例详解

    网站的安全性是开发者不可忽视的一个问题,目前使用最多的一种可以提高网站安全性的方法就是使用验证码功能机制,有的仅仅使用一个几位数字字母混乱的验证码,有的进行手机发送短信进行验证,有的使用邮箱发送邮件...

    PHP手机短信验证码实现流程详解

    主要为大家详细介绍了PHP手机短信验证码的实现流程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

    皕应图形验证码系统 HDK v1.0.0

    皕应gif验证码手机验证码HDK皕应[互联网支撑平台] 提供图形验证码和手机短信验证码服务,国内最专业的验证码系统HCaptcha验证码 是与开发语言无关、样式可调整的免费图形验证码系统。1. 安全 系统可以非常有效地阻止...

    手机短信验证功能和简单的注册功能源代码

    程序整理了包括Access,FoxPro,Oracle,SQLServer数据库基类操作 为了安全起见,对验证码进行稍修改,短信验证码发送功能也整理在验证码里边 这个只是在公司做项目的时候用到的,感觉大家可能在以后做手机验证的时候比较...

    电话语音验证码源代码(包括php,jsp,asp,asp.net)

    验证通是业内首家提供语音验证码的网站,提供详细的客户接口示例。 账号更安全如:游戏玩家绑定了手机或固话,只可用绑定过的号码向验证通获取随机密码,才可以登录游戏或转账等一系列的操作等 用户信息更真实:只有...

    discuzx1.5增加后台开关:是否启用手机验证登录

    discuzx1.5后台增加是否启用手机验证登录开关,前台注册用户通过发手机短信获取手机验证码提交验证。如有不懂可以加QQ详询。QQ在下载文档里。

    php实现的click captcha点击验证码类实例

    现在常用的表单验证码大部分都是要用户输入为主,但这样对手机用户会不方便。 如果手机用户访问,可以不用输入,而是click某一位置便可确认验证码,这样就会方便很多。 二、原理: 1.使用PHP imagecreate创建PNG图象...

Global site tag (gtag.js) - Google Analytics