秦易的BLOG 忙碌中追求闲逸,是为还是不为

26四/100

让我们去影响互联网的发展趋势

互联网必须以人为本,人是各种网络应用的终端或中继。

互联网的本质是连接,连接将互联网上的各种节点连通。

一直在我脑中出现的是一个结合体,最近太多的想法纠结在一起,反而使事情变得更加明朗。我且将这种信息技术的概念产品称为“超级连接”,英文名称为"mostlink"。最开始我更想叫他“三连”:人连、网连、物连。

人连,很好理解,人与人的连接。目前集中体现在SNS系统和IM系统,以人人网和QQ为代表。但是,在我的想法里另一种模式还没被深度挖掘,而且有更简单更直接的盈利模式。目前的renren和qq固然取得了可观的甚至恐怖的用户群,但是另一块可观的更有利可图的却存在一片空白,并且做出来可能会使得传统SNS和IM有些害怕,这里不展开。

网连,是通行证的概念,一个账号通行于各种网站,免去重复注册登录的麻烦。这个其实老早就有OpenID,后来Facebook出了Connect,人人网也出了。但是目前的种种机制完全可以做得更好,联动性互利性都有待完善。毕竟自己在做资源,开放平台的开放程度大大受限,却也受不了完全开放带来的恶果,一直很尴尬。

物连,最新的概念吧,也是未来的趋势。一个简单的例子,当你坐公司办公室时,可以通过网络控制家里的电器,可以把外面晒着的被子收进来。在谁去尝这里的第一块蛋糕呢?谁会发现其中隐含的商机和那种改变生活的价值呢?看清楚了这些可行的模式,现在开始行动不算早了。

当这三种连接(或许以后还会有其他的?)完美融合之后,带来的会是一种让人何其惊喜的局面!而目前的情况是,单单某一方面的连接都完全可以大有作为,我不知道是否能抓住其中的一点(或是全盘的整合?)……

1九/090

防止URL注入?

由于网站某插件的问题,可以URL注入取得数据库的数据,就想能不能屏蔽包含某些特定字符的URL?
首先考虑到.htaccess,如果可以的话可以整站屏蔽某些恶意URL。但是宣告失败,因为应用的URL是?后带参数的。
那么只能是PHP本身来判断,如果是单文件入口,按下面的方法来做:
在文件最开始,取得所访问页面的完整URL并进行判断,中止访问。

13一/090

DNS劫持

最近发现在寝室经常打不开iecnu,ping了一下

D:\Program Files\Maxthon2>ping www.iecnu.com
Pinging www.iecnu.com.login [218.83.175.154] with 32 bytes of data:

简直搞笑,域名后面被加了.login然后直接指向电信114页面

电信DNS劫持已经不是什么新鲜事,很多大网站也深受其害
这种极其恶心的事情都做得出来,难怪世界13台根域服务器不放心放在中国,为私利扰乱互联网秩序的事情在中国屡见不鲜
对这种强奸中国网民的做法表示愤慨,不过也就仅此而已,本身对中国互联网不抱什么幻想,从政治层面到运营商都是不可理喻的

7十一/080

开启使用.htaccess的方法

打开APMServ/Apache/conf/httpd.conf
找到 LoadModule rewrite_module modules/mod_rewrite.so 去掉前面的#
找到 #APMServ默认虚拟主机把AllowOverride None改为 AllowOverride Options FileInfo
其他虚拟主机到相应的vhost.conf修改
重启apache,完毕

1五/080

密码保护:低调一周年

这是一篇受密码保护的文章。您需要提供访问密码:


23一/080

FLASH应用于防采集初探

前言
  现在网站采集的普及程度大家已见怪不怪,大凡CMS都要有采集功能。对于很多站长来说,网站建设初期,采集是很必要的,然而当你的网站做大之后,防采集问题就不得不考虑了。之前鄙人在discuz讨论过相关话题,并没有人引起重视,然而准备做专业资讯站的我,没有放弃对防采集的考虑。我们的目标是:能采,能防。亦即能攻能守。有人说你卑鄙,采别人的,不让别人采你的。事实是:现实是残酷的。

当前流行的防采集方法
1、分页文件名规则防采集对策
  注重于用户体验的话不建议用分页,过长的文章才考虑下。加密分页文件名,事实上稍微动动脑筋就知道:你的分页链接总归是放在固定位置的,分析一下就可以进行采集了。
2、页面代码规则防采集对策
  主要是多模板,防采集字符的方法。多套随机模板确实可以比较有效防止采集,但是对于中级的采集者,还是有办法突破的,你的模板数量有限,人家看中你的全站资源的话,就舍得稍微下点功夫。防采集字符功能显得更弱一些,因为那些字符为了不在页面显示,就要通过CSS,JS等方法处理,也就留下了痕迹了。

FLASH防采集的可能性
1、首先FLASH可以清晰显示汉字,可以实现在网页上文字和图片显示相同效果,并且可以使用简单CSS。事实上这样就够了,因为我们不是整个网页采用FLASH,而是在文章内容显示区域显示FLASH,FLASH载入文章内容即可,因此对于样式的要求不高。
2、FLASH与PHP,ASP,JSP之间的传递性。源于FLASH可以载入外部文本文件(包括静态网页文件,CSS文件),任何网络编程语言与FLASH互通都不成问题,因为他们返回的是HTML格式的文本文件。并且可以实现参数的传递,所以在读取数据库等方面完全可行

搜索引擎收录问题
  如果文字全部在FLASH显示,搜索引擎就不能取得文章内容了。显然我们在文章页必须加入一个不显示的DIV用于放文章的内容。这里放文章内容不是等着别人采集吗?不是的,既然这个区域是给搜索引擎的,而不是给用户的,那么在添加文章时就应该进行一定处理,使其没有阅读价值,但是涵盖文章内容。举个例子:无规律地从原文截取某些内容插入到文章中,面向搜索引擎来说,没有多大影响,而如果别人要采集使用的话则是一篇乱七八糟的文字。

服务器负载问题
  那是不是说不能生成静态?或者说静态文章中的FLASH还是要动态读取数据库内容?前面说过,FLASH可以载入外部文件,我们采用内容存文本之后,不使用静态页面,而使用伪静态即可,因为文章页面不需要读取数据库(在只调用文章的情况下)。调用一个处理过的txt文件(为搜索引擎)并在文章区域插入一个iframe的flash,便于滚动显示,而FLASH调用另一个真正的文章内容的文本文件。

安全性
  处理过的txt文件,我们并不担心,因为其无多大阅读价值。那个FLASH所调用的文本文件才是关注的重点,也是我在整个过程中把握不大的环节。我现在的想法是加密文件名,flash通过文章ID号得到一个密码,解密得到文件名。但是FLASH也可以被反编译,得到解密代码的话,整个防范几近无效了,甚至给了人家方便,当然一般的采集工具是无法采集的。这一点也是我写这篇文章的动力之一,希望更多人一起想想更好的办法。(说明:flash通过ID号取文件名密码的过程,通过一个PHP文件读取数据库,我们可以单独建一个数据表存放这个数据,对服务器比较好。对这个文件,通过php的.htaccess等方法禁止外部网站访问。有些文件夹是不能通过地址访问的,比如网站根目录的上级文件夹,这种方法可以调用文件,却不能通过网址访问。只要他人无法访问而FLASH文件可以正常调用即可较好达到加密的目的。)

基本方法
  比如某文章页(这里的地址仅用于举例,并不能访问)/article/54239.html 在文章区域调用flash: content.swf?id=54239 那么FLASH内某帧通过调用content.php?id=54239从数据库得到一组密码cHbbGuiolHflash解密得地址/html/080211/54239_uiYhii900.db(文本文件),显示网页。
  事实上,直接调用文本文件,而文本文件夹下所有文件禁止外部访问就可以达到目的,即可以省去读取数据库等加密解密过程。加密解密过程只是提供比较宽广实用的思路,大家完全可以根据自己的想法进行处理。

总结
  由上,FLASH用于防采集完全可以胜任。对于技术开发,也没有什么很高的壁垒,都是一些基本应用。
  这是很长时间考虑得到的结果,首发到站长网(),初衷是为微电子中国(http://www.weidianzi.com)新站的防采集做准备,因为上面将会是很多专业性行业性的文章。
  期待有朋友更快开发出来,也希望大家可以进一步与我进行相关讨论,我的地址是:http://www.qinyi.net
  虽然涉网多年,并没有发过什么文章。一是本人的懒惰,二是某些网友会无端谩骂文章作者。
  中国自古主张和而不同,写文章并不是要所有人都认同,而是表达自己的观点,即便是“垃圾”,也希望能看在作者打了那么多字的份上给一份尊重:不赞同的提出自己的观点,想骂人的干脆不要评论(请不要说没有言论自由,我只是建议)。

首发于站长网(www.admin5.com)
地址为: http://www.admin5.com/article/20080113/68680.shtml

7十二/070

使用.htaccess实现图片防盗链总结

Apache中的.htaccess文件
.htaccess文件是Apache中相当重要的配置文件,其格式为纯文本,它提供了针对目录改变配置的方法,通过在一个特定的文档目录中放置一个包含一个或多个指令的文件,以作用于此目录及其所有子目录。

通过.htaccess文件,可以实现简单地很多在IIS中很繁琐甚至无法实现的功能,如密码保护、禁止显示目录列表、阻止/允许特定的IP地址、实现网址的301 重定向等等。

正如上面所说,.htaccess文件将影响其所在的目录及其子目录,因此,如果我们要保护的内容(此处以防止图片盗链为例,即图片)位于网站内多个目录下,可以考虑将其放在根目录下;而如果图片有单独的子目录如“/images/”,则只需将其放置在该目录下(当然也可以放到根目录中)。

需要注意的是,如果通过FTP方式将创建好的.htaccess上传到服务器上,传输模式应为ASCII而非Binary。上传到服务器后,应将其属性通过CHMOD修改为644 或“RW-R–R–”,这样,可以保证服务器能够使用同时无法通过浏览器修改,当然,.htaccess的可读属性也存在一定的风险:攻击者可通过它找出您要保护的对象或认证文件位置——解决办法是将认证文件.htpasswd放到网站根目录之外,这样,便无法通过网络找到它了。

使用.htaccess禁止盗链
通过.htaccess来防止网站的图片、压缩文件、或视频等非Html文件被盗链的方法相当简单,通过在该文件中加入几句命令即可保护我们宝贵的带宽。例如本站的设置如下:

RewriteEngine on
RewriteCond %{HTTP_REFERER} !^$ [NC]
RewriteCond %{HTTP_REFERER} !qinyi.net [NC]
RewriteCond %{HTTP_REFERER} !ikuaizi.com [NC]
RewriteCond %{HTTP_REFERER} !zhuaxia.com [NC]
RewriteCond %{HTTP_REFERER} !xianguo.com [NC]
RewriteCond %{HTTP_REFERER} !google.com [NC]
RewriteCond %{HTTP_REFERER} !bloglines.com [NC]
RewriteCond %{HTTP_REFERER} !feedburner.com [NC]
RewriteCond %{HTTP_REFERER} !feedsky.com [NC]
RewriteRule .*\.(gif|jpg)$ http://qinyi.net/no.png [R,NC,L]

简单的解释一下上述语句:

1、RewriteCond %{HTTP_REFERER} !^$ [NC]

允许空“HTTP_REFERER”的访问,即允许用户在浏览器地址栏中直接输入图片地址时图片文件的显示。一般而言,这是可选的,不过,建议这么设置,如果强迫必须具有“HTTP_REFERER”才能访问,可能会带来某些问题,比如说在用户通过代理服务器访问时。

2、RewriteCond %{HTTP_REFERER} !qinyi.net [NC]

设置允许访问的HTTP来源,包括我们的站点自身、Google、Baidu、Bloglines、Feedburner等。

3、RewriteRule .*\.(gif|jpg|png)$ http://webeta.cn/no.png [R,NC,L]

定义被盗链时替代的图片,让所有盗链 jpg、gif、png 等文件的网页,显示根目录下的 no.png 文件。注意:替换显示的图片不要放在设置防盗链的目录中,并且该图片文件体积越小越好。当然你也可以不设置替换图片,而是使用下面的语句即可:

RewriteRule .*\.(gif|jpg|png)$ - [F]

4、说明一下其中的R、NC 和 L

R 就是转向的意思
NC 指的是不区分大小写
L 的作用是指明本次转向到此结束,后续的转向不受先前判断语句的影响

5、防止盗链的文件类型

上例中是 gif、jpg、png,而根据需要,可更改或添加其他文件类型,如rar、mov等,不同文件扩展名间使用“|”分割。

这样的话,就可以基本做到简单的防止被盗链情况的发生,而且可以尽最大可能的减少服务器流量的无畏消耗,当然了,如果你不在意这点流量的话,那么可以不用考虑上述设置啦!

------------------------------------------------------------------------

RewriteEngine on
RewriteCond %{HTTP_REFERER} !^http://(.)+\.qinyi\.net [NC]
RewriteRule .*\.(jpg|gif|png|bmp)$ http://qinyi.net/no.png [R,NC,L]

注意上面的图片如果是本空间的话,后面改为[L,NC]

3十/070

用cPanel向虚拟主机导入大型MySQL数据库

再也不用为上传数据库苦恼 - 用cPanel向虚拟主机导入大型数据库

大家都知道phpMyAdmin导入数据库有尺寸的限制,而且时间稍长就会time out导入失败。
网上也有各种软件用来导入,通常采用切割sql文件为多个小包的方法实现,繁琐而成功率也不是很高的。
如果你的数据库较大,你就会常常烦恼。

我一直用SSH直接登录到虚拟主机上直接运行如下命令来导入的:

mysql -u 用户名 -p口令 [-h 数据库主机] 数据库 < 数据库备份.sql

不过很多空间提供商都不给开放SSH或telnet权限。

突然想到可以用crontab来运行命令呀。测试一下成功了。

通过FTP上传你的备份SQL文件,放在根目录下就可以了。
进入你的cPanel,找到Cron Jobs 图标,点击进去,然后选Advanced (Unix Style) (呵呵我比较习惯unix哈)。
因为只需要运行一次,所以Minute, Hour, Day, Month 都填入准备运行的具体时间,留两分钟余量就行(如果虚拟主机不在本地,可以在FTP上查看一下主机时间), Weekday填*号算了。
Command 填待运行的命令,就是导入命令:

mysql -u 用户名 -p口令 [-h 数据库主机] 数据库 < 数据库备份.sql

在phpMyAdmin里监视导入情况。
速度很快,1G的数据库也就几分钟吧。

=======================================================

示例mysql命令:
导出:mysqldump -h localhost -u USER -pPASS --default-character-set=gbk   DATABASE >/home/PANNELUSER/FILENAME.sql
导入:mysql -u USER -pPASS [-h localhost] --default-character-set=gbk DATABASE < /home/PANNELUSER/FILENAME.sql

14九/070

PHP cookie和session的分析

1. PHP的COOKIE

cookie 是一种在远程浏览器端储存数据并以此来跟踪和识别用户的机制。
PHP在http协议的头信息里发送cookie, 因此 setcookie() 函数必须在其它信息被输出到浏览器前调用,这和对 header() 函数的限制类似。

1.1 设置cookie:
   可以用 setcookie() 或 setrawcookie() 函数来设置 cookie。也可以通过向客户端直接发送http头来设置.
1.1.1 使用setcookie()函数设置cookie:
bool setcookie ( string name [, string value [, int expire [, string path [, string domain [, 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
<!--[if !supportLineBreakNewLine]-->

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=/');的结果.
<!--[endif]-->

--------------------------------------------------------------------------------

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 ( callback open, callback close, callback read, callback write, callback destroy, callback gc )就是提供给我们解决这个问题的方案.
该函数使用的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关联文件。
string session_id() 当前session的id
string session_name() 当前存取的session名称,也就是客户端保存session ID的cookie名称.默认PHPSESSID。
array  session_get_cookie_params() 与这个session相关联的session的细节.
string session_cache_limiter() 控制使用session的页面的客户端缓存
ini    session_cache_expire() 控制客户端缓存时间
bool   session_destroy()     删除服务器端保存session信息的文件
void   session_set_cookie_params ( int lifetime [, string path [, string domain [, bool secure [, bool httponly]]]] )设置与这个session相关联的session的细节
bool session_set_save_handler ( callback open, callback close, callback read, callback write, callback destroy, callback gc )定义处理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的合法性
*
*/
function sessionVerify() {
   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
* 三步完美实现,不可漏
*
*/
function sessionDestroy() {
   session_destroy();
   setcookie(session_name(),'',time()-3600);
   $_SESSION = array();
}
?>

注明:

   session 出现头信息已经发出的原因与cookie一样.
   在php5中,所有php session 的注册表配置选项都是编程时可配置的,一般情况下,我们是不用修改其配置的.要了解php的session注册表配置选项,请参考手册的Session 会话处理函数处.

11九/070

一个PHP缓存类

cache.inc.php:

<?php

class Cache {
   /**
    * $dir : 缓存文件存放目录
    * $lifetime : 缓存文件有效期,单位为秒
    * $cacheid : 缓存文件路径,包含文件名
    * $ext : 缓存文件扩展名(可以不用),这里使用是为了查看文件方便
   */
   private $dir;
   private $lifetime;
   private $cacheid;
   private $ext;
   /**
    * 析构函数,检查缓存目录是否有效,默认赋值
   */
   function __construct($dir='',$lifetime=1800) {
       if ($this->dir_isvalid($dir)) {
           $this->dir = $dir;
           $this->lifetime = $lifetime;
           $this->ext = '.Php';
           $this->cacheid = $this->getcacheid();
       }
   }
   /**
    * 检查缓存是否有效
   */
   private function isvalid() {
       if (!file_exists($this->cacheid)) return false;
       if (!(@$mtime = filemtime($this->cacheid))) return false;
       if (mktime() - $mtime > $this->lifetime) return false;
       return true;
   }
   /**
    * 写入缓存
    * $mode == 0 , 以浏览器缓存的方式取得页面内容
    * $mode == 1 , 以直接赋值(通过$content参数接收)的方式取得页面内容
    * $mode == 2 , 以本地读取(fopen ile_get_contents)的方式取得页面内容(似乎这种方式没什么必要)
   */
   public function write($mode=0,$content='') {
       switch ($mode) {
           case 0:
               $content = ob_get_contents();
               break;
           default:
               break;
       }
       ob_end_flush();
       try {
           file_put_contents($this->cacheid,$content);
       }
       catch (Exception $e) {
           $this->error('写入缓存失败!请检查目录权限!');
       }
   }
   /**
    * 加载缓存
    * exit() 载入缓存后终止原页面程序的执行,缓存无效则运行原页面程序生成缓存
    * ob_start() 开启浏览器缓存用于在页面结尾处取得页面内容
   */
   public function load() {
       if ($this->isvalid()) {
           echo "<span style='display:none;'>This is Cache.</span> ";
           //以下两种方式,哪种方式好?????
           require_once($this->cacheid);
           //echo file_get_contents($this->cacheid);
           exit();
       }
       else {
           ob_start();
       }
   }
   /**
    * 清除缓存
   */
   public function clean() {
       try {
           unlink($this->cacheid);
       }
       catch (Exception $e) {
           $this->error('清除缓存文件失败!请检查目录权限!');
       }
   }
   /**
    * 取得缓存文件路径
   */
   private function getcacheid() {
       return $this->dir.md5($this->geturl()).$this->ext;
   }
   /**
    * 检查目录是否存在或是否可创建
    */
   private function dir_isvalid($dir) {
       if (is_dir($dir)) return true;
       try {
           mkdir($dir,0777);
       }
       catch (Exception $e) {
             $this->error('所设定缓存目录不存在并且创建失败!请检查目录权限!');
             return false;            
       }
       return true;
   }
   /**
    * 取得当前页面完整url
   */
   private function geturl() {
       $url = '';
       if (isset($_SERVER['REQUEST_URI'])) {
           $url = $_SERVER['REQUEST_URI'];
       }
       else {
           $url = $_SERVER['Php_SELF'];
           $url .= empty($_SERVER['QUERY_STRING'])?'':'?'.$_SERVER['QUERY_STRING'];
       }
       return $url;
   }
   /**
    * 输出错误信息
   */
   private function error($str) {
       echo '<div style="color:red;">'.$str.'</div>';
   }
}
?>

demo.php:

<?php
/*
* 可自由转载使用,请保留版权信息,谢谢使用!
* Class Name : Cache (For Php5)
* Version : 1.0
* Description : 动态缓存类,用于控制页面自动生成缓存、调用缓存、更新缓存、删除缓存.
* Author : jiangjun8528@163.com,Junin
* Author Page : http://blog.csdn.Net/sdts/
* Last Modify : 2007-8-22
* Remark :
  1.此版本为Php5版本,本人暂没有写Php4的版本,如需要请自行参考修改(比较容易啦,不要那么懒嘛,呵呵!).
  2.此版本为utf-8编码,如果网站采用其它编码请自行转换,Windows系统用记事本打开另存为,选择相应编码即可(一般ANSI),Linux下请使用相应编辑软件或iconv命令行.
  3.拷贝粘贴的就不用管上面第2条了.
* 关于缓存的一点感想:
* 动态缓存和静态缓存的根本差别在于其是自动的,用户访问页面过程就是生成缓存、浏览缓存、更新缓存的过程,无需人工操作干预.
* 静态缓存指的就是生成静态页面,相关操作一般是在网站后台完成,需人工操作(也就是手动生成).
*/

/*
* 使用方法举例
------------------------------------Demo1-------------------------------------------

   require_once('cache.inc.php');
   $cachedir = './Cache/'; //设定缓存目录
   $cache = new Cache($cachedir,10); //省略参数即采用缺省设置, $cache = new Cache($cachedir);
   if ($_GET['cacheact'] != 'rewrite') //此处为一技巧,通过xx.Php?cacheact=rewrite更新缓存,以此类推,还可以设定一些其它操作
       $cache->load(); //装载缓存,缓存有效则不执行以下页面代码
   //页面代码开始
   echo date('H:i:s jS F');
   //页面代码结束
   $cache->write(); //首次运行或缓存过期,生成缓存

------------------------------------Demo2-------------------------------------------

   require_once('cache.inc.php');
   $cachedir = './Cache/'; //设定缓存目录
   $cache = new Cache($cachedir,10); //省略参数即采用缺省设置, $cache = new Cache($cachedir);
   if ($_GET['cacheact'] != 'rewrite') //此处为一技巧,通过xx.Php?cacheact=rewrite更新缓存,以此类推,还可以设定一些其它操作
       $cache->load(); //装载缓存,缓存有效则不执行以下页面代码
   //页面代码开始
   $content = date('H:i:s jS F');
   echo $content;
   //页面代码结束
   $cache->write(1,$content); //首次运行或缓存过期,生成缓存

------------------------------------Demo3-------------------------------------------

   require_once('cache.inc.php');
   define('CACHEENABLE',true);
   
   if (CACHEENABLE) {
       $cachedir = './Cache/'; //设定缓存目录
       $cache = new Cache($cachedir,10); //省略参数即采用缺省设置, $cache = new Cache($cachedir);
       if ($_GET['cacheact'] != 'rewrite') //此处为一技巧,通过xx.Php?cacheact=rewrite更新缓存,以此类推,还可以设定一些其它操作
           $cache->load(); //装载缓存,缓存有效则不执行以下页面代码    
   }
   //页面代码开始
   $content = date('H:i:s jS F');
   echo $content;
   //页面代码结束
   if (CACHEENABLE)
       $cache->write(1,$content); //首次运行或缓存过期,生成缓存
*/
?>

   下一页