WIFIdog 协议分析与应用

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。

//首先获取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,主要作用是告知用户登录成功,并跳转用户登录前访问的页面。

//告知用户登陆成功.

echo ‘登录成功’;

//认证前用户访问任意url,然后被重定向登录页面,session记录的是这个“任意url”.

$url = $_SESSION["url"];

//跳转到登陆前页面.

header("Location: ".$url);

?>

当然,这个脚本没有任何界面,为提升用户体验,你可以设计一个好的界面,显示登陆成功信息。

接下来介绍的是错误信息展示脚本,即上文介绍的MsgScriptPathFragment配置项配置的脚本,(详细介绍见上一篇文章)。

gw_message.php,主要作用是当认证过程出现错误的时候,向用户显示用户信息。

$message = null;

if(isset($_GET["message"])){

$message = $_GET["message"];

}

echo $message;

?>

脚本非常简单,错误信息就在message参数中,告知用户即可。当然这个错误信息是英文的,如有需要,可以做做翻译,以提升用户体验。这个脚本同样没有任何界面,需自行设计。

接下来介绍的是心跳脚本,即上文介绍的PingScriptPathFragment配置项配置的脚本,(详细介绍见上一篇文章)。

ping.php,其主要作用是路由确认认证服务器仍然存活,没有死机,另外一个功能是认证服务器可以收集路由的负载等的信息。路由器会定时访问这个脚本,脚本必须回复Pong,否则将认为认证服务器失效而出错。

echo ‘Pong’;

?>

最后介绍的是登陆脚本,即上文介绍的AuthScriptPathFragment配置项配置的脚本,(详细介绍见上一篇文章)。

login.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登陆表单。

Portal Login

">

Username

Password
本文由http://www.wifidog.pro/2015/02/06/wifidog%E5%88%86%E6%9E%90-1.html 整理编辑,转载请注明出处

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,947评论 18 139
  • 22年12月更新:个人网站关停,如果仍旧对旧教程有兴趣参考 Github 的markdown内容[https://...
    tangyefei阅读 35,224评论 22 257
  • sqlmap用户手册 说明:本文为转载,对原文中一些明显的拼写错误进行修正,并标注对自己有用的信息。 ======...
    wind_飘阅读 2,098评论 0 5
  • http://192.168.136.131/sqlmap/mysql/get_int.php?id=1 当给sq...
    xuningbo阅读 10,428评论 2 22
  • 我喜欢你,当你说要和我结婚的时候,一夜未眠,五味杂陈。怕你是因为感动而选择我,不是因为爱情。 从我第一眼看见你,就...
    裴扬阅读 225评论 0 0