Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537
先了解一下什么是JWT?JWT是一個簡單的PHP的第三方庫,用于在PHP中編碼和解碼JSON WEB令牌jwt 。一般用composer來管理依賴關(guān)系 使用composer require firebase/php-jwt來安裝這個庫(詳見 php-jwt庫:https://github.com/firebase/php-jwt)
再來介紹一下用戶登錄鑒權(quán)流程
1、用戶使用用戶名和密碼來請求服務(wù)器
2、服務(wù)器驗證用戶信息
3、服務(wù)器通過驗證生成一個token返回給客戶端
4、客戶端存儲這個token,并在后面的每一次請求中在請求頭上帶上這個token
5、服務(wù)端驗證這個token token正確就返回數(shù)據(jù) token錯誤就返回錯誤信息
start 首先我們需要一個html表單用于后臺的登錄
<div id="showpage" style="display: none">
<div class="form-group">
<label for="username">用戶名</label>
<input type="text" class="form-control" id="username" placeholder="請輸入用戶名">
</div>
<div class="form-group">
<label for="password">密碼</label>
<input type="password" class="form-control" id="password" placeholder="請輸入密碼">
</div>
<button type="submit" id="sub-btn" class="btn btn-default">登錄</button> <br/>
<p class="bg-warning" style="padding: 10px;">演示用戶名和密碼都是<code>demo</code></p>
</div>
<div id="user" style="display: none">
<p>歡迎<strong id="uname">
</strong>,您已登錄,<a href="javascript:;" id="logout">退出>></a>
</p>
</div>
// 使用axios庫
<script src="https://cdn.bootcss.com/axios/0.17.1/axios.min.js"></script>
<script>
let jwt=localStorage.getItem('jwt');
// token 保存在localstorage里面 判斷有沒有token
if (jwt) {
axios.defaults.headers.common['X-token']=jwt;
axios.get('user.php')
.then(function (response) {
if (response.data.result==='success') {
document.querySelector('#showpage').style.display='none';
document.querySelector('#user').style.display='block';
document.querySelector('#uname').innerHTML=response.data.info.data.username;
} else {
document.querySelector('#showpage').style.display='block';
console.log(response.data.msg);
}
})
.catch(function (error) {
console.log(error);
});
} else {
document.querySelector('#showpage').style.display='block';
}
document.querySelector("#sub-btn").onclick=function(){
let username=document.querySelector("#username").value;
let password=document.querySelector("#password").value;
var params=new URLSearchParams();
params.append('user',username);
params.append('pass',password);
axios.post(
'user.php?action=login',
params,
);
.then(response)=> {
if(response.data.result==='success'){
// 本地存儲token
localStorage.setItem('jwt',response.data.jwt);
// 把token存儲到header里面
axios.defaults.headers.common['X-token']=response.data.jwt;
axios.get('user.php').then(function(response){
if(response.data.result==='success'){
document.querySelector("#showpage").style.display='none';
document.querySelector("#user").style.display='block';
document.querySelector("#uname").innerHTML=response.data.info.data.username;
}else{
}
})
}else{
console.log(response.data.msg);
}
}
.catch(function(error){
console.log(error);
});
}
</script>
服務(wù)器端
首先使用php-jwt庫
使用composer安裝php-jwt,接收到登錄用戶名和密碼后,PHP驗證用戶名和密碼是否正確,如果用戶名和密碼準(zhǔn)確無誤,那么就簽發(fā)token,在token中,我們可以定義token的簽發(fā)者、過期時間等等,并返回給前端。注意在簽發(fā)token時,我們需要定義一個密鑰,這個密鑰是一個私鑰,實際應(yīng)用中是保密的不可告訴別人。
后臺代碼user.php
<?php
date_default_timezone_set("PRC"); //系統(tǒng)使用北京時間
require 'vendor/autoload.php';
use \Firebase\JWT\JWT;
// 私有的密鑰
define('KEY', '1gHuiop975cdashyex9Ud23ldsvm2Xq');
// header('Access-Control-Allow-Origin:*');
$res['result']='failed';
$action=isset($_GET['action']) ? $_GET['action'] : '';
if ($action=='login') {
if ($_SERVER['REQUEST_METHOD']=='POST') {
$username=htmlentities($_POST['user']);
$password=htmlentities($_POST['pass']);
if ($username=='demo' && $password=='demo') { //用戶名和密碼正確,則簽發(fā)tokon
$nowtime=time();
$token=[
'iss'=> 'http://www.helloweba.net', //簽發(fā)者
'aud'=> 'http://www.helloweba.net', //jwt所面向的用戶
'iat'=> $nowtime, //簽發(fā)時間
'nbf'=> $nowtime + 10, //在什么時間之后該jwt才可用
'exp'=> $nowtime + 600, //過期時間-10min
'data'=> [
'userid'=> 1,
'username'=> $username
]
];
// 生成token
$jwt=JWT::encode($token, KEY);
$res['result']='success';
$res['jwt']=$jwt;
} else {
$res['msg']='用戶名或密碼錯誤!';
}
}
echo json_encode($res);
} else {
$jwt=isset($_SERVER['HTTP_X_TOKEN']) ? $_SERVER['HTTP_X_TOKEN'] : '';
if (empty($jwt)) {
$res['msg']='You do not have permission to access.';
echo json_encode($res);
exit;
}
try {
JWT::$leeway=60;
$decoded=JWT::decode($jwt, KEY, ['HS256']);
$arr=(array)$decoded;
if ($arr['exp'] < time()) {
$res['msg']='請重新登錄';
} else {
$res['result']='success';
$res['info']=$arr;
}
} catch(Exception $e) {
$res['msg']='Token驗證失敗,請重新登錄';
}
echo json_encode($res);
}
用戶每次請求都要帶上后端簽發(fā)的token,后端獲取請求中的token,PHP中使用$_SERVER['HTTP_X_TOKEN']就可以獲取token值。這個X_TOKEN就是在我們前端的請求header頭信息中。
然后PHP拿到這個token后,解密分析token值,返回給前端即可。
我們可以看到,在用戶鑒權(quán)的過程中并沒有使用Session或者Cookie,服務(wù)端無需存儲用戶會話信息。只用了一個Token串,建立前后端的驗證的數(shù)據(jù)傳遞,實現(xiàn)了有效的登錄鑒權(quán)過程。
于前陣子我寫的HTTP DoS發(fā)生程序,改寫了一下,實現(xiàn)登錄自己搭建的web滲透測試網(wǎng)站。這個網(wǎng)站叫MYZOO,我讀研一時候,老師提供的一個實驗網(wǎng)站,用來學(xué)習(xí)Web安全,一個微型的交易網(wǎng)站,可以實現(xiàn)更新簡介,查詢,轉(zhuǎn)賬操作。
實際上,在我們所謂的黑客看來,就是Get請求,Post請求嘛,基于這個:
login 函數(shù):用來登錄,獲取cookie和connect句柄
profile 函數(shù):一個POST請求,用來更新數(shù)據(jù)庫中的個人簡介
query 函數(shù):一個GET請求,用來向數(shù)據(jù)庫查詢個人ZOOBAR信息
以上三個算是核心函數(shù)了,雖然實現(xiàn)了登錄,訪問,查詢,退出。但是呢?還是感覺沒啥味道!然而,這通常是小白邁向Web安全,走向傳奇黑客的必經(jīng)之路。誰不是這么走過來的呢?
CSRF跨站請求偽造, XSS 跨站腳本攻擊,SQL注入攻擊,等都是基于對網(wǎng)站有一定的了解,那么怎么就叫對網(wǎng)站有一定的了解呢? 我的回答是:
1.會自己搭建網(wǎng)站
2.會寫爬蟲訪問自己的網(wǎng)站
某些我的讀者,私信咨詢怎么學(xué)習(xí)黑客?這個話題太大,我很難回答好。知乎現(xiàn)在的學(xué)術(shù)氛圍越來越不友好了,答題就加分,不答題就減分。那么答題質(zhì)量如何保證呢?越來越水唄。不管是學(xué)習(xí)黑客,還是學(xué)習(xí)其他什么專業(yè)技能,都需要堅持。很多小白都是腦子一熱,找一堆技能樹,黑客教學(xué)視頻,學(xué)了一陣子,就學(xué)不進(jìn)去了,自然而然的被黑客圈子拒絕在外。
如果非得說個學(xué)習(xí)路線:
科班路線:我還是推薦上學(xué)時期的網(wǎng)絡(luò)安全試驗課目錄,我以前回答過
非科班路線:3年前的看雪論壇,其他幾乎都是種韭菜
我個人感覺:關(guān)注自己喜歡的領(lǐng)域就好,我喜歡黑客的感覺。
堅持向往,慢慢成長,你一定會是矚目的黑客。
如何只花1元搭建個人博客網(wǎng)站
作者 ailx10
去查看
OOC:Massive Open Online Courses,即為大型公開在線課程,在短短的幾年間風(fēng)靡全球,在這個開放的平臺上,你可以隨時隨地接觸到世界各地的名師風(fēng)采。mooc似乎讓學(xué)習(xí)資源的分配更為平等。無論你在哪里,只有可以聯(lián)網(wǎng)就可以學(xué)習(xí)。今天就推薦幾個過你知名MOOC網(wǎng)站,程序員一定要好好利用線上學(xué)習(xí)資源。
1.學(xué)堂在線
簡介:學(xué)堂在線是免費公開的MOOC(大規(guī)模開放在線課程)平臺,是國家教育部MOOC研究中心官方合作平臺,致力于通過來自國內(nèi)外一流名校開設(shè)的免費網(wǎng)絡(luò)學(xué)習(xí)課程,為公眾提供系統(tǒng)的高等教育,讓每一個中國人都有機會享受優(yōu)質(zhì)教育資源。通過和清華大學(xué)在線教育研究中心、以及國內(nèi)外知名大學(xué)的緊密合作,學(xué)堂在線將不斷增加課程的種類和豐富程度。
推薦語:依托于清華師資力量,教學(xué)質(zhì)量很高。
2. 中國大學(xué)MOOC
簡介:國大學(xué)MOOC(慕課) 是愛課程網(wǎng)攜手云課堂打造的在線學(xué)習(xí)平臺,每一個有提升愿望的人,都可以在這里學(xué)習(xí)中國最好的大學(xué)課程,學(xué)完還能獲得認(rèn)證證書。中國大學(xué)MOOC是國內(nèi)最好的中文MOOC學(xué)習(xí)平臺,擁有來自于39所985高校的頂級課程,最好最全的大學(xué)課程,與名師零距離。
推薦語:課程覆蓋很全,商業(yè)化相對程度較高。
3.慕課網(wǎng)
簡介:慕課網(wǎng)(IMOOC)是國內(nèi)最大的IT技能學(xué)習(xí)平臺。慕課網(wǎng)提供了豐富的移動端開發(fā)、php開發(fā)、web前端、android開發(fā)以及html5等視頻教程資源公開課。并且富有交互性及趣味性,你還可以和朋友一起編程。
推薦語:程序員很適合去這個網(wǎng)站,技術(shù)課程覆蓋很全。
4.MOOC中國
簡介:MOOC中國是為國內(nèi)小伙伴推薦最好慕課的中文慕課網(wǎng)。
推薦語:原創(chuàng)課程較少,更多的是資源推薦,也可以發(fā)現(xiàn)不錯的課程,不適合程序員。
寫在最后:
說出你的需求,讓我做你的好助手,好管家,協(xié)助你來發(fā)現(xiàn)更多的優(yōu)質(zhì)資源。
留下你的評論與意見,集思廣益共享價值。
回見啦,我是呆傻萌,每晚10點不見不散。
古言古語:
昨夜西風(fēng)凋碧樹,獨上高樓,望盡天涯路。
*請認(rèn)真填寫需求信息,我們會在24小時內(nèi)與您取得聯(lián)系。