简化使用 Session 和安全
理论说得够多了! 现在让我们开始写我们自己的应用。 在这一章里,我们将会大致描述一下我们要建立的一个应用系统,而且我们分析一些会影响到网站系统的的基本问题也就是会话管理和安全。
在这一章,我们将会见到:
。如何使你的网页安全
。如何使用 CI 的会话类
开始用 CI 设计一个实际的网站
我们已经看过 CI 安装时生成的welcome页以及它内部动作中控制器文件和视图文件的动作流程。 实际上这就是CI的'Hello, World!'。
从前,业余者写的发烧友网站都使用开放源代码系统,而且总是被一些所谓的大公司看成是低档的玩艺儿。
不过现在,套用一句老话,时代不同了。很多大公司开始使用开放源代码技术。 举例来说,美国太空总署和美联社使用MySQL 、美国审计处和雅虎正在使用 PHP 的应用。 而且我相信规模适中,具有高度灵活性的动态网站正在迅速增长。当大公司了解到那些他们一直使用的商业技术无法新的需求后,他们引进规模适中,具有高度灵活性的运用代替原来的系统
CI 无疑是设计开发适度规模,具有高度灵活性的利器。它手把手地教你规划网站并做出一致而可靠的运用。
为了示范 CI 的灵活性,让我们开始建立一个应用。
重新说一下我的需求,我要让这个网站为我解决我的问题。 我正维护着一些网站, 有些是我自己的,有些是我的客户的。我需要对这些网站进行日常维护,测试它们, 确保它们运转良好。大部分的工作内容是重复性的,我可以雇人来做这件事,但是写一个网站会是比较合理的方案,它能自动化的完成工作,不管白天还是黑夜。
因此我的需求是:
1. 不需要人工干预,管理一个或更多的远程网站
2. 定期检测远程网站
3. 生成报表, 提供网站的细节和测试结果
如果ISP允许的话,我想设定网站能运行Cron(注:linux下的计划任务软件),如果不允许, 我会自己一天两次或者1小时1次地运行, 让它运行一个预设的测试方案。
我不想要知道细节,除非什么东西出现故障(然后我想要让它发送一封电子邮件告诉我出院什么事,在哪个环节出的事),然后我想要能够打印出管理报告让我的客户意识到我一直做定期的检查, 并正常地运行他们的网站。
为了避免使代码太长和过于重复,因此在这本书里的代码并不足够安全, 因此请记住不用在实际应用环境中使用这些代码。 这一章涉及了针对未认证用户的确保网站安全的一般概念其他的PHP安全问题,本书没有涉及。
在现阶段,我们可以看到CI实现方式与一般动态网站的方式相似,因此让我们先放下设计这个主题,从一些非常基本概念谈起。
关于网站
任何的网站是一个各类应用的集合,而且它们彼此之间应该能够交互。我们在第 3 章看到, CI 使用URL进行链接。典型的URL如下表:
基本url http://www.mysite.com.这是最基本的URL,用户用它定
位你的网站。用户不需要知道URL的其余部分,网站会在需要时自动加上其它部分
index 文件 第一部分: index.php
这是CI的的网站主文件
class 第二部分:start
(或称为controller) 如果没有设置控制器,CI会从config文件中寻找默认控制器
method 第三部分:assessme
(或称为函数) 如果没有设定函数,CI会使用本控制器中的默认函数,找不到就
重定向到404页
增加的任何的叁数 第四部分:fred
传递给函数的参数
第五部分: 12345, 第六部分: Hello, 等等。
因此, 在start控制器中调用accessme函数,并传入fred,12345两个叁数,你的网址将会是:
http://www.mysite.com.index.php/start/assessme/fred/12345
系统会查找start.php, 其中有一个Start类,它的内部有一个accessme方法,需要传入两个参数,现在传给这两个参数的值分别是fred和12345。一个这样的URL可以调用你网站上任何一个控制器中的任何功能。
为了体会它如何工作,让我们建立我们网站的第一个页面。我们将会建立叫做Start的控制器,而且把它设定为默认控制器。
好吧, 首先, 因为安装CI时, 它指定welcome为默认控制器,因此我需要改变这个设置。
CI默认的路由存放在下列路径
/system/application/config/routes
当前设置为:
$route['default_controller']="welcome";
我们把它改成::
$route['default_controller']="start";
(记住, 如果你的默认控制器中没有一个index方法,如果使用基本URL,系统会显示404错误)
现在我需要编写我的start控制器。 记得基本的格式:
class Start extends Controller {
function start() {
parent::Controller();
}
function assessme($name, $password) {
if ($name =='fred' && $password == '12345') {
$this->mainpage();
}
}
}
?>
把这个文件保存为/system/application/controllers/start.php。
第二行告诉你这是一个控制器。 然后构造函数装载父控制器构造方法。 assessme函数需要二个变量 $name和 $password。 CI(从 1.5 版开始) 自动分配URL的相关部分作为叁数, 因此 fred 和 12345 将会变成那 $name和 $password。
因此, 如果我们键入上面的网址,如果用户存在,密码无误,我会被重定向到mainpage()函数。 我们会在start控制器中增加这个函数。(如果用户检测不能通过,系统运行结束.)
对于那些过去一直使用过程式编程而不是OO编程的人来说,请注意一个类中的方法必须被表示成 $this->xxxx。 因此, 如果我调用start控制器里的mainpage()函数,我必须这样表示$this->mainpage(). 否则,CI会找不到它。
当然, 一般用户不会这样定位一个网站:
http://www.mysite.com.index.php/start/assessme/fred/12345.
他们仅仅输入:
http://www.mysite.com
而且希望网站给出导航条。 因此让我们让这里开始。
通常, 你在网站上看到的第一个页面是登录页面。 因此让我们来做一个。 首先,我把一个新的函数加入start控制器。我想要网站默认调用这个函数,因此,我将它命名为index().
function() {
$data['mytitle'] = "My site";
$data['base'] = $this->config->item('base_url');
$data['css'] = $this->config->item('css');
$data['mytitle'] = "A website to monitor other websites";
$data['text'] = "Please log in here!";
$this->load->view('entrypage',$data);
}
它调用视图:entrypage。 视图中包含一个表格,这个表格让用不着户输入用户名和密码。 HTML 表格需要指定一个处理$_POST的函数,我们已经把它放在start控制器中,就是 assessme() 。用HTML代码表示,在我们的视图上的表格应该是: