原文地址:
http://blog.51yip.com/php/938.html
一,为什么session,cookie经常会有人提到
做web开发的人基本上都会用session和cookie,但是仅仅只是会用,并不知道session和cookie的真正的工作原理,都只是凭着感觉来猜测。web开发者只要利用它们来完成工作就行了,所以每个人的理解基本都会有大同小异,我想这就是session,cookie经常会被讨论的原因。本文也是根据个人经验,以及个人所学,对session,cookie的一些看法,纯属个人见解,希望得到大家的更正和建议。
二,什么cookie
cookie分为二种
1,以文件方式存在硬盘空间上的长期性的cookie
2,停留在浏览器所占内存中的临时性的cookie
浏览网站时,你会经常发现网站登录的地方,会有提示,问你是不是要记住自己的登录状态,像这种情况,登录时填写的一些信息会被以文件的方式存放在客户端的硬盘上。
当用户登录后,session会在cookie端产生一个session_id,这个session_id是存于浏览器所占用的内存当中。当你关闭浏览器后,session_id也要消失了。
cookie采用的是在客户端保持状态的方案,它是客户端的会话状态的一种储存机制。它是服务器在本地机器上存储的小段文本或者是内存中的一段数据,并随每一个请求发送至同一个服务器。IETF RFC 2965 HTTP State Management Mechanism 是通用cookie规范。网络服务器用HTTP头信息向客户端发送cookies,在客户终端,浏览器解析这些cookies并将它们保存为一个本地文件,或者本地内存中数据,它会自动将同一服务器的任何请求缚上这些cookies,由于采用服务器端保持状态的方案在客户端也需要保存一个标识,所以session机制借助于cookie机制来达到保存标识的目的,这样就可以解决HTTP协议无状态的缺陷。
三,什么是session
session是一种服务器端的信息管理机制,它把这些文件信息以文件的形势存放在服务器的硬盘空间上,这种情况是默认的,可以用memcache把这种数据放到内存里面。请参考web集群时利用memcache来同步session
当客户端向服务器发出请求时,要求服务器端产生一个session时,服务器端会先检查一下,客户端的cookie里面有没有session_id,是否已经过期。如果有这样的session_id的话,服务器端会根据cookie里的session_id把服务器的session检索出来。如果没有这样的session_id的话,服务器端会重新建立一个。PHPSESSID是一串加了密的字符串,它的生成按照一定的规则来执行。同一客户端启动二次session_start的话,session_id是不一样的。
session产生的session_id放在cookie里面,如果用户把cookie禁止掉,是不是session也不能用了呢?禁止掉cookie后,session当然可以用,不过通过其他的方式来获得这个sessionid,比如,可以根在url的后面,或者以表单的形势提交到服务器端。从而使服务器端了解客户端的状态。
四,session和cookie谁更安全
就个人而言,我觉得session更安全一点,我以下几点看法。
1,如果session和cookie一样安全的话,二者就没有并要同时存在了,只要cookie就好了,让客户端来分提服务器的负担,并且对于用户来说又是透明的。何乐而不为呢。
2,session的sessionID是放在cookie里,要想功破session的话,第一要功破cookie。功破cookie后,你要得到 sessionID,sessionID是要有人登录,或者启动session_start才会有,你不知道什么时候会有人登录。第二,sessionID是加密的,第二次session_start的时候,前一次的sessionID就没有用了,session过期时sessionid也会失效,想在短时间内功破加了密的 sessionID很难。session是针对某一次通信而言,会话结束session也就随着消失了,而真正的cookie存在于客户端硬盘上的一个文本文件,谁安全很显然了。
3,如果session这么容易被功破,这么不安全的话,我想现有的绝大部分网站都不安全了。
分享到:
相关推荐
在实际开发中,对Session和Cookie的管理需要特别注意安全性问题。例如,需要在服务器端对Session进行定期更新和失效机制,防止Session劫持;同时对Cookie的传输使用加密、设置HttpOnly属性等手段防止跨站脚本攻击...
在互联网应用中,HTTP协议是一个无状态的协议,这意味着Web服务器...然而,开发者也需要注意Cookie的安全性,例如不要在Cookie中存储敏感信息,并且应当对所有传输的Cookie数据进行加密处理,以免造成用户隐私泄露。
这种变化可能是技术发展的一个必然性,因为.properties文件的可阅读性确实有所不足。 核心JAR包 Log4j只需要引入一个JAR包,即log4j.jar,而Log4j2则需要引入两个核心JAR包,即log4j-core.jar和log4j-api.jar。...
老生常谈外链 站长要做到对症下药.pps
6. String()和toString()的区别 在JavaScript中,String()函数可以将传入的值转换成字符串类型,类似于调用一个值的toString()方法。但不同之处在于,String()函数可以转换null和undefined为字符串,而直接调用null...
1. **安全接地**:确保人身安全,防止触电事故发生。 2. **工作接地**:包括数字地、模拟地、功率器件地等,主要用于电路的正常工作。 3. **防浪涌接地**:抵御雷击浪涌、上电浪涌等瞬态电压的影响。 4. **防静电...
封装可以减少编程错误,增强代码的可维护性。 继承是面向对象的另一个重要特性,它允许创建类的子类(派生类),继承父类(基类)的属性和方法。这样可以避免重复代码的编写,有利于提高开发效率。在JavaScript中,...
ProgressBar和ProgressDialog是Android开发中常见的两种进度条控件,用于展示任务执行的进度或等待状态。下面我们将深入探讨这两种控件的用法。 首先,ProgressBar是一个可以显示具体进度的组件,它可以是圆形或...
这些设计模式旨在提高代码的可重用性、可维护性和可扩展性。 设计模式通常包含以下几个关键要素: 模式名称:通过一两个词为模式命名,便于交流。 问题:描述在何时使用模式,它包含设计中存在的问题以及问题存在的...
老生常谈foreach(增强for循环)和for的区别 在 Java 编程语言中,foreach 和 for 是两种常用的循环语句,都是用于遍历数组或集合的元素。然而,foreach 和 for 之间存在一些关键的区别,了解这些区别对于编写高效的...
在Android开发中,事件传递和处理机制是相当关键的一个部分,尤其对于用户界面的交互有着决定性的影响。本文主要探讨了Android系统如何处理触摸事件,通过拟人化的比喻来解释事件传递的流程,并通过实际代码示例进行...
web应用程序的安全性算是一个老生常谈的问题了,当然asp.net mvc也不例外,虽然他在设计之初就对此有了一些防范,但是还是要差很多,有很多地方需要我们程序猿们注意的地方,我们今天就来简单的探讨下
强调了使用多重认证和生物识别技术作为替代方案的必要性,以增强安全性,减少因口令泄露导致的安全威胁。 3. 安全与管理的沟通:文档强调了安全团队与管理层沟通的重要性,以及提供对企业决策有意义的安全分析报告...
而在二进制模式下,系统不对数据进行这种转换,而是保持数据的原始二进制形式,这对于保持数据完整性至关重要。 总的来说,文本文件适合存储人类可读的文本信息,如文档、源代码等,而二进制文件更适合存储多媒体...
饿汉式牺牲了内存空间,换取了初始化时的效率和线程安全性。 总结来说,选择懒汉式还是饿汉式取决于你的需求。如果你关心内存使用,且可以接受首次访问时的延迟初始化,那么懒汉式是不错的选择。如果性能和线程安全...
5. **数据安全性与扩展性**:通过复制集(replica sets),MongoDB实现了数据的冗余备份,确保了数据的安全性。同时,其内置的分片(sharding)技术使得数据扩展变得简单,能自动管理数据接口,动态调整存储容量,...
- **多云环境**:企业采用多个云服务提供商的服务,这使得数据和服务跨越不同的云平台,增加了安全管理的复杂性。 - **混合应用**:企业和个人应用结合在一起,增加了数据泄露和其他安全事件的风险。 - **千禧一代的...
JavaScript是一种动态类型的编程语言,它的数据类型是理解其工作原理的关键。在JavaScript中,数据类型主要分为两大类:基本数据类型(Primitive Data Types)和引用数据类型(Reference Data Types)。...