2014-02-09 63 views
2

我已經開始研究一個新的Web項目,這次我想我會考慮如何處理用戶身份驗證(以前只使用MD5哈希密碼)。我覺得我在網上搜索的每一個角落一個簡單的,非矯枉過正的解決方案,現在我不知道下面是可以實現:AJAX/PHP挑戰 - 響應登錄

  • 客戶端輸入用戶名和密碼,並按下「提交」

  • 在提交AJAX請求到服務器請求一個隨機令牌/現時/祕密/口令

  • 服務器返回的隨機數到一個散列的密碼和隨機數由客戶端發出

  • 客戶端發送的用戶名和散列(密碼+隨機數),可在認證是由服務器

我的問題如下:

  1. 是否有可能爲AJAX問爲nonce服務器並讓服務器等待散列被傳回? (async:false也許?隨意提供摘錄/示例)我看到的唯一另一種選擇是將nonce存儲在隱藏字段中,這看起來不太有利。

  2. 這是否會提供任何額外的安全級別?

  3. 如果沒有,還有什麼其他選擇?我是否應該像過去那樣以明文形式發送密碼?

注: 我知道很多人會想說,HTTPS/SSL是實現一個安全站點的唯一途徑,我聽你的,但是由於這個項目是不應該有超過少數用戶都是由我手動創建的,並且不會有任何安全信息,例如金融交易或其他敏感數據交換。我只想在登錄期間保護密碼/數據的方式爲合理。 MITM和所有其他威脅在這種情況下對我來說不存在問題,因爲 a)所有黑客中的大多數不會對我的小型私人用途項目 和 感興趣b)計算出的任何數據丟失或安全漏洞的成本都不足以保證購買SSL證書

任何意見或建議都會受到讚賞(即使是那些想要責備我是個吝嗇的新手的人);)

+0

查看我的最新回答 – les

+0

SSL證書價格低至5美元,可在15分鐘內安裝。 – Patanjali

+0

截至2015年11月16日,letsencrypt.org將提供免費的SSL證書。 – Patanjali

回答

0

大量的研究之後,通過代碼片斷看我最終意識到,無論我在客戶端實現什麼樣的保護(在Javascript散列,請求隨機數等)增加的安全感會只是一個幻想。當然,它不會受到傷害,但我一直回到「安全通過默默無聞」的報價。

也許有一種方法可以創建一種智能而簡單的方式來驗證用戶身份並保護證書而不使用HTTPS/SSL,但我一直無法找到它(而且我絕對沒有編碼技能它出於我自己)。

我想我只會站在SSL的潮流,爲自己節省很多時間和麻煩。

0

1 - 可以。您可以發送多個AJAX請求,您可以使用一些邏輯設置該請求,以便在滿足特定條件時觸發並響應。也許你可以考慮在客戶端用md5或其他一些支持的技術創建一個隨機salt。

2 - 是的,在散列敏感信息和發送文本方面,任何事情都比md5更好,這是很麻煩的。

3 - 從開放式牆看看phpass。這是一個易於實施的開源,密碼哈希框架,可幫助您完成正確的工作。一些較大的名字使用它,包括wordpress等。如果你設置在ajax上,你必須對自己做一些修改。

+0

1 - 你知道這個的任何例子和/或是否有一個特殊的術語,用於PHP和AJAX發送/接收數據,而我可以搜索相互等待的對方?我對AJAX場景相當陌生,我還沒有找到任何教程或指導實現這一點。由於POST請求應該只有一次有效,我認爲這一切都發生在一個PHP會話中是非常重要的。我錯了嗎? 3 - 我一定會考慮phpass。儘管如此,我覺得加密的PHP /服務器端是我最擔心的。實際上我沒有設置AJAX,但有什麼其他選項可用於客戶端散列? – user1571510

0
<?php 

    // this is normally where you should include a connection to you database 
    // to check user input against what is stored 
    if(isset($_POST["username"])) { 
     $username = $_POST['username']; 
     if ($username == "Joe Schmoe") { 
      echo $username.' is taken'; 
      exit(); 
     } else { 
      echo $username.' is available'; 
      exit(); 
     } 
    } 
?> 
<?php 

    // this is also where you should include a connection to you database 
    // to check user input against what is stored 
    if(isset($_POST["submitIt"])) { 
     $username = $_POST['submitIt']; 
     if ($username == "Joe Schmoe") { 
      echo 'Username is taken'; 
      exit(); 
     } else { 
      echo 'Success!!'; 
      exit(); 
     } 
    } 
?> 
<!DOCTYPE html> 
<html> 
<head> 
    <script> 
     function ajaxObj(meth, url) { 
      var x = new XMLHttpRequest(); 
      x.open(meth, url, true); 
      x.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); 
      return x; 
     } 
     function ajaxReturn(x){ 
      if(x.readyState == 4 && x.status == 200){ 
       return true; 
      } 
     } 
    </script> 
    <script> 
     function username_availability() { 
      var un_value = document.getElementById("username_value").value; 
      var un_error = document.getElementById("username_error"); 
      var un_status = document.getElementById("username_status"); 
      if (un_value != "") { 
       var ajax = ajaxObj("POST", "<?php echo $_SERVER['PHP_SELF']; ?>"); 
       ajax.onreadystatechange = function() { 
        if(ajaxReturn(ajax) == true) { 
         un_status.innerHTML = ajax.responseText; 
        } 
       } 
       ajax.send("username="+un_value); 
      } 
     } 
     function submitIt() { 
      var un_value = document.getElementById("username_value").value; 
      var un_status = document.getElementById("username_status"); 
      var sb_button = document.getElementById("submit_button"); 
      var r_message = document.getElementById("result_message"); 
      var un_form = document.getElementById("username_form"); 
      if (un_value == "") { 
       un_ststus.innerHTML = "Form data is missing"; 
      } else { 
       un_status.innerHTML = 'processing...'; 
       var ajax = ajaxObj("POST", "<?php echo $_SERVER['PHP_SELF']; ?>"); 
       ajax.onreadystatechange = function() { 
        if(ajaxReturn(ajax) == true) { 
         if(ajax.responseText == "Username is taken") { 
          un_status.innerHTML = ajax.responseText; 
         } else { 
          window.scrollTo(0,0); 
          r_message.innerHTML = 'Username is yours!!!'; 
          un_status.innerHTML = ajax.responseText; 
         } 
        } 
       } 
       ajax.send("submitIt=" + un_value); 
      } 
     } 
    </script> 
</head> 
<body> 
    <form name="username_form" id="username_form" onsubmit="return false;"> 
     <div>Username: </div> 
     <input id="username_value" type="text" onkeyup="username_availability()" autofocus> 
     <button id="submit_button" onclick="submitIt()">Submit</button> 
     <div id="result_message">Submit Username</div> 

     <div id="username_status"></div> 
    </form> 
</body> 
</html>