PHP限制页面只能在微信自带浏览器访问的代码

本文由码农网 –
小峰原创,转发请看清文末的转发必要,应接到场我们的付费投稿安顿!

当媒体人浏览受保障页面时,顾客端浏览器会弹出对话窗口要求客户输入客户名和密码,对顾客的身价张开认证,以调控顾客是不是有权访谈页面。上面用三种方法来注明其实现原理。
  生机勃勃、用HTTP标头来完结   标头是服务器以HTTP左券传送HTML信息到浏览器前所送出的字串。HTTP接受生龙活虎种挑衅/响应方式对筹划跻身受密码爱戴区域的顾客张开身份验证。具体来讲,当客商第一遍向WEB服务器发出国访问问受有限援助区域的乞求时,挑战进度被运营,服务器重返特殊的401标头,评释该客户位置未经证实。客商端浏览器在检验到上述响应之后自动掸出对话框,须要客户输入客户名和密码。顾客完结输入之后点击明显,其地位鉴定分别信息就被传送到服务端实行表达。假使客商输入的客商名和密码有效,WEB服务器将允许顾客步向受保证区域,何况在全路访问进程中保持其地位的有用。相反,若顾客输入的顾客名称或密码不可能通过验证,客商端浏览器会再三弹出输入窗口供给顾客再度尝试输入精确的信息。整个进程将直接持续到客商输入正确的音信位置,也能够设定允许客商进行尝试的最大次数,超过时将电动推却客商的拜望央求。
  在PHP脚本中,使用函数header(卡塔尔国间接给客商端的浏览器发送HTTP标头,那样在顾客端将会活动掸出客商名和密码输入窗口,来促成我们之处注解功用。在PHP中,顾客端客商输入的音信传递到服务器之后自动保存在
$PHP_AUTH_USER,$PHP_AUTH_PW,以及
$PHP_AUTH_TYPE这八个全局变量中。利用那多少个变量,我们能够依照保存在数据文件大概数据库中客商帐号音信来证实客户地点!
不过,须要提示使用者注意的是:独有在以模块形式安装的PHP中技能利用$PHP_AUTH_USER,$PHP_AUTH_PW,以及
$PHP_AUTH_TYPE那七个变量。假诺客商接受的是CGI模式的PHP则不能够兑现认证效用。在本节后附有PHP的模块格局安装格局。
  上面我们用Mysql数据库来存款和储蓄顾客的身价。大家要求从数据库中领到各个帐号的客商名和密码以便与$PHP_AUTH_USER和$PHP_AUTH_PW变量举行相比,剖断客户的真实。
  首先,在MySql中树立三个寄放客户消息的数据库   数据库名字为XinXiKu ,表名字为user;表定义如下:
复制代码 代码如下:
create table user(
ID INT(4) NOT NULL AUTO_INCREMENT,
name VARCHAR(8) NOT NULL,
password CHAR(8) NOT NULL,
PRIMARY KEY(ID)
)

为了以防投机繁重做的webapp被人copy,大家都想约束造进度序只好在Wechat里面浏览,尽管上边达成了那几个意义,单都以小菜,没什么技能含量,懂代码的杜撰下就破了。上面是PHP限定页面只可以在Wechat自带浏览器访谈的代码。
复制代码 代码如下:
$useragent = $_SERVER[‘HTTP_USER_AGENT’];
if (strpos($useragent, ‘MicroMessenger’) === false) {
echo ” 非Wechat浏览器幸免访谈”;
} else {
echo “Wechat浏览器允许访谈”;
}

后天要给大家享受豆蔻梢头段PHP代码,该代码的功能是用来决断访客是否移动端浏览器访谈,该意义的落到实处思路是因此HTTP_X_WAP_PROFILE、HTTP_VIA、HTTP_USER_AGENT等音信来判断访客是或不是通过移动端浏览器访问PHP网址。以下是PHP代码:

说明:
  1、ID为贰个队列号,不为零何况自动递增,为主键;
  2、name为客商名,无法为空;
  3、password为客商密码,不能为空;
  以下是顾客验证文件login.php
复制代码 代码如下:
//推断客户名是或不是设置
if(!isset($PHP_AUTH_USER))
{
header(“WWW-Authenticate:Basic realm=”身份验证效用””卡塔尔(قطر‎;
header(“HTTP/1.0 401 Unauthorized”);
echo “身份验证失利,您无权分享网络财富!”;
exit();
}
/*总是数据库*/
$db=mysql_connect(“localhost”,”root”,””);
//选用数据库
mysql_select_db(“XinXiKu”,$db);
//查询客商是还是不是留存
$result=mysql_query(“SELECT * FROM user where name=’$PHP_AUTH_USER’
and password=’$PHP_AUTH_PW'”,$db);
if ($myrow = mysql_fetch_row($result))
{
//以下为身份验证成功后的连带操作

}
else
{
//身份验证不成事,提醒客户重新输入
header(“WWW-Authenticate:Basic realm=”身份验证功能””State of Qatar;
header(“HTTP/1.0 401 Unauthorized”);
echo “身份验证失利,您无权分享互连网能源!”;
exit();
}
?>

地方这几个代码还不圆满,Windows phone的Wechat就无法用了,于是改革下:
复制代码 代码如下:
$useragent = addslashes($_SERVER[‘HTTP_USER_AGENT’]);
if(strpos($useragent, ‘MicroMessenger’) === false && strpos($useragent,
‘Windows Phone’) === false ){
echo ” 非Wechat浏览器幸免访谈www.buyerinfo.biz”;
}else{
echo “Wechat浏览器允许访问www.buyerinfo.biz”;
}

/**
 * 是否移动端访问访问
 *
 * @return bool
 */
function isMobile()
{ 
    // 如果有HTTP_X_WAP_PROFILE则一定是移动设备
    if (isset ($_SERVER['HTTP_X_WAP_PROFILE']))
    {
        return true;
    } 
    // 如果via信息含有wap则一定是移动设备,部分服务商会屏蔽该信息
    if (isset ($_SERVER['HTTP_VIA']))
    { 
        // 找不到为flase,否则为true
        return stristr($_SERVER['HTTP_VIA'], "wap") ? true : false;
    } 
    // 脑残法,判断手机发送的客户端标志,兼容性有待提高
    if (isset ($_SERVER['HTTP_USER_AGENT']))
    {
        $clientkeywords = array ('nokia',
            'sony',
            'ericsson',
            'mot',
            'samsung',
            'htc',
            'sgh',
            'lg',
            'sharp',
            'sie-',
            'philips',
            'panasonic',
            'alcatel',
            'lenovo',
            'iphone',
            'ipod',
            'blackberry',
            'meizu',
            'android',
            'netfront',
            'symbian',
            'ucweb',
            'windowsce',
            'palm',
            'operamini',
            'operamobi',
            'openwave',
            'nexusone',
            'cldc',
            'midp',
            'wap',
            'mobile'
            ); 
        // 从HTTP_USER_AGENT中查找手机浏览器的关键字
        if (preg_match("/(" . implode('|', $clientkeywords) . ")/i", strtolower($_SERVER['HTTP_USER_AGENT'])))
        {
            return true;
        } 
    } 
    // 协议法,因为有可能不准确,放到最后判断
    if (isset ($_SERVER['HTTP_ACCEPT']))
    { 
        // 如果只支持wml并且不支持html那一定是移动设备
        // 如果支持wml和html但是wml在html之前则是移动设备
        if ((strpos($_SERVER['HTTP_ACCEPT'], 'vnd.wap.wml') !== false) && (strpos($_SERVER['HTTP_ACCEPT'], 'text/html') === false || (strpos($_SERVER['HTTP_ACCEPT'], 'vnd.wap.wml') < strpos($_SERVER['HTTP_ACCEPT'], 'text/html'))))
        {
            return true;
        } 
    } 
    return false;
}

次第表明:
在前后相继中,首先检查变量$PHP_AUTH_USE悍马H2是不是曾经设置。若无安装,表达须求验证,脚本发出HTTP
401不当号头标,告诉客商端的浏览器需求打开身份验证,由顾客端的浏览器弹出多少个身份验证窗口,提醒客商输入客商名和密码,输入完毕后,连接数据库,查询该用客户名及密码是或不是科学,如若没有错,允许登陆举办相关操作,假若不精确,继续供给客户输入客户名和密码。
  函数表达:   1、isset():用于鲜明有个别变量是或不是已被赋值。依照变量值是不是留存,重回true或false
  2、header():用于发送特定的HTTP标头。注意,使用header()函数时,一定要在别的产生实际出口的HTML或PHP代码前边调用该函数。
  3、mysql_connect(卡塔尔:展开 MySQL 服务器连接。
  4、mysql_db_query(卡塔尔国:送查询字符串 (query卡塔尔(قطر‎ 到 MySQL 数据库。
  5、mysql_fetch_row():再次来到单列的各字段。
  二、用session落成服务器验证   对于急需身份验证的页面,使用apache服务器验证是最棒然则的了。然而,apache服务器验证的分界面不够本人。何况,cgi方式的php,iis下的php,都不能够运用apache服务器验证。那样,我们能够运用session在分化页面间保存客户身份,到达身份验证的指标。
  在后端我们意气风发致选择方面包车型客车Mysql数据库存放客商音讯。
  大家先编写制定贰个客户登入分界面,文件名称叫login.php,代码职下:
复制代码 代码如下:

世家能够透过获取 HTTP_USER_AGEN,判断。

代码相比完好,有野趣的同班能够多做一些测验,有任何bug能够在评价中留言。

用户名:

而是你感觉上边包车型客车法子能挡住旁人去盗窃你的分界面,你就错了,只要杜撰一下HTTP_USER_AGEN还能健康访谈。
在谷歌(Google卡塔尔浏览器下边装个User-Agent
Switcher,还能够不管访问。于是本人还悟出用JS来推断是或不是手提式有线电话机访谈,可是如果浏览器幸免JS运转,仍然是能够健康访谈。。然而可能那样能难到部分新手吧。

口 令:

login1.php管理提交的表单,代码如下:
复制代码 代码如下:
$db=mysql_connect(“localhost”,”root”,””);
mysql_select_db(“XinXiKu”,$db);
$result=mysql_query(“SELECT * FROM user where name=’$name’ and
password=’$pass'”,$db);
if ($myrow = mysql_fetch_row($result))
{
//注册客商
session_start();
session_register(“user”);
$user=$myrow[“user”];
// 身份验证成功,进行有关操作

}
else
{
echo”身份验证失利,您无权共享网络能源!”;
}
?>

此间需求注脚的是,用户能够应用在延续的操作中用**
**来绕过身份验证。所以,后续的操作应先反省变量是或不是注册:已登记,则开展相应操作,不然视为违法登陆。相关代码如下:
复制代码 代码如下:
session_start();
if (!session_is_registered(“user”))
{
echo “身份验证失利,归属违法登陆!”;
}
else
{
//成功登入实行有关操作

}
?>

附录:PHP以模块方式安装方式
  1、首先下载文件:mod_php4-4.0.1-pl2。[比方你的不是PHP4,那么就急匆匆晋级吗!]
  解开后有多少个文件:mod_php4.dll、mod_php4.conf、readme.txt
  2、相关文件拷贝
  把mod_php4.dll拷贝到apache安装目录的modules目录下边
  把mod_php4.conf拷贝到apache安装目录的conf目录上边
  把msvcrt.dll文件拷贝到apache的装置目录上面
  3、展开conf/srm.conf文件 ,在里面增加一句
  Include conf/mod_php4.conf
  在做那有的事情未发生前请把您的httpd.conf中有关CGI情势的所以设置语句都去掉,即相近上边包车型地铁少年老成部分!
ScripAlias /php4/ “C:/php4/”
AddType application/x-httpd-php4 .php
AddType application/x-httpd-php4 .php3
AddType application/x-httpd-php4 .php4
Action application/x-httpd-php4 /php4/php.exe
要想使PHP帮忙越来越多的后缀名,没问题。在交付的安插文件mod_php4.conf已经帮助了三种后缀名php,php3,php4,假使您还想扶持越来越多的后缀名能够变动那么些文件,很粗大略的。
  4、测试
  用 phpinfo(State of Qatar; ?> 测量试验。会看出Server API的值为apache,并不是cgi
,并且还应该有至于HTTP Headers Information的音信。

发表评论

电子邮件地址不会被公开。 必填项已用*标注