找回密码
 注册

QQ登录

只需一步,快速开始

查看: 2087|回复: 1

WIFIdog 协议分析与应用

[复制链接]
发表于 2015-2-6 17:00:58 | 显示全部楼层 |阅读模式
WIFIdog 简单说就是用户在wifi环境下使用wifi交互登陆的方法
Wifidog Portal认证示例PHP脚本
wifi 路由推荐使用海蜘蛛 3.3 wifi营销固件
这里路由简称 AP
验证服务器简称 AUTH SERVSER
AP 请求是使用$_GET 方法传递数据给AUTH SERVSER
请求参数
下面的参数获取为简写
    $stage = isset($_GET["stage"]) ? $_GET["stage"] : null;    $ip = isset($_GET["ip"]) ? $_GET["ip"] : null;    $mac = isset($_GET["mac"]) ? $_GET["mac"] : null;    $token = isset($_GET["token"]) ? $_GET["token"] : null;    $incoming = isset($_GET["incoming"]) ? $_GET["incoming"] : null;    $outgoing = isset($_GET["outgoing"]) ? $_GET["outgoing"] : null;    $gw_id = isset($_GET["gw_id"]) ? $_GET["gw_id"] : null;
实例
先介绍数据库的结构,我构建的数据库名是portal,表名是User,用于记录等录用用户的用户名、密码等的信息:
create database portal;CREATE TABLE `User` (`Username` varchar(255) NOT NULL,`Password` text NOT NULL,`Token` text,`LoginTime` datetime DEFAULT NULL,`Gw_address` text,`Gw_port` text,`Gw_id` text,`Mac` text,`Url` text,PRIMARY KEY (`Username`)) ENGINE=InnoDB DEFAULT CHARSET=utf8;
首先介绍的是登陆脚本,即上一篇文章介绍的LoginScriptPathFragment配置项配置的脚本(详细介绍见上一篇文章)。
auth.php,主要用于认证服务器验证路由网关提交的token。
<?php    //首先获取URL传递过来的参数,包括stage、ip、mac、token、incoming、outgoing和gw_id.    $stage = isset($_GET["stage"]) ? $_GET["stage"] : null;    $ip = isset($_GET["ip"]) ? $_GET["ip"] : null;    $mac = isset($_GET["mac"]) ? $_GET["mac"] : null;    $token = isset($_GET["token"]) ? $_GET["token"] : null;    $incoming = isset($_GET["incoming"]) ? $_GET["incoming"] : null;    $outgoing = isset($_GET["outgoing"]) ? $_GET["outgoing"] : null;    $gw_id = isset($_GET["gw_id"]) ? $_GET["gw_id"] : null;    //mac和token是必需参数,不能为空,只有mac和token均不为空才有可能通过验证,缺失参数将不显示登录表单.    if(!empty($mac) && !empty($token)){        //mysql连接,相应的参数mysql_host、mysql_user和mysql_password需要换成你自己的参数.        $con = mysql_connect(‘mysql_host’, ‘mysql_user’, ‘mysql_password’);        //数据库连接失败,验证不通过.        if(!$con){            echo "Auth: 0";        }        else{            //选择mysql数据库,如果你的数据库名不是portal,请自行更改.            mysql_select_db(‘portal’, $con);            //用户登陆成功后,会把用户的参数(ip、mac和系统自动生成的token等)记录到数据库,系统主要通过mac识别用户,当然这种方式在大规模系统中可能存在漏洞.            $result = mysql_query("SELECT * FROM User WHERE Mac='".$mac."' AND Token='".$token."'");            //如果token匹配,验证通过,否则验证失败.            if(!empty($result) && mysql_num_rows($result) != 0){                echo "Auth: 1";            }            else{                echo "Auth: 0";            }        }    }    else{        echo "Auth: 0";    }?>
接下来介绍的是登陆成功脚本,即上文介绍的PortalScriptPathFragment配置项配置的脚本(详细介绍见上一篇文章)。
portal.php,主要作用是告知用户登录成功,并跳转用户登录前访问的页面。
<?php    //告知用户登陆成功.    echo ‘登录成功’;    //认证前用户访问任意url,然后被重定向登录页面,session记录的是这个“任意url”.    $url = $_SESSION["url"];    //跳转到登陆前页面.    header("Location: ".$url);?>
当然,这个脚本没有任何界面,为提升用户体验,你可以设计一个好的界面,显示登陆成功信息。
接下来介绍的是错误信息展示脚本,即上文介绍的MsgScriptPathFragment配置项配置的脚本,(详细介绍见上一篇文章)。
gw_message.php,主要作用是当认证过程出现错误的时候,向用户显示用户信息。
<?php    $message = null;    if(isset($_GET["message"])){        $message = $_GET["message"];    }    echo $message;?>
脚本非常简单,错误信息就在message参数中,告知用户即可。当然这个错误信息是英文的,如有需要,可以做做翻译,以提升用户体验。这个脚本同样没有任何界面,需自行设计。
接下来介绍的是心跳脚本,即上文介绍的PingScriptPathFragment配置项配置的脚本,(详细介绍见上一篇文章)。. |+ C, {, L! `2 ^
ping.php,其主要作用是路由确认认证服务器仍然存活,没有死机,另外一个功能是认证服务器可以收集路由的负载等的信息。路由器会定时访问这个脚本,脚本必须回复Pong,否则将认为认证服务器失效而出错。
<?php    echo ‘Pong’;?>
最后介绍的是登陆脚本,即上文介绍的AuthScriptPathFragment配置项配置的脚本,(详细介绍见上一篇文章)。
login.php,主要作用是显示登录界面,用户登陆成功后,跳转到路由器网关的特定接口。
<?php    //获取url传递过来的参数    $gw_address = isset($_GET["gw_address"]) ? $_GET["gw_address"] : null;    $gw_port = isset($_GET["gw_port"]) ? $_GET["gw_port"] : null;    $gw_id = isset($_GET["gw_id"]) ? $_GET["gw_id"] : null;    $mac = isset(isset($_GET["mac"]) ? isset($_GET["mac"] : null;    $url = isset($_GET["url"]) ? $_GET["url"] : null;    //gw_address、gw_port、gw_id和mac是必需参数,缺少不能认证成功.    if(!empty($gw_address) && !empty($gw_port) && !empty($gw_id) && !empty($mac)){        //参数初始化        $post_username = null;        $post_password = null;        $error_message = null;        //如果用户提交用户名和密码,进行验证        if(isset($_POST["username"]) && isset($_POST["password"])){            $post_username = $_POST["username"];            $post_password = $_POST["password"];            //mysql数据库连接,相应的参数mysql_host、mysql_user和mysql_password需要换成你自己的参数.            $con = mysql_connect(‘mysql_host’, ‘mysql_user’, ‘mysql_password’);            //数据库连接失败,展示错误信息            if(!$con){                $error_message = "数据库连接错误!".mysql_error();                //login_view.php展示的是登陆表单(下文介绍),如有错误,展示错误信息.                include("login_view.php");            }            else{                //选择mysql数据库,如果你的数据库名不是portal,请自行更改.                mysql_select_db(‘portal’, $con);                //用户名和密码验证.                $result = mysql_query("SELECT * FROM User WHERE Username='".$post_username."' AND Password='".$post_password."'");                if(!empty($result) && mysql_num_rows($result) != 0){                    //用户名和密码验证成功,生成随机token.                    $token = "";                    $pattern="1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLOMNOPQRSTUVWXYZ";                    for($i=0;$i<32;$i++){                        $token .= $pattern{mt_rand(0,35)};                    }                    //把token等参数写入数据库,已被用于后续验证(上文提到的auth.php).                    mysql_query("Update User SET Token='".$token."', LoginTime='".date("Y-m-d H:i:s")."', Gw_address='".$gw_address."', Gw_port='".$gw_port."', Gw_id='".$gw_id."', Mac='".$mac."', Url='".$url."' WHERE Username='".$post_username."'");                    $error_message = mysql_error();                    //把用户名和url存进session,以备后续使用.                    session_start();                    $_SESSION['username'] = $post_username;                    $_SESSION['url'] = $url;                    //登陆成功,跳转到路由网管指定的页面.                    header("Location: http://".$gw_address.":".$gw_port."/wifidog/auth?token=".$token);                }                else{                    //登录失败,显示错误信息.                    $error_message = "用户名或密码错误!";                    include("login_view.php");                }            }        }        else{            include("login_view.php");        }    }?>
Login_view.php登陆表单。
<html><head>    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />    <meta name="language" content="en" />    <title>Portal Login</title></head><body>    <form method="post" action="<?php echo "login.php?gw_address=$gw_address&gw_port=$gw_port&gw_id=$gw_id&mac=$mac&url=$url"; ?>">        <label for="username">Username</label>        <input type="text" id="username" name="username" value="<?php echo $post_username; ?>"/>        <label for="password">Password</label>原文转自:www.wifidog.pro$ [9 V: a( e& v0 W& h1 _
  u( ^3 [8 ?/ M' t% p9 o0 p1 {
蟑螂侠 该用户已被删除
发表于 2015-3-3 14:49:33 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
*滑块验证:
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|小黑屋|宽带技术网 |网站地图 粤公网安备44152102000001号

GMT+8, 2025-5-3 10:18 , Processed in 0.022664 second(s), 7 queries , Redis On.

Powered by Discuz! X3.5 Licensed

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表