移动存储安全


当你的U盘,移动硬盘遗失了,被盗了,或者是遗忘在公共场所,里面的资料就会完全被别人窥探,如果涉及一些隐私,机密,那后果是很严重的。本课题就是在这样一个情况下产生的。这里剖析的只是一个最初的演示原型,详细设计,以及一些细节可以参考源代码。源代码在WinXP,VC6.0编译通过。

[代码性质] VC完整应用程序代码
[文件大小] 16K
[下载]     下载文件Jeffrey_mss.rar (15.78 KB , 下载:17次)

摘要:实现对移动存储设备的加密,保护信息隐蔽,防止隐私泄露。


关键字:移动存储设备加密安全


  当你的U盘,移动硬盘遗失了,被盗了,或者是遗忘在公共场所,里面的资料就会完全被别人窥探,如果涉及一些隐私,机密,那后果是很严重的。本课题就是在这样一个情况下产生的。这里剖析的只是一个最初的演示原型,详细设计,以及一些细节可以参考源代码。源代码在WinXPVC6.0编译通过。


1
、访问注册表读取计算机上的移动存储设备

在注册表

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Disk\Enum

下面可以看到计算机当前的状态,这里可以看到所有的存储设备的情况,包括计算机的硬盘,通过情况下,名称为0的是计算机硬盘,所以在列出的选择设备时,会把名称为0的屏蔽,不然太危险,一旦造成系统的破坏,后果会很麻烦。对注册表的读写:

HKEY hkey;
char sz[256];
DWORD dwtype,sl = 256; 
for(int i=1;i<8;i++)
{
        if(RegOpenKeyEx(HKEY_LOCAL_MACHINE,"SYSTEM\\CurrentControlSet\\Services\\Disk\\Enum",\
               NULL, KEY_ALL_ACCESS, &hkey)==ERROR_SUCCESS)
        {
               CString id;
               id.Format("%d",i);
               if(RegQueryValueEx(hkey,id,NULL,&dwtype,(LPBYTE)sz,&sl)==ERROR_SUCCESS)
               {
                       CString str=(CString)sz;
                       m_select.AddString(sz);
               }
        }
}
RegCloseKey(hkey); 


2
、对磁盘的扇区的操作

  Windows 操作系统在很大程度上采取了访问安全保护机制(例如,在Windows操作系统下不能直接访问物理内存、不能使用各种DOSBIOS中断等等),其实Windows在采取“实保护”措施的同时也提供了另外的一种有别于在DOS下访问硬件设备的方法,即把所有的硬件设备全部看做“文件”,并允许按照对文件的读写方式来对其进行数据存取访问。对于磁盘扇区的读写,可以通过C++CreateFile()函数来实现。由MSDN可查询到该函数原型:

HANDLE CreateFile(
LPCTSTR lpFileName, 
DWORD dwDesiredAccess, 
DWORD dwShareMode, 
LPSECURITY_ATTRIBUTES lpSecurityAttributes, 
DWORD dwCreationDisposition, 
DWORD dwFlagsAndAttributes, 
HANDLE hTemplateFile );


由于访问的是事实上已经存在的磁盘扇区,因此只能以OPEN_EXISTING标志设置dwCreationDisposition参数指出将要打开已经存在的文件(设备)。至于其他参数的使用与操作普通文件时的用法相同。

使用的时候,如果需要定位到某一个具体的扇区,可以使用SetFilePointer()函数:

DWORD SetFilePointer(HANDLE hFile,LONG lDistanceToMove,PLONG lpDistanceToMoveHigh,DWORD dwMoveMethod);


  在定位到要访问的扇区开始位置后就可以通过ReadFile()或WriteFile()函数实施相应的读写访问了,具体操作与文件读写并没有什么太大的差别。最后,在完成访问操作后以CloseHandle()关闭文件句柄释放资源,从而完成一次完整的磁盘扇区数据访问操作。

int ReadDisk(CString driver,unsigned char *Buf,long addr)
{
        HANDLE hDevice;
        BOOL bResult;
        DWORD bytesread; 
        
        hDevice=CreateFile(driver,GENERIC_READ|GENERIC_WRITE,
               FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,OPEN_EXISTING,0,NULL); 
        if(hDevice==INVALID_HANDLE_VALUE)
        { 
               AfxMessageBox("Error!");
               return 0;
        }
        if(addr!=0)
        {
               SetFilePointer(hDevice,512*addr,NULL,NULL);
        }
        
        bResult=ReadFile(hDevice,Buf,512,&bytesread,NULL);
        if((bResult==FALSE)||(bytesread<512)) 
        { 
               AfxMessageBox("Error!");
               return 0;
        }
        CloseHandle(hDevice);
        return 1;
}


3
、用RC4加密算法对磁盘加密。

/* RC4加密,KEY是密钥,此处Key[]="MobileStorageSecurity",后期可以用户输入的密码作为密钥 */
RC4_KEY rc4_key;
build_rc4_key(Key,strlen((char*)Key),&rc4_key);
rc4_handler(MBRBuf,strlen((char*)MBRBuf),&rc4_key);


4
U盘插入计算机时的自动感知

LRESULT CRawDiskDlg::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
        if ( WM_DEVICECHANGE == message && FALSE == bCopy )
        {
               //刷新设备列表
        }
        return CDialog::WindowProc(message, wParam, lParam);
}


后期改进

  1. 这样就必须要求在电脑上有这个程序,所以在后期采用同样的原理,将这个程序放在U盘里,在加密的时候实现对自身的屏蔽,这样大大提高程序的易用性。
  2. 可以让用户输入密码,将密码作为密钥去加密和解密。

  3.这个只是对一个磁盘最初的512字节加密,后期可以通过对扇区的定位和计算,对目录表及数据加密。

不要密码也能进入win2003

1.当Win2003启动到出现登录提示界面时,可以按住键盘上的Ctrl+Shift复合键,将输入法调出来;

2.用鼠标右键单击输入法工具条,从随后出现的快捷菜单中,选择“帮助”菜单项,再从下级菜单中执行“操作指南”命令;

3.在随后出现的“输入法操作指南”界面中,可以执行“打印”命令,这样就能弹出一个标题为“打印主题”的窗口;在这里,我们可以选中其中的“打印选定主题”选项,再用鼠标单击一下“确定”按钮;这样系统又会打开一个打印界面,选中该界面中的“常规”标签,在对应的标签页面中,用鼠标双击“添加打印机”图标;

4.在接着打开的打印机添加向导设置界面中,继续单击“下一步”按钮,在随后出现的画面中,将“网络打印机”选项选中,并继续执行“下一步”命令;

5.将随后界面中的“输入打印机名,或者单击下一步,浏览打印机”选项选中,然后在对应的文本框中输入网络打印机的具体名称,例如“HP”,继续用鼠标单击“下一步”按钮;

6.接着,屏幕上会出现一个“连接到打印机”的提示界面,该界面提示我们系统无法连接到指定打印机,此时我们可以用鼠标单击该提示界面中的“帮助”按钮;

7.在其后出现的Win2003系统窗口中,在执行“Web帮助”命令,并在打开的帮助界面的右边子窗口中,单击其中的一个超级链接,可以任意选择;

8.单击以后,系统就会自动弹出一个标题为“无法连接到服务器”的窗口,将鼠标移动到该窗口的地址栏中,删除掉以前的信息,并直接输入“C:”符号,单击一下回车键;

9.随后浏览界面就自动“变脸”为资源管理器界面了,单击该界面右边的下拉按钮,从下拉列表中单击“控制面板”选项,这样就能将系统的控制面板窗口打开了;

10.找到该窗口的“用户和密码”图标,并用鼠标双击之,在随后的窗口中选中“用户”标签,并在对应的标签页面中,将其中的“Administrator”选项选中,再用鼠标单击一下“设置密码”按钮;

11.在弹出的密码设置框中,重新输入一个容易记忆的密码,最后单击“确定”按钮,就可以使密码生效了。最后使用该密码重新登录试试.

Q:急:我的超级用户密码忘记了,求解决办法

A:启动/关机脚本:_(1)如果故障计算机使用FAT/FAT32文件系统,那可直接使用Win98引导盘引导.如果使用NTFS文件系统,可将故障计算机上的硬盘取下,以从盘模式挂接到其它的Win2000计算机上.下面的操作以后一种情况为准,假设现在故障计算机的system分区(通常是C:)在新的计算机上成为分区E:.

(2)编写一个能恢复管理员密码的批处理文件admin.bat,内容只需要一条"net user"命令即可.如下:

net user administrator 12345678

这儿我们假设当前的管理员是administrator,将它的密码恢复为"12345678".将文件admin.bat保存到"E:\winnt\system32\GroupPolicy\Machine\Scripts\Startup"下,也就是故障计算机原来的"C:\winnt\system32\GroupPolicy\Machine\Scripts\Startup"下.

(3)编写一个启动/关机脚本配置文件scripts.ini,这个文件名是固定的,不能改变.内容如下:

[Startup]
0CmdLine=admin.bat
0Parameters=

将文件scripts.ini保存到"E:\winnt\system32\GroupPolicy\Machine\Scripts"下,也就是故障计算机原来的"C:\winnt\system32\GroupPolicy\Machine\Scripts"下.

(4)将硬盘恢复为主盘,接回原来的计算机,重新启动,等待启动脚本运行.启动脚本运行结束管理员administrator的密码就被恢复为"12345678".

(5)如果要新建一个管理员账号,admin.bat文件的内容可以修改为:

net user admin 12345678 /add
net localgroup administrators admin /add

这样一个名为"admin",密码是"12345678"的管理员账号就建立了.

这个方法不仅可以恢复独立服务器上本地管理员密码,也可以恢复Win2000域中域管理员的密码.

WINDOWS程序,架构

   进行Windows程序设计,实际上是在进行一种对象导向的程序设计(OOP)。这一点在Windows中使用得最多的对象上表现最为明显。这种对象正是Windows之所以命名为「Windows」的原因,它具有人格化的特征,甚至可能会在您的梦中出现,这就是那个叫做「窗口」的东西。


  桌面上最明显的窗口就是应用程序窗口。这些窗口含有显示程序名称的标题列、菜单甚至可能还有工具列和滚动条。另一类窗口是对话框,它可以有标题列也可以没有标题列。

  装饰对话框表面的还有各式各样的按键、单选按钮、复选框、清单方块、滚动条和文字输入区域。其中每一个小的视觉对象都是一个窗口。更确切地说,这些都称为「子窗口」或「控件窗口」或「子窗口控件」。


  作为对象,使用者会在屏幕上看到这些窗口,并通过键盘和鼠标直接与它们进行交互操作。更有趣的是,程序写作者的观点与使用者的观点极其类似。窗口以「消息」的形式接收窗口的输入,窗口也用消息与其它窗口通讯。对讯息的理解将是学习如何写作Windows程序所必须越过的障碍之一。


  这有一个Windows的消息范例:我们知道,大多数的Windows程序都有大小合适的应用程序窗口。也就是说,您能够通过鼠标拖动窗口的边框来改变窗口的大小。通常,程序将通过改变窗口中的内容来响应这种大小的变化。您可能会猜测(并且您也是正确的),是Windows本身而不是应用程序在处理与使用者重新调整窗口大小相关的全部杂乱程序。由于应用程序能改变其显示的样子,所以它也「知道」窗口大小改变了。


  应用程序是如何知道使用者改变了窗口的大小的呢?由于程序写作者习惯了往常的文字模式程序,操作系统没有设置将此类消息通知给使用者的机制。问题的关键在于理解Windows所使用的架构。当使用者改变窗口的大小时,Window给程序发送一个消息指出新窗口的大小。然后程序就可以调整窗口中的内容,以响应大小的变化。

「Windows给程序发送消息。」我们希望读者不要对这句话视而不见。它到底表达了什么意思呢?我们在这里讨论的是程序代码,而不是一个电子邮件系统。操作系统怎么给程序发送消息呢?

  其实,所谓「Windows给程序发送消息」,是指Windows呼叫程序中的一个函数,该函数的参数描述了这个特定消息。这种位于Windows程序中的函数称为「窗口消息处理程序」。

  无疑,读者对程序呼叫操作系统的做法是很熟悉的。例如,程序在打开磁盘文件时就要使用有关的系统呼叫。读者所不习惯的,可能是操作系统呼叫程序,而这正是Windows对象导向架构的基础。

  程序建立的每一个窗口都有相关的窗口消息处理程序。这个窗口消息处理程序是一个函数,既可以在程序中,也可以在动态链接库中。Windows通过呼叫窗口消息处理程序来给窗口发送消息。窗口消息处理程序根据此消息进行处理,然后将控制传回给Windows。


  更确切地说,窗口通常是在「窗口类别」的基础上建立的。窗口类别标识了处理窗口消息的窗口消息处理程序。使用窗口类别使多个窗口能够属于同一个窗口类别,并使用同一个窗口消息处理程序。例如,所有Windows程序中的所有按钮均依据同一个窗口类别。这个窗口类别与一个处理所有按钮消息的窗口消息处理程序(位于Windows的动态链接库中)联结。

  在对象导向的程序设计中,对象是程序与数据的组合。窗口是一种对象,其程序是窗口消息处理程序。数据是窗口消息处理程序保存的信息和Windows为每个窗口以及系统中那个窗口类别保存的信息。


    窗口消息处理程序处理给窗口发送消息。这些消息经常是告知窗口,使用者正使用键盘或者鼠标进行输入。这正是按键窗口知道它被「按下」的奥妙所在。在窗口大小改变,或者窗口表面需要重画时,由其它消息通知窗口。

  Windows程序开始执行后,Windows为该程序建立一个「消息队列」。这个消息队列用来存放该程序可能建立的各种不同窗口的消息。程序中有一小段程序代码,叫做「消息循环」,用来从队列中取出消息,并且将它们发送给相应的窗口消息处理程序。有些消息直接发送给窗口消息处理程序,不用放入消息队列中。

  如果您对这段Windows架构过于简略的描述将信将疑,就让我们去看看在实际的程序中,窗口、窗口类别、窗口消息处理程序、消息队列、消息循环和窗口消息是如何相互配合的。这或许会对您有些帮

大学生IT创业计划书

   若干年前,我们憧憬IT业,因为IT业神圣的,很多硅谷的故事给我们很多启迪,IT业不仅可以创造无数富豪,而且其中很多都是年轻的学生,那时候IT就是一个神话……
    
    若干年后,我们进入IT业,发现原来IT没有那么神秘。确实IT创造了很多神话,Yahoo!,Microsoft等是早期IT的神话,现在Google来了,中国的Baidu也上市了,造就了很多百万富翁。中国纳斯达克上市公司很多了,最早的是网易、新浪、搜狐,然后是前程无忧、携程网、空中网、TOM、e龙、掌上灵通、金融界、分众传媒、德信无线、中芯国际、亚信科技、九城软件、CDC(china doc com),现在的baidu。中国目前有18个纳市上市公司,明年还有更多。这样看的话现在的IT业前途是很光明,或许IT业在走向成熟。但是成熟的背后寓意着什么,一个不成熟的行业往往能造就很多天才,一旦这个行业走向成熟,那天才不好容易诞生了,想白手起家什么的,也困难。说到这里都没有围绕题目在转,因为我想先把文章的背景说明下,然后再说明下自己一不是研究这个领域的专家,也不是搞互联网的老手,自己只是一个个人站长,或者说还是一名本科大学生,在这里写这篇文章,唯一一点就是自己还算在互联网里学习了几年,有了一点对IT业,互联网行业自己的一点看法,于是就写下来,大家可以看下,不知道有没有可取之处。 大学生创业网


    现在搞真的很难了,如果你是学生的话,我不是在唬你。你以前可能听说一个加拿大的小学生,9岁左右的时候,就靠互联网挣了不少的财富,2000年他还随加拿大总理访华了,这个小孩子能不能成为比尔·盖次第二我们这里不讨论。这么小的孩子可以成为富翁,只有IT才能成就,但是现在在中国,你说可能吗?反正暂时我没有听说过,以前有一个黑龙江漠河的神童,现在也不说了,结果怎么样我也不知道。刚才说到搞IT难是因为现在IT需要的起点高了,我就拿互联网一个方面说明,2000年以前的时候,做1-2张静态网页就可以挣2-3万,会个动态网页那是非常牛的。加拿大的那个小孩子就是靠做网页挣钱的,阿里巴巴的马云最初积累资金我觉得也是做网页挣的,但是现在有了做网页的工具了,不用一行一行写代码了。而且会做网页的中国人太多了,会ASP、PHP、CGI、JPS、ASP.NET的都大有人在,中国现在有个人网站的人都数不胜数。现在做网站门槛很低,但是很少能成功的。门槛低,但是需要的起点高。本身现在大学生自主创业追者众成者寡,大学生创业很不容易。但是事在认为,相对而言,我感觉大学生如果要创业的话,选择IT业的一些东西,起点是高了,对技术要求是很高,但是只要把握好方向后,坚持不懈还是能成功的。新东方的周承刚,很多喜欢新东方的同学都应该知道,他说了一句话我至今难忘,他说为什么俞敏洪成功了,前提是俞敏洪是当时他们班成绩最差的,而现在原来他们班成绩最好的几个都给他打工,因为在这十年中俞敏洪一直在做同一件事情;百度成功了因为李彦宏一直坚持在做同一件事情,ChinaRen创始人陈一舟再次创业创办“空中网”,然后也成功了。成功学的秘诀就是坚持。所以我觉得大学生IT创业,即使丁磊这样的前辈都不赞成大学生创业,我还是觉得很有好处的。 大学生创业网


    先举几个例子,我自己身边的朋友,他们有的现在已经毕业了,有的现在还是学生,但是起步都是从大学开始的,做的事业都是互联网方面。虽然不是非常成功,但是还是值得我们广大大学生IT创业借鉴的。个人网站站长开始建站的时候肯定喜欢在源码下载站上转悠,都知道中国站长站,我的朋友不是该站站长,但是也是源码下载站,一个是源易网的站长(杭商院),一个是下吧的站长,现在网络开始火了,这些代码下载站也火了,流量也不小,网站收入也不少,肯定能养活站长。FlashKu的站长:碧落洞仙和纳米,陕西的两个学生,网站排名不错,收入也可以。还有商务零八的岳贵,西南交大的,据说他发了,挣钱不少,厦门的站长大会他也去了,也算在圈子还是有一点的知名度的。还有华中科大学生创办的5Q地带,很多大学生朋友都知道。还有2000年清华大学的三位博士、三位硕士创办的蔚蓝书店。这些都算是值得我们学习的前辈。大学生IT创业是行得通的,但是还是应该注意下问题,下面我就谈谈个人的看法:

大学生创业网


一、找准目标 大学生创业网


    做IT互联网的,很容易迷失自己,我从余世维老师那里听到这样一个比喻“中国的中关村建设是很失败的,中关村其实就是一个村,因为里面的IT公司小农意识太强了:看到别人卖电脑好,大家都卖电脑;看到别人做通讯设备,大家都做通讯设备”,其实我们这个IT互联网大圈子不也是一个村吗?看到门户网站成功了,无数人都想做门户;看到音乐网站成功了,很多音乐网站就浮现;看到HAO123成功了,无数“HAO123”也跟着上来;现在网络游戏很火,国内制作网络游戏的公司大面积的出现。当然我所说的是一个大环境,不要说个人了,大公司都不好把握方向。对于个人或者大学生团队,应该量力而行,什么能做,什么适合自己去做。若干年前我也失败过,我看到黑龙江几个大学生创办了一个校园电子商务网站,是局域网内的,做盒饭生意,做得有声有色的。我觉得我在技术方面各方面都不会比他们差哪里去的,于是我和同学合作,一起做起了校园电子商务网—巴巴哈,情况怎么样呢?第一年还可以,不过确实很辛苦,因为从进货到整理定单到发货,全部的工作都是自己在做,而且很多交易都是网下进行的,商品的利润也不是很高。到后来问题更严重,时间上已经不允许我再经营,很多外地订单都不能及时送出。最后我总结了下,电子商务特别是B2C电子商务还是前卫的人士玩的东西,在我大学所在地区还没有达到那种程度,一个学校里很少人愿意网上买东西,很少人会利用网络来服务生活的。这是电子商务的困惑,也是互联网的困惑,同时也是中国网民素质、网络教育的困惑。大学生做事情最容易理想化,所以相当然的做事情的也很多,大学生创业失败几率大也是因为这个原因。

手动清除chcp.exe病毒 保护MSN的安全

  随着即时通讯工具的强大,木马病毒也加快了脚本,MSN早就成为了其通向第三方计算机感染跳越的平台。在好友圈中,只要盗取一个MSN好友帐号或感染一台用户计算机,病毒即会伸出罪恶之手,将会在用户MSN聊天时发送病毒信息。

    病毒分析
    该病毒属于MSN蠕虫变种,被感染的计算机会自动向MSN联系人发送诱惑文字消息和带毒压缩包,当对方接收并打开带毒压缩包中的病毒文件时,系统即成为新的受害者,并因此尝试感染另一台计算机。病毒大小为434,176 字节,通过MSN聊天工具进行传播。

    被感染的计算机,病毒首先会在系统目录 %Windows%下生成含带病毒源体的F0538_jpg.zip压缩包,随后病毒自身开始在计算机中的%Windows%目录下创建副本chcp.exe 可执行文件,并在注册表[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run]分支下建立"chcp.exe"="%Windows%\chcp.exe"自启动项目,然后病毒开始修改注册分支[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon]下的"SFCDisable"=dword:ffffff9d  和"SFCScan"=dword:00000000值,进行关闭系统文件保护,并且更改  [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control]分支下的 "WaitToKillServiceTimeout"=的值为"7000",达到更改自动关闭进程等待时间的效果。

    完成上述后,病毒仍没有安静的等待,而是查找被感染的计算机中是否存在FTP目录,如果有则将原正常程序改名为backup.ftp、backup.tftp并复制到%System%\microsoft目录下,随后在系统目录%System%下写入ftp.exe、tftp.exe、dllcache\tftp.exe、dllcache\ftp.exe可执行程序,做完一系列的手脚,病毒开始向MSN联系人发送诱惑型文字消息,并夹带毒包F0538_jpg.zip欺骗用户打开。

   清除方法
    中了此毒的用户也不要紧张,在了解了生存原理后要想清除该病毒也非难事,只要按照以下几个步骤实施即可将病毒清除出界,让系统中的MSN正常运行。

    一、首先要进入注册表分支[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run]下,将"chcp.exe"="%Windows%\chcp.exe"自建的随机启动项删除,完成后重启计算机。

    二、进入%Windows%\目录下将病毒源体文件chcp.exe及F0538_jpg.zip压缩包删除。

    三、将目录%System%下的FTP破坏代替程序ftp.exe、tftp.exe、dllcache\tftp.exe、dllcache\ftp.exe删除,并将%System%\microsoft目录下的backup.ftp、backup.tftp改回到目录%System%下。

    四、删除注册表分支[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon]下的"SFCDisable"=dword:00000000键值,恢复系统文件保护。

    五、最后将注册表[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control]分支下的"WaitToKillServiceTimeout"=改为"20000" 从而恢复系统自动关闭进程等待时间的默认配置。
           
    笔者按:在MSN病毒中变体有很多种如:MSN机器人、MSN小丑、MSN性感相册等,其原理都是利用MSN作为平台在同聊友沟通的同时发送病毒信息,通过MSN好友关系欺骗用户点击,然后再次传播,从而形成强大的传播途径。为了更好的处理此类病毒,这里建议用户加强计算机的先期保护如:开启杀软定时升库,安装安全类软件,不定期打入系统补丁等,并且多了解每日病毒动态,即时作好防范工作即可,一但用户被感染时应立即作出回应,利用手工删除或下载相应的专杀工具进行清理,以免让更多的用户成为受害者。

用PHP输出静态页面的两种方法

        用PHP输出静态页面的方法,就我所知道的,有2种,一种是利用模板技术,另一种是用ob系列函数。两种方法,看起来都差不多,但是实际上,却是不同的。

第一种:利用模板。目前PHP的模板可以说是很多了,有功能强大的smarty,还有简单易用的smarttemplate等。它们每一种模板,都有一个获取输出内容的函数。我们生成静态页面的方法,就是利用了这个函数。用这个方法的优点是,代码比较清晰,可读性好。

这里我用smarty做例子,说明如何生成静态页

<?php
require('smarty/Smarty.class.php');
$t = new Smarty;
$t->assign("title","Hello World!");
$content = $t->fetch("templates/index.htm");
//这里的 fetch() 就是获取输出内容的函数,现在$content变量里面,就是要显示的内容了
$fp = fopen("archives/2005/05/19/0001.Html", "w");
fwrite($fp, $content);
fclose($fp);
?>
第二种方法:利用ob系列的函数。这里用到的函数主要是 ob_start(), ob_end_flush(), ob_get_content(),其中ob_start()是打开浏览器缓冲区的意思,打开缓冲后,所有来自PHP程序的非文件头信息均不会发送,而是保存在内部缓冲区,直到你使用了ob_end_flush().而这里最重要的一个函数,就是ob_get_contents(),这个函数的作用是获取缓冲区的内容,相当于上面的那个fetch(),道理一样的。代码:

<?php
ob_start();
echo "Hello World!";
$content = ob_get_contents();//取得php页面输出的全部内容
$fp = fopen("archives/2005/05/19/0001.html", "w");
fwrite($fp, $content);
fclose($fp);
?>