WEB先後端分離開發中的驗證與安全問題

登陸驗證以及安全問題: 
一、請求接口所有用post方式,在後端判斷請求方式是否爲postjavascript

二、登陸密碼等敏感信息要加密後傳輸,如用RSA(支付寶裏可下載公私鑰生成工具),客戶端公鑰加密,傳到服務器後再用私鑰解密:php

//js公鑰加密
function encrypt(data)
{
    //須要引入插件jsencrypt.js 下載地址http://download.csdn.net/detail/codercwm/9770398

    var RSA_PUBLIC_KEY = '';//私鑰寫在這裏

    var obj = new JSEncrypt();

    obj.setPublicKey(RSA_PUBLIC_KEY);

    var data = obj.encrypt(data);

    return data;
}

//php解密函數
function decrypt($data) {
    $data = base64_decode($data);

    //讀取私鑰
    $key_private = file_get_contents('./rsa_private_key.pem', 'r');

    //進行解密
    if(!openssl_private_decrypt($data, $data, openssl_pkey_get_private($key_private))) {
        return false;
    }

    return $data;
}

 

三、登陸驗證問題
(1)先後端代碼放在同一個服務器,依舊可使用session保存登陸信息;
(2)在登陸過程當中,若是密碼是明文提交,傳輸過程當中可能會被攔截,即便加密後傳輸,也可用攔截到的已加密密碼直接請求服務器進行登陸,並且由於加密的代碼是在客戶端js中的,黑客能夠修改客戶端js,用攔截到的已加密的密碼繞開此加密代碼請求服務器進行登陸,這是很是危險的,因此我想出了以下方案:java

請求登陸頁面時,服務器生成一個臨時token存儲在服務器(session)並返回給客戶端,用戶提交登陸時把密碼和臨時token拼接後經過RSA加密傳回到服務器(拼接後再加密的緣由是爲了防止別人攔截到單單是密碼加密的字符串,
由於若是拿到了單單是密碼加密的字符串,即如上面所說的,不管如何也能夠進行假冒登陸的),傳到服務器解密後把密碼和token取出,判斷token是否正確,若正確即進行密碼判斷等一系列登陸操做,登陸成功後銷燬這個臨時token。 
這樣即便在用戶提交數據的過程當中數據被攔截,攔截到的數據也是密碼和臨時token拼接後加密的數據,即便黑客用此數據直接對服務器進行請求,由於用戶登陸成功後臨時token已被銷燬,因此黑客並不能登陸成功。

四、關於攔截和僞造cookie進行登陸的預防:
(1)用戶登陸後,因爲是用cookie記錄sessid,如過請求過程當中cookie被攔截,黑客就能夠利用此cookie中的sessid在另外一臺電腦上進行登陸,直至用戶退出登陸服務器session被銷燬,這樣是很是危險的,因此我想出了以下方案:後端

登陸後生成一個臨時token儲存到服務器並傳回到客戶端,客戶端下次請求時把此token傳到服務器,判斷與服務器中儲存的token是否同樣,如不同即爲未登陸,如同樣即銷燬此token並生成新的token返回到客戶端讓客戶端在下一次請求的時候再傳回進行判斷,
如此重複。 這種方法也有一個漏洞,若是用戶在一次請求後,還未進行下一次請求就已被黑客攔截到登陸信息並進行假冒登陸,他同樣能夠登陸成功並使用戶強制下線,但這種方法已大大減小被假冒登陸的機會。

五、結合四、5兩種方案,個人作法以下:安全

用戶請求登陸頁面的時候,服務器生成一個token保存在服務器session中和客戶端cookie中,登陸時客戶端帶上此token一塊兒提交到服務器,驗證此token是否有效,如有效即登陸成功並更新此token,從新賦值到session和cookie中; 
登陸後的用戶在每一次請求時都判斷cookie中的token和session中的token是否同樣,若同樣即登陸有效,而且要更新token,下次請求再進行判斷,若不同即登陸無效。
相關文章
相關標籤/搜索