计算机网络探究二之利用PHP实现登录验证之后上网
综述
在上一篇文章中,客户机可以借助路由机直接上网,并没有什么登录限制。接下来我们将加入上网登录验证,只有输入了正确的用户名和密码才可以通过验证,然后才可以访问互联网。
接下来,就跟随我用PHP来实现登录验证吧。
环境配置
在这之前,你需要配置一下LAMP环境,也就是Apache,MySQL,PHP开发环境,依次执行如下命令即可。
1
2
3
4
5
6
7
|
sudo apt-get install apache2
sudo apt-get install php5 php5-cgi php5-mysql php5-curl php5-gd php5-idn php-pear php5-imagick php5-imap php5-mcrypt php5-memcache php5-mhash php5-ming php5-pspell php5-recode php5-snmp php5-tidy php5-xmlrpc php5-sqlite php5-xsl
sudo apt-get install mysql-server mysql-client
sudo apt-get install libapache2-mod-php5
sudo apt-get install libapache2-mod-auth-mysql
sudo apt-get install phpmyadmin
sudo ln -s /usr/share/phpmyadmin/ /var/www/html/phpmyadmin
|
如果配置出现问题,请查阅相关资料。
apache默认的目录为 /var/www/html,我们这时访问
localhost 或者 192.168.122.4,都可以出现apache的欢迎界面,就证明我们配置成功了。
路由初始设置
为了在登录之前限制主机的上网,我们需要利用iptables规则来对数据包的转发加以限制。同时,将网页重定向到本机的登录界面。
初始路由设置如下
1
2
3
4
5
6
7
8
9
|
iptables -F
iptables -t nat -F
iptables -t mangle -F
iptables -P INPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
iptables -t filter -A FORWARD -s 192.168.122.0/24 -o eth0 -j REJECT
iptables -t filter -A FORWARD -s 192.168.122.0/24 -d 119.29.29.29/32 -j ACCEPT
iptables -t nat -A PREROUTING -s 192.168.122.0/24 -p tcp -j DNAT --to 192.168.122.4
|
首先清除所有的iptables规则,然后设置前一篇我们说的IP伪装,这时可以客户机可以通过主机上网。
接下来的一条规则则禁用了来自 192.168.122.0 网段的所有IP的数据包转发,然后设置可访问DNS服务器,最后一条则设置了所有的tcp连接自动跳转到 192.168.122.4,也就是我们刚才配置的服务器。
可以把以上规则保存为脚本,比如叫 init.sh 来运行,也可以添加到 /etc/rc.local 中,开机自动运行。
登录页面
访问到192.168.122.4时,我们需要给用户呈现的当然不是刚才显示的apache欢迎页面,而是登录的输入框以及登录按钮界面。
所以,登录界面代码如下
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
|
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Auth Login</title>
<!-- Bootstrap -->
<link rel="stylesheet" href="css/bootstrap.min.css">
</head>
<body>
<form id="auth" method="post">
<div class="input-group">
<span class="input-group-addon" id="basic-addon1">Username</span>
<input type="text" class="form-control" placeholder="Username" aria-describedby="basic-addon1" name="username">
</div>
<div class="input-group">
<span class="input-group-addon" id="basic-addon1">Password</span>
<input type="text" class="form-control" placeholder="Password" aria-describedby="basic-addon1" name="password">
</div>
<input type="button" id="login" class="btn btn-primary" value="Login">
<input type="button" id="logout" class="btn btn-primary" value="Logout">
</form>
<!-- jQuery (necessary for Bootstrap's JavaScript plugins) -->
<script src="js/jquery.min.js"></script>
<!-- Include all compiled plugins (below), or include individual files as needed -->
<script src="js/bootstrap.min.js"></script>
</body>
<style>
form {
max-width:400px;
margin:0 auto;
}
.input-group {
margin-bottom:20px;
}
</style>
<script>
$(function(){
$("#login").on("click", function() {
$("#auth").attr("action", "/login.php");
$("#auth").submit();
});
$("#logout").on("click", function() {
$("#auth").attr("action", "/logout.php");
$("#auth").submit();
});
});
</script>
</html>
|
其中的js,jquery文件请大家自行引入。
预览一下效果
在这里我们设置了两个按钮,一个是登录,一个是下线。
数据库查询验证
接下来我们新建一个数据库,例如我新建了一个数据库叫auth,然后数据表user,里面有三个字段。分别是id,username,password,我插入了一条数据。
接下来我们就尝试一下登录,提交到 login.php 文件验证一下。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
|
<?php
$mysql_server_name = "localhost";
$mysql_username = "root";
$mysql_password = "123456";
$mysql_database = "auth";
$username = @$_POST['username'];
$password = @$_POST['password'];
$ip=$_SERVER["REMOTE_ADDR"];
$conn=mysql_connect($mysql_server_name, $mysql_username,
$mysql_password);
if ($conn) {
$sql = "select * from user where username = '".$username."'";
$result = mysql_fetch_array(mysql_db_query($mysql_database, $sql, $conn));
if ($result) {
if ($result['password'] == $password) {
$status = -1;
system("sudo ./bash/login.sh $ip", $status);
if ($status == 0) {
echo "Login Successfully";
} else {
echo "Login Failed";
}
} else {
echo "Wrong Password";
}
} else {
echo "Not";
}
} else {
die("Could Not Connect");
}
?>
|
其中,最重要的部分莫过于
1
|
system("sudo ./bash/login.sh $ip", $status);
|
这一行代码了,此处便是登录验证用户名和密码之后执行的一个 Linux 脚本命令。
在这里我把要执行的脚本写入了login.sh文件中,传入的参数便是ip地址。
那么login.sh里面发生了什么事情呢,我们来看一下。
1
2
3
4
5
6
|
iptables -t nat -D PREROUTING -s $1/32 -j ACCEPT
iptables -t nat -D PREROUTING -s $1/32 -p tcp -j ACCEPT
iptables -t filter -D FORWARD -s $1/32 -o eth0 -j ACCEPT
iptables -t nat -I PREROUTING -s $1/32 -j ACCEPT
iptables -t nat -I PREROUTING -s $1/32 -p tcp -j ACCEPT
iptables -t filter -I FORWARD -s $1/32 -o eth0 -j ACCEPT
|
$1的意思就是获取第一个参数,在这里就是IP地址,脚本主要做的事情就是放行来自这个IP地址的数据包,让其正常访问互联网。
保存脚本后,记得给脚本赋予权限
1
|
sudo chmod 777 login.sh
|
-D的意思就是删除,因为iptables是可以添加多次相同的规则的,在添加之前删除一下,以防止多次添加。
在这里
1
|
sudo ./bash/login.sh $ip
|
执行命令脚本前,我们加了sudo,意思就是管理员身份运行,但是仍然可能导致权限问题,因为命令的执行者是PHP(其实是www-data),而并不是root用户,所以我们需要修改一下执行权限。
首先通过PHP文件获取执行该命令的用户是叫什么,比如新建一个 info.php 文件,输入如下内容:
1
2
3
|
<?php
echo shell_exec("id -a");
?>
|
看一下运行结果
嗯,果然,执行用户是www-data,这样我们只需要给www-data添加一个执行权限就好了。
修改 /etc/sudoers 文件
添加一行
1
|
www-data ALL=(ALL) NOPASSWD:ALL
|
意思是www-data以root身份运行并且不需要密码。
好,保存之后,我们尝试一下,就可以登录啦。
测试登录
在路由主机(Ubuntu Route)里面,初始化一下iptables规则,然后查看当前规则。
我们发现当前访问都是被阻止的,而且tcp连接会自动跳转到 192.168.122.4
现在我们登录客户机,随机打开一个网址,比如百度,就发现自动跳转到了登录界面
输入用户名密码,尝试登陆,比如之前插入数据库的是cqc,123456,输入之后登录。
提示登录成功之后,我们便可以欢乐地上网啦。
好,这样我们就完成了验证之后上网啦。
下线操作
同样的,下线操作我们同样写一个logout.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
|
<?php
$mysql_server_name = "localhost";
$mysql_username = "root";
$mysql_password = "123456";
$mysql_database = "auth";
$username = @$_POST['username'];
$password = @$_POST['password'];
$ip=$_SERVER["REMOTE_ADDR"];
echo $ip;
$conn=mysql_connect($mysql_server_name, $mysql_username,
$mysql_password);
if ($conn) {
$sql = "select * from user where username = '".$username."'";
$result = mysql_fetch_array(mysql_db_query($mysql_database, $sql, $conn));
if ($result) {
if ($result['password'] == $password) {
$status = -1;
system("sudo ./bash/logout.sh $ip", $status);
if ($status == 0) {
echo "Login Successfully";
} else {
echo "Login Failed";
}
} else {
echo "Wrong Password";
}
} else {
echo "Not";
}
} else {
die("Could Not Connect");
}
?>
|
登出的脚本如下,其实就是单纯去除了刚才添加的路由规则
1
2
3
|
iptables -t nat -D PREROUTING -s $1/32 -j ACCEPT
iptables -t nat -D PREROUTING -s $1/32 -p tcp -j ACCEPT
iptables -t filter -D FORWARD -s $1/32 -o eth0 -j ACCEPT
|
配置方式和登录一样,大家可以尝试下。
源代码
在这里提供大家源代码下载
源码下载
如有问题,欢迎交流。
转载请注明:静觅 » 计算机网络探究二之利用PHP实现登录验证之后上网
计算机网络探究二之利用PHP实现登录验证之后上网相关推荐
- 计算机网络探究一之利用双网卡主机共享上网
综述 大家好,这次我们需要实现的是实现双网卡主机共享上网,就是一台主机通过连接另一台可以访问外网的双网卡主机来正常上网.所以我们需要两台机器来进行测试,在这里我们用的是两台Ubuntu 14.04,其 ...
- ctfshow-WEB-web11( 利用session绕过登录验证)
ctf.show WEB模块第11关用session中保存的密码进行登录验证, 将 session中保存的密码清空即可绕过 页面中直接给了源码, 很明显是让我们进行代码审计, 源码中将我们输入的密码 ...
- [转载]ESFramework 4.0 快速上手(15) -- 客户端登录验证
ESFramework 4.0 快速上手(15) -- 客户端登录验证 在之前版本的Rapid引擎中,是没有提供客户端登陆验证的机制的,如果要验证用户的帐号密码信息,我们只有自己手动通过自定义信息来实 ...
- 登录验证过程,PC与APP开放登录接口(支持WEB与SDK方式)
1.需求场景 登录,是一个系统的第一步功能.登录成功后,才能进入系统,使用系统功能.在某些场景下,其它系统需要接入到本系统中.或者通过接口的方式进行登录,以及通过接口的方式来取数据. 另外,系统配套移 ...
- 使用filter过滤器实现简单用户登录验证(不用配置web.xml文件)
一.filter过滤器的作用 如果想要获取中文字符,或者是显示提交的中文,就需要添加以下代码,来防止乱码的情况发生. request.setCharacterEncoding("utf-8& ...
- js调用微信利用二维码扫码登录
js调用微信利用二维码扫码登录 准备工作 网站应用微信登录是基于OAuth2.0协议标准构建的微信OAuth2.0授权登录系统. 在进行微信OAuth2.0授权登录接入之前,在微信开放平台注册开发者帐 ...
- 计算机网络实验二:ARP欺骗
计算机网络实验二:ARP欺骗 博客链接:https://www.blog.23day.site/articles/66 一.wireshark 要求:配置并使用wireshark,在无线环境下监听非本 ...
- 天津理工大学 计算机网络综合实验,天津理工大学计算机网络 实验二
<天津理工大学计算机网络 实验二>由会员分享,可在线阅读,更多相关<天津理工大学计算机网络 实验二(6页珍藏版)>请在人人文库网上搜索. 1.实验报告学院(系)名称:计算机与通 ...
- 利用react-router实现按需加载、登录验证、刷新组件。。。
由于React Router 4.0已经正式发布,所以该博文分React Router 和 React Router 4.0 进行分类讨论!该博文会持续更新中,欢迎大家一起讨论与补充! 我相信用过re ...
最新文章
- python常用内置函数总结-Python学习教程之常用的内置函数大全
- word2016配置Mathtype
- Android构建boot.img:root目录与ramdisk.img的生成
- Maven nexus私服仓库类型说明及配置阿里云代理仓库
- 得推乡镇拼车系统源码v1.0
- STM32 - CubeMX 的使用实例详细(01)- STM32F103的配置 - GPIO设定
- 多线程、多平台环境中的跟踪 - 使用 log4j 和 UNIX 命令来挖掘跟踪数据
- 让mysql中行的值拼接_在MySQL中行值包含字符串的SELECT?
- 用python和sympy库解决方程组问题_使用Python的SymPy库解决数学运算问题的方法
- Windows 2008-TS测试-TS GateWay
- Rhino基础教程---三管混接(法二、法三)
- 查找单词出现次数(功能加强)
- matlab计算加减乘除,matlab计算矩阵的加减乘除以及逆
- excel2013 最大行数列数
- 为什么苹果蓝牙耳机连上还是公放_史上最好用的蓝牙无线耳机?苹果AirPods神奇在哪里!...
- Oracle Toad 导数,麒峰
- 【TypeScript】tsc : 无法加载文件 C:\Users\XXX\AppData\Roaming\npm\tsc.ps1,因为在此系统上禁止运行脚本。
- Spring基础-AOP-切入点详解
- hashmap底层源码详解
- Linux学习入门-------------------------VMvare与镜像的安装与配置
热门文章
- 百度大脑险胜最强大脑背后:200万人2亿照片做训练
- font awesome java_Android使用Font Awesome显示小图标(一)
- Redis进阶-Redis持久化原理
- 白话Elasticsearch73_ES生产集群中的索引管理01
- CuteBot智能小车
- RocketMQ集群启动报错:java.lang.RuntimeException: Lock failed,MQ already started
- java final 变量 回收_在Java中将final用于变量会改善垃圾回收吗?
- matlab读取表格读成mat文件,MATLAB 视频读取 Excel读写 Excel2txt txt2mat 按文件夹读取文件...
- 南邮计算机图形学水不水,南邮计算机图形学实验报告(修正版)….doc
- python树莓派设备_Python+树莓派制作IoT(物联网)门控设备