在web後台開發中我們經常需要儲存一些變數到session中進行暫存,最為特殊的就是「購物車」,由於http的無狀態特性,因此我們需要在客戶端打上乙個標記,唯一的標示客戶端並和服務端session一一對應,因此就有了通過cookie和url進行儲存或傳遞這個標示--sessionid。
sessionid是乙個長的字串,它往往預設通過cookie來儲存,這個session並不持久化到硬碟而是暫存到記憶體中,每次請求時都會在head中帶上這個包含sessionid的cookie,服務端可以根據該id標示出客戶端,從而訪問伺服器的一片記憶體區;另一種通過url方式傳遞sessionid,當cookie在客戶端被禁用時,服務端會將生成的sessionid加入到url,以此完成sessionid的傳輸,又稱url回寫。但是url回寫會有明顯的安全漏洞,當該**被xss注入時,攻擊者就可以通過竊取的sessionid訪問服務端的隱私資料。
首先,我們訪問登陸頁面login.html,在頁面底部的script中,非同步載入乙個名稱為『etag.js』的檔案,這個檔案並不是靜態的,而是由服務端根據客戶端傳遞的引數進行相應處理:如果客戶端的request頭部有『if-none-match』字段,則會在記憶體中檢視是否有該字段對應的value(服務端用hash進行儲存各個客戶的的session),並將該value值序列化,同時觸發客戶端的『etag-ready』事件,並將序列化的value作為值傳入。
在這裡的實現中,有可能會存在瀏覽器對動態檔案『etag.js』的快取,為了避免『etag.js』的準確和實時,因此需要設定『cache-control』頭部。
router.get('/_etag_.js',function * (next)
// console.log(session)
if(session[etag]) else ;
} cache = json.stringify(cache);
ctx.set('etag',etag);
ctx.set('cache-control','no-cache');
// ctx.body = 'window._session = '+ cache + ';';
ctx.body = 'd.do("etag-ready",'+ cache +')';
// console.log('cache: '+cache)
yield *next;
})
在處理post請求時,node並不會解析body,因此需要我們自己來搞定,可以通過模組,也可以簡單的通過訂閱事件,在這裡我是簡單的用node原生的request物件進行偵聽。
為了避免js阻塞渲染,採用非同步載入的方式獲取,但這也會造成從服務端獲取的資料不能及時被客戶端處理和渲染,為了解決這個問題,此處採用了重量級應用必備的解決方案-bigpipe,有服務端出發客戶端訂閱的事件,一旦服務端去到session資料,則觸發'etag-ready'事件,並在客戶端進行邏輯處理和渲染。
客戶端的邏輯如下:
function $(n)
function asyncload(src)
function do()
do.prototype.on = function(k,cb)
this.cbs[k].push(cb);
};do.prototype.do = function(k,data){
if(!this.cbs[k])
return;
var cbs = this.cbs[k],len = cbs.length;
for(var i=0;i使用etag方式來hack相容性是非常棒的,幾乎所有的伺服器都實現了這個機制(http1.1規範),因此相容性不是問題。由於使用etag載入的檔案的元資料都儲存在瀏覽器的快取中,因此安全性是沒法與儲存在記憶體中的cookie方式相比的,而且如果清空瀏覽器快取,那麼客戶端則丟失sessionid,沒法在使用session。因此這種方式也僅僅作為cookie被禁用的一種候補方案,不推薦大規模使用。
php使用session進行命令執行
最近讀wp看到了一種命令執行的騷操作,記錄下來做備份,簡要復現 很簡單,已經刪除掉了一切限制條件,假設存在flag.php存在相同檔案目錄下,最終目的就是讀取其內容。關鍵是結合session的命令執行利用方式 url端 cmd urldecode session id session start b...
使用ETag快取減少網路開銷
使用etag快取減少網路開銷 現在http協議的發展已經很完善了,很多需求在http協議中都已經被支援。比如頁面快取這個需求,http就提供了多種快取功能。最常用的就是超時快取,設定乙個時間,在該時間段內瀏覽器使用快取的資料而不向伺服器發起請求。這種模式對伺服器而言是最省心的,因為不訪問伺服器所以可...
通過http協議中的etag進行使用者追蹤
使用者追蹤是同過乙個唯一標識能定位到乙個使用者。例如a使用者訪問 生成乙個唯一cookie,隨後使用者請求都帶上這個cookie,那麼通過這個cookie就可以分析使用者的訪問或操作行為。通過瀏覽器通常進行使用者追蹤使用的常用手段如幾種,但不僅限於這幾種。除此之外還可以通過http 1.1中的eta...