2013-07-17 104 views
2

我希望有人能夠幫助解決我正在處理的一些代碼中存在的這個小問題。請記住,這只是一個愛好網站,我知道有安全漏洞。 我寫了一個名爲set_remember_cookies的函數,當用戶選中「記住我」框時,從我的登錄腳本和註冊頁面調用該函數。PHP的setcookie函數不保存cookie?

每個安全網頁上的功能,然後執行以下操作:

  1. 檢查,看看是否還記得餅乾設置
  2. 查詢數據庫中查找與哈希的用戶名在cookie相關的USER_ID
  3. 從用戶表中獲取該User_ID的密碼
  4. 從remember_cookies表中獲取salt
  5. 散列密碼+ salt並將其與散列p cookie中的密碼

再說一遍,我知道在cookie中存儲哈希密碼是不安全的,但我現在不擔心這一點。

我的問題是,我已經包含在下面的set_remember_cookies函數實際上並沒有設置cookie。在受保護的頁面上,第一步(檢查cookie是否存在)失敗。我也在瀏覽器中檢查了這些cookie,並且它們沒有被存儲。

任何人都可以向我解釋爲什麼這個功能沒有設置cookie?我找不到任何錯誤,但希望有人能!謝謝!

<?php 
     function set_remember_cookies($uid, $identifier, $password) { 
      mysql_query("DELETE FROM remember_cookies WHERE User_ID = '$uid'"); //Delete old cookie records 
      $salt = sha1(uniqid(time() . $_SERVER['HTTP_REFERER'])); 
      $username_hash = hash("sha256", $identifier . $salt); //Hash the username 
      if (mysql_query("INSERT INTO remember_cookies (User_ID, Username_Hash, Salt) VALUES ('$uid', '$username_hash', '$salt')")) { 
       setcookie("Username", $username_hash, 60*60*24*365); 
       setcookie("Password", hash("sha512", $password . $salt), 60*60*24*365); 
      } 
     } 
    ?> 

回答

6

您的cookies在某些時候在1971年過期!看起來你想在未來的偏移一年所以儘量

setcookie("Username", $username_hash, time() + 60*60*24*365); 

第三個參數是不是從「現在」抵消,這是一個從Unix epoch開始的偏移量 - 該rather fine manuals不明確這一點:)

+0

那麼......我有一種感覺,我忽略了一件簡單的事情!我之前使用過cookies,並且今天必須重新閱讀這些文檔大約3次。哦,有時候你需要別人來指出我想的,哈哈!謝謝! – HockeyRef45

1

setcookie(name, $value, $expire);

根據手冊:您需要在到期時間添加到時間()

cookie過期的時間。這是一個Unix時間戳,因此自紀元以來秒數爲 。換句話說,你很可能會用time()函數加 這個加上你在 希望它到期之前的秒數。或者你可以使用mktime()。時間()+ 60 * 60 * 24 * 30將 設置cookie在30天內過期。如果設置爲0或省略,則 Cookie將在會話結束時過期(當瀏覽器 關閉時)。