WEB前后端分離開發中的驗證與安全問題


登錄驗證以及安全問題: 
1、請求接口全部用post方式,在后端判斷請求方式是否為post

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

//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;
}

 

3、登錄驗證問題
(1)前后端代碼放在同一個服務器,依舊可以使用session保存登錄信息;
(2)在登錄過程中,如果密碼是明文提交,傳輸過程中可能會被攔截,即使加密后傳輸,也可用攔截到的已加密密碼直接請求服務器進行登錄,而且因為加密的代碼是在客戶端js中的,黑客可以修改客戶端js,用攔截到的已加密的密碼繞開此加密代碼請求服務器進行登錄,這是非常危險的,所以我想出了如下方案:

請求登錄頁面時,服務器生成一個臨時token存儲在服務器(session)並返回給客戶端,用戶提交登錄時把密碼和臨時token拼接后通過RSA加密傳回到服務器(拼接后再加密的原因是為了防止別人攔截到單單是密碼加密的字符串,
因為如果拿到了單單是密碼加密的字符串,即如上面所說的,無論如何也可以進行假冒登錄的),傳到服務器解密后把密碼和token取出,判斷token是否正確,若正確即進行密碼判斷等一系列登錄操作,登錄成功后銷毀這個臨時token。 
這樣即使在用戶提交數據的過程中數據被攔截,攔截到的數據也是密碼和臨時token拼接后加密的數據,即使黑客用此數據直接對服務器進行請求,因為用戶登錄成功后臨時token已被銷毀,所以黑客並不能登錄成功。

4、關於攔截和偽造cookie進行登錄的預防:
(1)用戶登錄后,由於是用cookie記錄sessid,如過請求過程中cookie被攔截,黑客就可以利用此cookie中的sessid在另一台電腦上進行登錄,直至用戶退出登錄服務器session被銷毀,這樣是非常危險的,所以我想出了如下方案:

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

5、結合4、5兩種方案,我的做法如下:

用戶請求登錄頁面的時候,服務器生成一個token保存在服務器session中和客戶端cookie中,登錄時客戶端帶上此token一起提交到服務器,驗證此token是否有效,若有效即登錄成功並更新此token,重新賦值到session和cookie中; 
登錄后的用戶在每一次請求時都判斷cookie中的token和session中的token是否一樣,若一樣即登錄有效,並且要更新token,下次請求再進行判斷,若不一樣即登錄無效。

  




免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM