php验证码防止外网直接访问

2015-04-23 12:16:58

今天查看里sae上部署的项目,突然看到sae的日志,发现有几个异常链接在请求验证码,于是突然萌发出要做一个防止验证码抓取功能。此功能可以防止验证码的盗用和破解,防止不必要的恶意攻击和破解。

思路如下:

在验证码生成类调用之前对访问链接进行验证

1.验证访问来自与那个页码

2.其次验证访问地址

解决步骤:

1.利用php自带的功能来判断验证码的访问是否来自与某个页码基本是不现实的,php中貌似没有这个功能(我是没有找到),所以我们只能利用php实现间接的判断,这里我们用session来验证是否来自与页码,因为需要用到的验证码的页面很少,所以我们设置session的地方也不是太多,相对来说还是可以接受的。

2.验证访问地址,这个就比较简单里,我们可以用php提供的 $_SERVER函数,取出访问地址。

3.在验证码生成之后设置session中验证值,使其下次不能再验证。

具体代码(大家可以根据自己的需要修改此处只提供一个思想):

例如

1.在 需要加载验证码的页面(或者controller层函数中)设置$_SESSION[‘check‘]=true;

2.在调用验证码之前调用验证

<?php
/**
 * Created by PhpStorm.
 * User: wangyaofeng
 * Date: 15-4-23
 * Time: 上午9:36
 */
/**
 * 检测访问的ip是否为规定的允许的ip
 * Enter description here ...
 */
//ip地址的验证用户根据自己的需求改变
function check_ip(){
    $ALLOWED_IP=array('127.0.0.1');
    $IP=getIP();
    $check_ip_arr= explode('.',$IP);//要检测的ip拆分成数组
    #限制IP
    if(!in_array($IP,$ALLOWED_IP)) {
        foreach ($ALLOWED_IP as $val){
            if(strpos($val,'*')!==false){//发现有*号替代符
                $arr=array();//
                $arr=explode('.', $val);
                $bl=true;//用于记录循环检测中是否有匹配成功的
                for($i=0;$i<4;$i++){
                    if($arr[$i]!='*'){//不等于*  就要进来检测,如果为*符号替代符就不检查
                        if($arr[$i]!=$check_ip_arr[$i]){
                            $bl=false;
                            break;//终止检查本个ip 继续检查下一个ip
                        }
                    }
                }//end for
                if($bl){//如果是true则找到有一个匹配成功的就返回
                    return;
                    die('success');
                }
            }
        }//end foreach
        header('HTTP/1.1 403 Forbidden');
        echo "Access forbidden";
        die;
    }
}
function getIP() {
    return isset($_SERVER["HTTP_X_FORWARDED_FOR"])?$_SERVER["HTTP_X_FORWARDED_FOR"]
        :(isset($_SERVER["HTTP_CLIENT_IP"])?$_SERVER["HTTP_CLIENT_IP"]
            :$_SERVER["REMOTE_ADDR"]);
}

if(!$_SESSION['check']){
    check_ip();
}
//重新设置验证码的值
$_SESSION['check'] = false;

基本上通过这两步操作,就可以对验证码进行限制了,在本例中通过外网访问网站时验证码会正常显示,但是通过外网直接访问或者抓取验证码时会被拒绝,通过本地访问验证码一切正常。

如图:

本机访问

外网访问

外网访问登录

时间: 2024-07-30 22:56:12

php验证码防止外网直接访问的相关文章

用小米路由搭建外网可访问的个人网站

家里的小米路由R1D用了近一年,只是做一个普通的路由器使用,实在太浪费了.最近学习移动端编程,感觉和PC时代最大的不同就在于移动端产品更重云和端的配合.于是就花了一晚上捣鼓捣鼓,在小米路由上搭建了一套可从外网访问的web 服务,以便手机上做的玩意儿可以随时随地获得私有云的支持.把搭建路径备案记录下来: 第一步.先把小米路由刷到开发版ROM. 后面ssh登录需要开发版ROM支持.注意:先保存路由器上的所有数据!!!比如宽带账号.密码信息,这些信息一般在装完宽带后就很少用到了,一定确保先找到这些数据

外网主机访问虚拟机下的web服务器(NAT端口转发)

主机:系统win7,ip地址172.18.186.210 虚拟机:VMware Workstation 7,虚拟机下安装了Centos操作系统,ip地址是192.168.202.128,部署了LAMP,成为一个web服务器 网络环境:校园网(有认证服务器,需要账号认证才能上网),虚拟机采用NAT的方式联网 在校园网的环境下,可以把校园网内的其他主机看成是外网的主机.其实,虚拟机采用NAT联网的方式,可以让我们联想到计算机网络的相关知识,可以把我们的主机看成是一部路由器,然后虚拟机就是处在一个局域

将电脑变成外网可访问的服务器

一 前言 很多时候需要让别人能直接看到你布署在本机的网站或者服务时,通常是买空间或者服务器把网站布署发布上去,如此一来即花钱又麻烦,有没有更简单点的方法可以实现,直接把本机的网站公开到外网去呢? 这个就是今天要讲一东西 二 资源 路由器  花生壳 2.1  注册花生壳 然后生成一个免费的域名,因为是免费的所以一般都是无规则的 如 t14x528135.imwork.net 2.2  需要一个路由器并设置DNS服务,并在 服务提供商 选花生壳 并输入花生壳的 用户名 密码  域名 如下图 因为我的

tomcat外网无法访问80和8080端口,其他端口可以访问

tomcat外网无法访问80和8080端口,其他端口都可以访问,很明显地看出这是运营商的问题,他们把80和8080端口对外访问屏蔽了. 解释:这两个端口是常用的HTTP协议端口,目的是防止未备案的网站对外发布. 解决办法:修改tomcat端口号或申请一个已经备案的域名指向该服务器并且向运营商要求开通.

Windows Server 2008上MYSQL外网无法访问有关问题解决

公司断网了 网络恢复之后 一直提示连不上MySQL服务器 本地能连接 远程不行 解决方法如下:选择:网络->windows 防火墙->高级设置->入站规则然后点击右上角的新建规则选择"端口" 下一步,输入3306端口,加入规则,然后再次点击新建规则选择"程序" 找到mysql bin下的启动路径,加入规则 然后外部访问mysql.成功!!!! 这个是防火墙的问题 Windows Server 2008上MYSQL外网无法访问有关问题解决,布布扣,b

外网无法访问tomcat

最近遇到外网无法访问tomcat的问题.我没开防火墙,所以不是防火墙的问题.最后才知道电信把80(全国范围)和8080端口(部分地区)禁掉了,而我刚好尝试映射了这2个端口,结果无法访问.最后将端口设为8888,问题解决! 外网无法访问tomcat,布布扣,bubuko.com

nat123外网SSH访问内网LINUX的N种方法

一,动态公网IP环境 1,环境描述: 路由器分配的是动态公网IP,且有路由管理权限,LINUX主机部署在路由内网.如何实现外网SSH访问内网LINUX主机? 2,解决方案: 使用nat123动态域名解析,解决动态公网IP问题. 3,实现过程: 方法一:在同局域网下另一台windows主机中使用动态解析windows版. 动态域名解析windows版,实现步骤参考<外网访问内网LINUX-动态公网IP动态域名解析-windows版> 方法二:在被访问端Linux主机中使用动态域名解析Linux版

如何在外网中访问自己在另一个局域网中的某个机器(SSH为例)

UBUNTU 14.04 LTS 为例 如何在外网中访问自己在另一个局域网中的某个机器(SSH为例) 2013-05-01 16:02 2693人阅读 评论(0) 收藏 举报 情景描述: 计算机C1放置在局域网LN1中,LN1中的所有计算机都链接到了路由器R1上. 计算机C2放置在另一个局域网LN2中,并且LN1与LN2不属于同一个基于网. 要实现的功能: 使用C2通过SSH链接到C1上. 要求: 必须要从C1端操作.(这里假设C1为Linux) 步骤: C1端配置 1, ifconfig 来获

win10内网外网智能访问

当电脑同时连接有线和WiFi时(有线连接为内网,WiFi为外网),会出现内网和外网内容无法同时访问的情况. 本方法实现内网和外网的同时访问. 第一步: 输入指令 “route print ” 查看路由表: 第二步: 输入“route delete 0.0.0.0” 删除默认路由: 第三步: 输入“route add 10.0.0.0 mask 255.0.0.0 10.1.9.1” 添加路由: 输入“route add 0.0.0.0 mask 0.0.0.0 192.168.199.1” 添加