计算机网络探究二之利用PHP实现登录验证之后上网
綜述
在上一篇文章中,客戶機可以借助路由機直接上網,并沒有什么登錄限制。接下來我們將加入上網登錄驗證,只有輸入了正確的用戶名和密碼才可以通過驗證,然后才可以訪問互聯網。
接下來,就跟隨我用PHP來實現登錄驗證吧。
環境配置
在這之前,你需要配置一下LAMP環境,也就是Apache,MySQL,PHP開發環境,依次執行如下命令即可。
sudoapt-get install apache2 sudo apt-get install php5 php5-cgi php5-mysql php5-curl php5-gd php5-idnphp-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| 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規則來對數據包的轉發加以限制。同時,將網頁重定向到本機的登錄界面。
初始路由設置如下
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| 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歡迎頁面,而是登錄的輸入框以及登錄按鈕界面。
所以,登錄界面代碼如下
<!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>| 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 文件驗證一下。
<?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 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"); ????} ?> |
其中,最重要的部分莫過于
system("sudo ./bash/login.sh $ip", $status);| 1 | system("sudo ./bash/login.sh $ip", $status); |
這一行代碼了,此處便是登錄驗證用戶名和密碼之后執行的一個 Linux 腳本命令。
在這里我把要執行的腳本寫入了login.sh文件中,傳入的參數便是ip地址。
那么login.sh里面發生了什么事情呢,我們來看一下。
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 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地址的數據包,讓其正常訪問互聯網。
保存腳本后,記得給腳本賦予權限
sudo chmod 777 login.sh| 1 | sudo chmod 777 login.sh |
-D的意思就是刪除,因為iptables是可以添加多次相同的規則的,在添加之前刪除一下,以防止多次添加。
在這里
sudo ./bash/login.sh $ip| 1 | sudo ./bash/login.sh $ip |
執行命令腳本前,我們加了sudo,意思就是管理員身份運行,但是仍然可能導致權限問題,因為命令的執行者是PHP(其實是www-data),而并不是root用戶,所以我們需要修改一下執行權限。
首先通過PHP文件獲取執行該命令的用戶是叫什么,比如新建一個 info.php 文件,輸入如下內容:
<?php echo shell_exec("id -a"); ?>| 1 2 3 | <?php ????echo shell_exec("id -a"); ?> |
看一下運行結果
嗯,果然,執行用戶是www-data,這樣我們只需要給www-data添加一個執行權限就好了。
修改 /etc/sudoers 文件
添加一行
www-data ALL=(ALL) NOPASSWD:ALL| 1 | www-data ALL=(ALL) NOPASSWD:ALL |
意思是www-data以root身份運行并且不需要密碼。
好,保存之后,我們嘗試一下,就可以登錄啦。
測試登錄
在路由主機(Ubuntu Route)里面,初始化一下iptables規則,然后查看當前規則。
我們發現當前訪問都是被阻止的,而且tcp連接會自動跳轉到 192.168.122.4
現在我們登錄客戶機,隨機打開一個網址,比如百度,就發現自動跳轉到了登錄界面
輸入用戶名密碼,嘗試登陸,比如之前插入數據庫的是cqc,123456,輸入之后登錄。
提示登錄成功之后,我們便可以歡樂地上網啦。
好,這樣我們就完成了驗證之后上網啦。
下線操作
同樣的,下線操作我們同樣寫一個logout.php
<?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 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"); ????} ?> |
登出的腳本如下,其實就是單純去除了剛才添加的路由規則
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| 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实现登录验证之后上网的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 计算机网络探究一之利用双网卡主机共享上网
- 下一篇: MVC框架浅析(基于PHP)