php session跟cookie使用说明

Jun 13, 2016 am 11:37 AM
cookie php session setcookie

php session和cookie使用说明

1. PHP的COOKIE?

cookie 是一种在远程浏览器端储存数据并以此来跟踪和识别用户的机制。PHP在http协议的头信息里发送cookie, 因此setcookie() 函数必须在其它信息被输出到浏览器前调用,这和对header() 函数的限制类似。1.1 设置cookie:?
可以用setcookie() 或setrawcookie() 函数来设置cookie。也可以通过向客户端直接发送http头来设置.?
1.1.1 使用setcookie()函数设置cookie:?
bool setcookie( stringname [, stringvalue [, int expire [, stringpath [, stringdomain [, bool secure [, bool httponly]]]]]] )?
name: cookie变量名value: cookie变量的值expire: 有效期结束的时间,?
path: 有效目录,?
domain: 有效域名,顶级域唯一secure: 如果值为1,则cookie只能在https连接上有效,如果为默认值0,则http和https都可以.?
例子:?

复制代码代码如下:

$value= 'something from somewhere';?
setcookie("TestCookie", $value);?
/* 简单cookie设置*/setcookie("TestCookie", $value, time()+3600); /* 有效期1个小时*/setcookie("TestCookie", $value, time()+3600, "/~rasmus/", ".example.com", 1); /* 有效目录/~rasmus,有效域名example.com及其所有子域名*/?
?>?


设置多个cookie变量: setcookie('var[a]','value');用数组来表示变量,但他的下标不用引号.这样就可以用$_COOKIE[‘var'][‘a']来读取该COOKIE变量.?

1.1.2. 使用header()设置cookie;?
header("Set-Cookie: name=$value[;path=$path[;domain=xxx.com[; ]]");?
后面的参数和上面列出setcookie函数的参数一样.?
比如:?

复制代码代码如下:

$value= 'something from somewhere';?
header("Set-Cookie:name=$value");?


1.2 Cookie的读取:?

直接用php内置超级全局变量$_COOKIE就可以读取浏览器端的cookie.?
上面例子中设置了cookie"TestCookie",现在我们来读取:?

print$_COOKIE['TestCookie'];?

COOKIE是不是被输出了?!?

1.3 删除cookie?
只需把有效时间设为小于当前时间, 和把值设置为空.例如:?
setcookie("name","",time()-1);?
用header()类似.?

1.4 常见问题解决:?

1) 用setcookie()时有错误提示,可能是因为调用setcookie()前面有输出或空格.也可能你的文档使从其他字符集转换过来,文档后面可能带有BOM签名(就是在文件内容添加一些隐藏的BOM字符).解决的办法就是使你的文档不出现这种情况.还有通过使用ob_start()函数有也能处理一点.?
2) $_COOKIE受magic_quotes_gpc影响,可能自动转义3) 使用的时候,有必要测试用户是否支持cookie?
?

1.5 cookie工作机理:?

有些学习者比较冲动,没心思把原理研究,所以我把它放后面.?
a) 服务器通过随着响应发送一个http的Set-Cookie头,在客户机中设置一个cookie(多个cookie要多个头).?
b) 客户端自动向服务器端发送一个http的cookie头,服务器接收读取.?

HTTP/1.x 200 OK?
X-Powered-By: PHP/5.2.1?
Set-Cookie: TestCookie=something from somewhere; path=/?
Expires: Thu, 19 Nov 2007 18:52:00 GMT?
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0?
Pragma: no-cache?
Content-type: text/html?

这一行实现了cookie功能,收到这行后Set-Cookie: TestCookie=something from somewhere; path=/?
浏览器将在客户端的磁盘上创建一个cookie文件,并在里面写入:?

TestCookie=something from somewhere;?
这一行就是我们用setcookie('TestCookie','something from somewhere','/');的结果.也就是用header('Set-Cookie: TestCookie=something from somewhere; path=/');的结果.?
?



2. PHP的Session?

session使用过期时间设为0的cookie,并且将一个称为session ID的唯一标识符(一长串字符串),在服务器端同步生成一些session文件(可以自己定义session的保存类型),与用户机关联起来.web应用程序存贮与这些session相关的数据,并且让数据随着用户在页面之间传递.?

访问网站的来客会被分配一个唯一的标识符,即所谓的会话ID。它要么存放在客户端的cookie,要么经由URL 传递。会话支持允许用户注册任意数目的变量并保留给各个请求使用。当来客访问网站时,PHP 会自动(如果session.auto_start 被设为1)或在用户请求时(由session_start() 明确调用或session_register() 暗中调用)检查请求中是否发送了特定的会话ID。如果是,则之前保存的环境就被重建。2.1 sessionID的传送2.1.1 通过cookie传送sessin ID?

使用session_start()调用session,服务器端在生成session文件的同时,生成session ID哈希值和默认值为PHPSESSID的session name,并向客户端发送变量为(默认的是)PHPSESSID(session name),值为一个128位的哈希值.服务器端将通过该cookie与客户端进行交互.?
session变量的值经php内部系列化后保存在服务器机器上的文本文件中,和客户端的变量名默认情况下为PHPSESSID的coolie进行对应交互.?
即服务器自动发送了http头:header('Set-Cookie: session_name()=session_id(); path=/');?
即setcookie(session_name(),session_id());?
当从该页跳转到的新页面并调用session_start()后,PHP将检查与给定ID相关联的服务器端存贮的session数据,如果没找到,则新建一个数据集.?

2.1.2 通过URL传送session ID?
只有在用户禁止使用cookie的时候才用这种方法,因为浏览器cookie已经通用,为安全起见,可不用该方法.
xxx,也可以通过POST来传递session值.?

2.2 session基本用法实例?

复制代码代码如下:

// page1.php?
session_start();?
echo'Welcome to page #1';?
/* 创建session变量并给session变量赋值*/$_SESSION['favcolor'] = 'green';?
$_SESSION['animal'] = 'cat';?
$_SESSION['time'] = time();?

// 如果客户端使用cookie,可直接传递session到page2.php?
echo'
page 2';?

// 如果客户端禁用cookie?
echo'
page 2';?
/*?
默认php5.2.1下,SID只有在cookie被写入的同时才会有值,如果该session?
对应的cookie已经存在,那么SID将为(未定义)空*/?
?>?

// page2.php?
session_start();?
print$_SESSION['animal']; // 打印出单个session?
var_dump($_SESSION); // 打印出page1.php传过来的session值?
?>?



2.3 使用session函数控制页面缓存.?
很多情况下,我们要确定我们的网页是否在客户端缓存,或要设置缓存的有效时间,比如我们的网页上有些敏感内容并且要登录才能查看,如果缓存到本地了,可以直接打开本地的缓存就可以不登录而浏览到网页了.?

使用session_cache_limiter('private');可以控制页面客户端缓存,必须在session_start()之前调用.?
更多参数见http://blog.chinaunix.net/u/27731/showart.php?id=258087的客户端缓存控制.?
控制客户端缓存时间用session_cache_expire(int);单位(s).也要在session_start()前调用.?

这只是使用session的情况下控制缓存的方法,我们还可以在header()中控制控制页面的缓存.?

2.4 删除session?

要三步实现.?

session_destroy(); // 第一步: 删除服务器端session文件,这使用setcookie(session_name(),'',time()-3600); // 第二步: 删除实际的session:?
$_SESSION= array(); // 第三步: 删除$_SESSION全局变量数组?>?

2.5 session在PHP大型web应用中的使用对于访问量大的站点,用默认的session存贮方式并不适合,目前最优的方法是用数据库存取session.这时,函数bool session_set_save_handler( callbackopen, callbackclose, callbackread, callbackwrite, callbackdestroy, callbackgc )就是提供给我们解决这个问题的方案.?
该函数使用的6个函数如下:?

1. bool open() 用来打开会话存储机制,?

2. bool close() 关闭会话存储操作.?

3. mixde read() 从存储中装在session数据时使用这个函数4. bool write() 将给定session ID的所有数据写到存储中5. bool destroy() 破坏与指定的会话ID相关联的数据6. bool gc() 对存储系统中的数据进行垃圾收集例子见php手册session_set_save_handler() 函数.?
如果用类来处理,用session_set_save_handler(?
array('className','open'),?
array('className','close'),?
array('className','read'),?
array('className','write'),?
array('className','destroy'),?
array('className','gc'),?
)?
调用className类中的6个静态方法.className可以换对象就不用调用静态方法,但是用静态成员不用生成对象,性能更好.?

2.6 常用session函数:?

bool session_start(void); 初始化session?
bool session_destroy(void): 删除服务器端session关联文件。stringsession_id() 当前session的id?
stringsession_name() 当前存取的session名称,也就是客户端保存session ID的cookie名称.默认PHPSESSID。arraysession_get_cookie_params() 与这个session相关联的session的细节.?
stringsession_cache_limiter() 控制使用session的页面的客户端缓存ini session_cache_expire() 控制客户端缓存时间bool session_destroy() 删除服务器端保存session信息的文件void session_set_cookie_params( int lifetime [, stringpath [, stringdomain [, bool secure [, bool httponly]]]] )设置与这个session相关联的session的细节bool session_set_save_handler( callbackopen, callbackclose, callbackread, callbackwrite, callbackdestroy, callbackgc )定义处理session的函数,(不是使用默认的方式)?
bool session_regenerate_id([bool delete_old_session]) 分配新的session id?


2.7 session安全问题攻击者通过投入很大的精力尝试获得现有用户的有效会话ID,有了会话id,他们就有可能能够在系统中拥有与此用户相同的能力.?
因此,我们主要解决的思路是效验session ID的有效性.?


if(!isset($_SESSION['user_agent'])){?
$_SESSION['user_agent'] = $_SERVER['REMOTE_ADDR'].$_SERVER['HTTP_USER_AGENT'];?
}?

/* 如果用户session ID是伪造*/elseif($_SESSION['user_agent'] != $_SERVER['REMOTE_ADDR'] . $_SERVER['HTTP_USER_AGENT']) {?
session_regenerate_id();?
}?
?>?


2.8 Session通过cookie传递和通过SID传递的不同:?
在php5.2.1的session的默认配置的情况下,当生成session的同时,服务器端将在发送header set-cookie同时生成预定义超级全局变量SID(也就是说,写入cookie和抛出SID是等价的.),当$_COOKIE['PHPSESSID']存在以后,将不再写入cookie,也不再生成超级全局变量SID,此时,SID将是空的.?


2.9 session使用实例
/**?
* 效验session的合法性*?
*/functionsessionVerify() {?
if(!isset($_SESSION['user_agent'])){?
$_SESSION['user_agent'] = MD5($_SERVER['REMOTE_ADDR']?
.$_SERVER['HTTP_USER_AGENT']);?
}?
/* 如果用户session ID是伪造,则重新分配session ID */elseif($_SESSION['user_agent'] != MD5($_SERVER['REMOTE_ADDR']?
. $_SERVER['HTTP_USER_AGENT'])) {?
session_regenerate_id();?
}?
}?

/**?
* 销毁session?
* 三步完美实现,不可漏*?
*/functionsessionDestroy() {?
session_destroy();?
setcookie(session_name(),'',time()-3600);?
$_SESSION= array();?
}?
?>?

注明:?

session 出现头信息已经发出的原因与cookie一样.?
在php5中,所有php session 的注册表配置选项都是编程时可配置的,一般情况下,我们是不用修改其配置的.要了解php的session注册表配置选项,请参考手册的Session 会话处理函数处.?
session的保存数据的时候,是通过系列化$_SESSION数组来存贮,所以有系列化所拥有的问题,可能有特殊字符的值要用base64_encode函数编码,读取的时候再用base64_decode解码。

?

来源:http://www.jb51.net/article/22945.htm

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

Ubuntu および Debian 用の PHP 8.4 インストールおよびアップグレード ガイド Ubuntu および Debian 用の PHP 8.4 インストールおよびアップグレード ガイド Dec 24, 2024 pm 04:42 PM

PHP 8.4 では、いくつかの新機能、セキュリティの改善、パフォーマンスの改善が行われ、かなりの量の機能の非推奨と削除が行われています。 このガイドでは、Ubuntu、Debian、またはその派生版に PHP 8.4 をインストールする方法、または PHP 8.4 にアップグレードする方法について説明します。

今まで知らなかったことを後悔している 7 つの PHP 関数 今まで知らなかったことを後悔している 7 つの PHP 関数 Nov 13, 2024 am 09:42 AM

あなたが経験豊富な PHP 開発者であれば、すでにそこにいて、すでにそれを行っていると感じているかもしれません。あなたは、運用を達成するために、かなりの数のアプリケーションを開発し、数百万行のコードをデバッグし、大量のスクリプトを微調整してきました。

PHP 開発用に Visual Studio Code (VS Code) をセットアップする方法 PHP 開発用に Visual Studio Code (VS Code) をセットアップする方法 Dec 20, 2024 am 11:31 AM

Visual Studio Code (VS Code とも呼ばれる) は、すべての主要なオペレーティング システムで利用できる無料のソース コード エディター (統合開発環境 (IDE)) です。 多くのプログラミング言語の拡張機能の大規模なコレクションを備えた VS Code は、

JSON Web Tokens(JWT)とPHP APIでのユースケースを説明してください。 JSON Web Tokens(JWT)とPHP APIでのユースケースを説明してください。 Apr 05, 2025 am 12:04 AM

JWTは、JSONに基づくオープン標準であり、主にアイデンティティ認証と情報交換のために、当事者間で情報を安全に送信するために使用されます。 1。JWTは、ヘッダー、ペイロード、署名の3つの部分で構成されています。 2。JWTの実用的な原則には、JWTの生成、JWTの検証、ペイロードの解析という3つのステップが含まれます。 3. PHPでの認証にJWTを使用する場合、JWTを生成および検証でき、ユーザーの役割と許可情報を高度な使用に含めることができます。 4.一般的なエラーには、署名検証障害、トークンの有効期限、およびペイロードが大きくなります。デバッグスキルには、デバッグツールの使用とロギングが含まれます。 5.パフォーマンスの最適化とベストプラクティスには、適切な署名アルゴリズムの使用、有効期間を合理的に設定することが含まれます。

母音を文字列にカウントするPHPプログラム 母音を文字列にカウントするPHPプログラム Feb 07, 2025 pm 12:12 PM

文字列は、文字、数字、シンボルを含む一連の文字です。このチュートリアルでは、さまざまな方法を使用してPHPの特定の文字列内の母音の数を計算する方法を学びます。英語の母音は、a、e、i、o、u、そしてそれらは大文字または小文字である可能性があります。 母音とは何ですか? 母音は、特定の発音を表すアルファベットのある文字です。大文字と小文字など、英語には5つの母音があります。 a、e、i、o、u 例1 入力:string = "tutorialspoint" 出力:6 説明する 文字列「TutorialSpoint」の母音は、u、o、i、a、o、iです。合計で6元があります

PHPでHTML/XMLを解析および処理するにはどうすればよいですか? PHPでHTML/XMLを解析および処理するにはどうすればよいですか? Feb 07, 2025 am 11:57 AM

このチュートリアルでは、PHPを使用してXMLドキュメントを効率的に処理する方法を示しています。 XML(拡張可能なマークアップ言語)は、人間の読みやすさとマシン解析の両方に合わせて設計された多用途のテキストベースのマークアップ言語です。一般的にデータストレージに使用されます

PHPでの後期静的結合を説明します(静的::)。 PHPでの後期静的結合を説明します(静的::)。 Apr 03, 2025 am 12:04 AM

静的結合(静的::) PHPで後期静的結合(LSB)を実装し、クラスを定義するのではなく、静的コンテキストで呼び出しクラスを参照できるようにします。 1)解析プロセスは実行時に実行されます。2)継承関係のコールクラスを検索します。3)パフォーマンスオーバーヘッドをもたらす可能性があります。

PHPマジックメソッド(__construct、__destruct、__call、__get、__setなど)とは何ですか? PHPマジックメソッド(__construct、__destruct、__call、__get、__setなど)とは何ですか? Apr 03, 2025 am 12:03 AM

PHPの魔法の方法は何ですか? PHPの魔法の方法には次のものが含まれます。1。\ _ \ _コンストラクト、オブジェクトの初期化に使用されます。 2。\ _ \ _リソースのクリーンアップに使用される破壊。 3。\ _ \ _呼び出し、存在しないメソッド呼び出しを処理します。 4。\ _ \ _ get、dynamic属性アクセスを実装します。 5。\ _ \ _セット、動的属性設定を実装します。これらの方法は、特定の状況で自動的に呼び出され、コードの柔軟性と効率を向上させます。

See all articles