㈠ php 如何使用cookie安全的保存登錄狀態sessionid
同樣還是將用戶的認證信息保證在一個cookie中,具體如下:
1.cookie名:uid。推薦進行加密,比如MD5('站點名稱'+userid)。
2.cookie值:登錄名|有效時間Expires|hash值。hash值可以由"登錄名+有效時間Expires+用戶密碼(加密後的)的前幾位+salt",salt是保證在伺服器端站點配置文件中的隨機數。
這樣子設計有以下幾個優點:
1.即使資料庫被盜了,盜用者還是無法登錄到系統,因為組成cookie值的salt是保證在伺服器站點配置文件中而非資料庫。
2.如果賬戶被盜了,用戶修改密碼,可以使盜用者的cookie值無效。
3.如果伺服器端的資料庫被盜了,通過修改salt值可以使所有用戶的cookie值無效,迫使用戶重新登錄系統。
4.有效時間Expires可以設置為當前時間+過去時間(比如2天),這樣可以保證每次登錄的cookie值都不一樣,防止盜用者窺探到自己的cookie值後作為後門,長期登錄。
㈡ 用PHP怎麼在session里存多個id
這個你不用擔心,每個session都有唯一的session_id,每次生成session,php都會自動生成1條唯一的session
session_id是不會列印出來的
只能另行輸出 echo session_id()
或者可以:
Session 的工作機制是:為每個訪問者創建一個唯一的 id (UID),並基於這個 UID 來存儲變數。UID 存儲在 cookie 中,亦或通過 URL 進行傳導。
前序:
首先要明白PHPSESSID看似多次刷新都不會改變其實是沒有刪除本地相關聯的cookie,刪除的方法
session_destroy();//刪除伺服器端的session文件
setcookie(session_name(),'',time()-3600,'/');//刪除本地相關聯的cookie
session_unset();//清空內存中的cookie或者是$_SESSION = array();
然後再刷新相應的頁面你就會看到PHPSESSID會發生變化了,根據此可以得:如果session文件已經創建則不重新生成PHPSESSID,否則需要重新生成,生成規則,就看下邊嘍……!
--------------------------------------------------------------------------------------------------------------------------------------
現在經過測試應該是不是檢測session文件是否存在,而是檢測PHPSESSID的cookie是否存在並且是否未過期!特此更正!
------------------------------------------------------------------------------------------------
可能PHP開發者心中多少都思考過這么兩個問題:
種植在客戶端瀏覽器中的PHPSESSIONID會出現重復嗎?
PHPSESSIONID安全性如何,有沒可能被黑客輕易的仿造呢?
帶上這個問題,我稍微注意了一下PHP的源碼後,疑問也就有了答案。
PHP在使用默認的 session.save_handler = files 方式時,PHPSESSIONID的生產演算法原理如下:
hash_func = md5 / sha1 #可由php.ini配置
PHPSESSIONID = hash_func(客戶端IP + 當前時間(秒)+ 當前時間(微妙)+ PHP自帶的隨機數生產器)
從以上hash_func(*)中的數據采樣值的內容分析,多個用戶在同一台伺服器時所生產的PHPSESSIONID重復的概率極低(至少為百萬份之一),設想,但台動態Web Server能到2000/rps已經很強悍了。
另外,黑客如果要猜出某一用戶的PHPSESSIONID,則他也必須知道「客戶端IP、當前時間(秒、微妙)、隨機數」等數據方可模擬。
以下是截取PHP源碼中PHPSESSIONID實現片段:
gettimeofday(&tv, NULL);
if (
zend_hash_find(&EG(symbol_table), "_SERVER", sizeof("_SERVER"), (void **) &array) == SUCCESS &&
Z_TYPE_PP(array) == IS_ARRAY && zend_hash_find(Z_ARRVAL_PP(array), "REMOTE_ADDR", sizeof("REMOTE_ADDR"), (void **) &token) == SUCCESS)
{
remote_addr = Z_STRVAL_PP(token);
}
spprintf(&buf, 0, "%.15s%ld%ld%0.8F", remote_addr ? remote_addr : "", tv.tv_sec, (long int)tv.tv_usec, php_combined_lcg(TSRMLS_C) * 10);
switch (PS(hash_func))
{
case PS_HASH_FUNC_MD5:
PHP_MD5Init(&md5_context);
PHP_MD5Update(&md5_context, (unsigned char *) buf, strlen(buf));
digest_len = 16;
break;
case PS_HASH_FUNC_SHA1:
PHP_SHA1Init(&sha1_context);
PHP_SHA1Update(&sha1_context, (unsigned char *) buf, strlen(buf));
digest_len = 20;
break;
default:
php_error_docref(NULL TSRMLS_CC, E_ERROR, "Invalid session hash function");
efree(buf);
return NULL;
}
㈢ 如何用PHP模擬登錄,並保存Session值。急急急。。。。。
這個是要連接資料庫的。。。
生成頁面:
開啟session(每個php頁面都寫這句):session_start();
生成session:$_session['test']=100;//把100存入session,並命名test;
接受頁面:
開啟session:session_start();
接受session:$test=$_session['test'];
輸出session:echo $test;
。。。。。。
後面不知道怎麼寫了
㈣ php sessionid怎麼獲取
用session_id()函數獲取
示例:
<?php
session_start();
echosession_id();
?>
㈤ 關於php模擬登錄網站的問題,一直提示驗證碼錯誤
以我的經驗,驗證碼不可能是根據session id來的,那不是每次刷新網頁驗證碼都不變,驗證碼也失去了驗證碼的作用.
驗證碼是需要手動輸入的
㈥ php中的sessionId是干什麼的
SESSION_ID會話ID。
session_data是編碼會話數據。這個數據是在PHP內部編碼$_SESSION超全局,以序列化字元串,並把它當作這個參數的結果。
請注意會話使用替代序列化方法。
返回值
會話存儲的返回值(通常成功返回 0,失敗返回 1)。