本文目錄一覽:
請問PHP的會話怎麼限制域
用session_save_path設置session的存放路徑,給每個不同的系統設置一個不同的session存放目錄就可以區分開了。該方法要用在session_start前
PHP會話驗證問題,怎麼解決
會話控制的思想就是指能夠在網站中根據一個會話跟蹤用戶。這裡整理了詳細的代碼,有需要的小夥伴可以參考下。
概述
http 協議是無狀態的,對於每個請求,服務端無法區分用戶。PHP 會話控制就是給了用戶一把鑰匙(一個加密session字符串),同時這也是用戶身份的一個證明,服務端存放了這把鑰匙能打開的箱子(數據庫,內存數據庫或者使用文件做的),箱子裡面裝的就是用戶的各個變量信息。
傳統的php session 使用
?php
//page1.php 啟動一個會話並註冊一個變量
session_start();
$_SESSION[‘user_var’] = “hello,codekissyoung!”;
//這裡的可以將$_SESSION理解為用戶的箱子,實際的實現是php在服務器端生成的小文件
?
?php
//page2.php
session_start();
echo $_SESSION[‘user_var’];//通過鑰匙訪問自己的箱子內的變量
$_SESSION[‘user_var’] = “bey,codekissyoung!”;
?
?php
//page3.php 銷毀鑰匙,一般在用戶註銷時,訪問page3.php文件
session_start();
session_destroy();
?
提一個問題,鑰匙呢?沒看見給用戶鑰匙的操作啊?
這個操作是php背後幫我們做了的,自從你訪問page1.php 程序運行,session_start();這句時,php 會根據此刻的一些條件(用戶ip,瀏覽器號,時間等)生成一個PHPSESSID變量,http response 回客戶端後,這個PHPSESSID就已經存在你的瀏覽器cookie里了,每次你再次訪問這個域名時,該PHPSESSID都會發送到服務端。這個PHPSESSID 就是我這裡說的用戶鑰匙了。
再一個問題,這個PHPSESSID的安全性,它是否容易被竊取,是否容易被偽造,是否容易被篡改?
使用 Https 可以防止被篡改。不使用PHPSESSID,而是自己生成一把秘鑰給用戶可以防止被偽造。至於是否容易被竊取,還真沒怎麼研究過。比如如果你電腦連着網,黑客入侵你電腦。
將生成的秘鑰存入瀏覽器cookie中
設置cookie
setCookie(‘key’,’value’,time()+3600);
刪除cookie
setCookie(‘key’,”,time()-1);
實現單點登錄:session共享
單點登錄:多個子系統之間共用一套用戶驗證體系,在其中一處登錄,就可以訪問所有子系統。
試想這麼一種情景:假設服務器A與B的php環境一致。用戶在 服務器A 上拿到了自己的鑰匙,然後他拿着這把鑰匙去訪問服務器B,請問服務器B認識么?
很顯然不能,服務器A生成的鑰匙,服務器並不認識。
解決辦法:用戶無論訪問A或B,生成的鑰匙我都存儲在C(同一個數據庫,或緩存系統)中,用戶再次訪問A或B時,A和B都去問下C:這個用戶的鑰匙對么?對的話,用戶就可以使用自己存在A或者B那裡的箱子了。
?php
session_regenerate_id();//重置 session 字符
$session_info=array(‘uid’=$uid,’session’=session_encrypt(session_id().time()));
//下一步將,$session_info 存到 C 中
?
下面是php通過會話控制實現身份驗證實例
身份驗證應用程序主體:authmain.PHP
?php
//開啟一個會話
session_start();
if((!isset($userid))||(!isset($password))) {
$userid=$_POST[‘userid’];
$password=$_POST[‘password’];
//連接數據庫
$db_conn=new mysqli(“localhost”, “root”, “”,”auth”);
if(mysqli_connect_errno()){
echo ‘連接數據庫失敗:’.mysqli_connect_error();
exit();
}
//執行SQL查詢語句
$query=”SELECT * FROM authorized_users WHERE name='”.$userid.”‘ and password=sha1(‘”.$password.”‘)”;
$result=$db_conn-query($query);
if($result-num_rows0){
//註冊一個會話變量
$_SESSION[‘valid_user’]=$userid;
}
//斷開數據庫連接
$db_conn-close();
}
?
!DOCTYPE html
html
head
meta charset=”UTF-8″
title身份驗證/title
/head
body
h1主頁/h1
?php
//判斷用戶是否已經登錄
if(isset($_SESSION[‘valid_user’])){
echo $_SESSION[‘valid_user’].’,您好,你已經登錄’;
echo ‘a href=”logout.php”退出登錄/abr/’;
}else{
if(isset($userid)){
echo ‘您沒有登錄成功’;
}else{
echo ‘您還沒有登錄br/’;
}
?
form method=”post” action=”authmain.php”
p用戶名:input type=”text” name=”userid”/p
p密碼:input type=”password” name=”password”/p
pinput type=”submit” name=”submit” value=”登錄”/p
/form
?php
}
?
br/
a href=”members_only.php”登錄進入/a
/body
/html
網站的有效用戶檢查:members_only.php
!DOCTYPE html
html
head
meta charset=”UTF-8″
title身份驗證/title
/head
body
?php
//啟用會話
session_start();
echo ‘h1會員有效/h1’;
if(isset($_SESSION[‘valid_user’])){
echo “p”.$_SESSION[‘valid_user’].”,您好,您已經登錄成功/p”;
echo ‘p會員可享受折扣優惠/p’;
}else{
echo ‘p您還沒有登錄成功/p’;
echo ‘p只有登錄成功才能查看此頁/p’;
}
echo ‘a href=”authmain.php”返回主頁/a’;
?
/body
/html
註銷會話變量並銷毀會話:logout.php
?php
//啟用會話
session_start();
$olduser=$_SESSION[‘valid_user’];
//註銷會話變量
unset($_SESSION[‘valid_user’]);
//銷毀會話
session_destroy();
?
!DOCTYPE html
html
head
meta charset=”UTF-8″
title退出登錄/title
/head
body
h1您退出登錄了!/h1
?php
if(!empty($olduser)){
echo ‘退出登錄了br/’;
}else{
echo ‘您沒有登錄過,所以當然也不存在退出登錄br/’;
}
?
a href=”authmain.php”返回主頁/a
/body
/html
3.PHP核心技術
Cookie 和 session 是兩種不同的存儲機制。cookie 是從一個外部頁面到下一個頁面的數據傳遞的方法,它一般是存儲在客戶端的。Session 是讓數據在頁面當中具有持續有效的一個方法。他一般是存儲在服務器端。
Cookie 是一種在客戶瀏覽器端存儲數據,並且以此來去跟蹤和識別用戶的一種機制。簡單的說呢,cookie 是 Web 服務器暫時存儲在用戶的硬盤上的一個文本文件。
web 服務器可以通過 Cookie 包含的信息來篩選或維護這些信息。用來判斷 HTTP 傳輸的狀態。
在 PHP 中通過 setcookie()函數創建 Cookie,在創建 Cookie 之前,要了解 Cookie 是 HTTP 頭標的組成部分。
通過超全局變量數組$_COOKIE[ ]來讀取瀏覽器端的 Cookie 值
是自動刪除Cookie數據,如果設置了失效時間,瀏覽器會記住Cookie數據,即使重啟計算機,只要時間不到,都依然有效。
1.使用 setcookie()函數刪除 Cookie
2.在瀏覽器中手動刪除
如果 Cookie 不設定失效時間,就表示它的生命周期,就為瀏覽器會話的期間的這個時間。只要關閉瀏覽器,Cookie 就會自動消失。這種 cookie 被稱之為叫會話 cookie。一般情況下,啊,不存在硬盤上的,而是保存在這個內存裡邊。
如果設置失效時間,瀏覽器會把 cookie 保存到硬盤上,再次打開瀏覽器的時候,依然會有效,只要時間未過期,就一直有效。直到到達有效時間。
雖然,cookie 可以長期保存在客戶端的瀏覽器當中。但是瀏覽器最多允許存儲 300 個 cookie 文件。而且每一個 Cookie 文件支持最大容量只有 4kb。每一個域名最多只支持 20 個 cookie。如果達到限制,瀏覽器會自動隨機的刪除 cookie 文件。
Session 在翻譯的時候呢也翻譯為“會話”。他原本的意思就是指,有始有終的一系列的動作或者消息。比如你打電話的時候從拿起電話撥電話號碼一直到掛斷電話這一系列的過程就可以稱之為一個 Session。
啟動一個 session 會話時,會生成一個隨機且唯一的 session_id。也就是 session 的文件名。session_id 存儲在服務器的內存中。當你關閉頁面的時候,這個 id 會自動註銷。重新再登錄這個頁面的時候呢,會再次生成一個隨機且唯一的 id。
創建一個會話需要的步驟
啟動會話-註冊會話-使用會話-刪除會話
1.啟動會話 註冊會話
啟動 PHP 會話的方式有兩種方式:1、使用 session_start()函數,2.使用 session_register()函數為會話創建一個變量來隱含的啟動會話
3.刪除會話
1.刪除單個
2.刪除多個
3.結束當前會話
1.session_set_cookie_params() 設置 session 的失效時間,這個函數是 Session 結合 Cookie 設置失效時間。
此函數在一些瀏覽器上會出現問題。所以一般建議手動設置。
2.使用 setcookie() 可以設置 Session 的失效時間,
使用 GD2 函數庫可以實現對各種圖形圖像的處理,先使用 GD2 函數庫來創建畫布。通過 imagecreate()實現.
使用 imageTTFText()函數將文字以 TTF 字體輸出在圖像中。 1.使用 header()函數定義輸出的圖像類型。
2.imagecreatefromjpeg()函數載入圖片。
3.imagecolorallocate()函數設置輸出字體顏色。 4.定義輸出的中文字符串所使用的字體。 5.通過 iconv()函數對輸出的中文字符串的編碼格式進行轉換。 6.使用 imageTTFText()函數向圖片中添加文字。 7.創建圖像,釋放資源。
文件處理包括讀取、關閉、重寫等。
打開/關閉文件使用 fopen()函數和 fclose()函數。(千萬小心,別誤刪了文件)
1.打開文件/關閉文件
1.從文件中讀取數據
2.文件寫入
php 除了可以對文件進行讀寫之外,對文件本身同樣也可以進行操作。比如說複製重命名,查看修改日期,等等都可以。
1.打開目錄
使用 opendir()函數打開目錄
2.關閉目錄
使用 closedir()函數關閉目錄
1.使用 scandir()函數
2.readdir() 函數
chmod($pathname,權限);
權限分別使用3個值:
要想去順利地實現這個上傳功能,我們要在php.ini這個文件裡面去修改它的配置.
$_FILES變量它存儲的是上傳文件的相關信息。對於我們去完成上傳文件的這個功能提供一些參數信息。
先在a.html 頁面完成表單元素的創建,使用input type=”file”元素提供上傳文件的入口。
move_uploaded_file(string filename,string destinationnpath)函數上傳文件存儲到指定的位置。
創建upload.php 文件用來處理客戶端上傳過來的文件的信息,包括文件的存儲。
php程序如何避免用戶同時訪問某連接造成的數據錯誤
樓主你可以考慮MYSQL的事務處理功能。
一般來說,事務是必須滿足4個條件(ACID)
原子性(Autmic):事務在執行性,要做到“要麼不做,要麼全做!”,就是說不允許事務部分得執行。即使因為故障而使事務不能完成,在rollback時也要消除對數據庫得影響!
一致性(Consistency):事務得操作應該使使數據庫從一個一致狀態轉變倒另一個一致得狀態!就拿網上購物來說吧,你只有即讓商品出庫,又讓商品進入顧客得購物籃才能構成事務!
隔離性(Isolation):如果多個事務並發執行,應象各個事務獨立執行一樣!
持久性(Durability):一個成功執行得事務對數據庫得作用是持久得,即使數據庫應故障出錯,也應該能夠恢復!
說白了就是某一個用戶進行兌換操作的時候,就把對應的數據表鎖定死,只有等操作完成後才解鎖。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/158260.html