$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代码表示,在咱们的视图上的表格应该是:
让咱们看看代码结构以及各部分如何交互。 (注意为了要使例子简洁,咱们不校验用户的输入。 固然,这不会形成问题, CI 的表格类自动为输入数据“消毒”。
/*receives the username and password fromthe POST array*/ function assessme() { $username = $_POST['username']; $password = $_POST['password'];
/*calls the checkme function to see if the inputs are OK*/ if ($this->checkme($username,$password)=='yes') { /*if the inputs are OK, calls the mainpage function */ $this->mainpage;() } /*if they are not OK, goes back to the index function, which re-presents the log-in screen */ else { $this->index(); } } /*called with a u/n and p/w, this checks them against some list. For the moment, there's just one option. Returns 'yes' or 'no' */
function checkme($username='', $password='') { if ($username == 'fred' && $password =='12345') { return 'yes'; } else { return('no'; }
CI 有一个会话类来处理会话相关工做。 事实上,它大大减小了编码量。咱们在上一章学习到 CI 有各类各样的library,大大简化了PHP的编程。 这些就是框架的核心: 集成大量代码,为你提供各类强大的功能。你要作的只是使用它们,而没必要关心他们是如何运做的。做为结果,你的应用使用了最专门的代码,而你却不须要本身去编写它们!
检查你的system/application/config/config.php 文件,你会找到像这样的一个部分: -------------------------------------------------------------------------- | Session Variables |-------------------------------------------------------------------------- | | 'session_cookie_name' = the name you want for the cookie | 'encrypt_sess_cookie' = TRUE/FALSE (boolean). Whether to encrypt the cookie | 'session_expiration' = the number of SECONDS you want the session to last. | by default sessions last 7200 seconds (two hours). Set to zero for no expiration. | */ $config['sess_cookie_name'] = 'ci_session'; $config['sess_expiration'] = 7200; $config['sess_encrypt_cookie'] = FALSE; $config['sess_use_database'] = FALSE; $config['sess_table_name'] = 'ci_sessions'; $config['sess_match_ip'] = FALSE; $config['sess_match_useragent'] = FALSE;
在你的数据库中保存会话数据很是简单。 首先,建立数据库表。 若是你正在使用 MySQL, 使用这一 SQL 语句:CREATE TABLE IF NOT EXISTS `ci_sessions` (session_id varchar(40) DEFAULT '0' NOT NULL,ip_address varchar(16) DEFAULT '0' NOT NULL,user_agent varchar(50) NOT NULL,last_activity int(10) unsigned DEFAULT 0 NOT NULL,status varchar(5) DEFAULT 'no',PRIMARY KEY (session_id));而后,修改在system/application/config/database.php 文件中的链接叁数告诉 CI 数据库在哪里。详细介绍参见第 4 章若是工做正常的话, 当你登陆或退出时,在你的数据库表中增长了相关的数据。若是你在一张数据库表中储存会话, 当用户登陆到你的网站,网站会查找cookie, 若是它找到了,就会读取会话ID,并用这个ID去匹配数据库表中保存的ID。你如今拥有一个强健的会话机制。 而这一切只须要一行代码!一点声明,PHP自己的会话类在用户关闭cookie功能时可以应付。(取代生成cookie,它把会话数据加入URL) CI 类不会这样作,若是使用CI,一旦用户禁止cookie,他就不能登陆到你的网站。这方面须要加强功能。 但愿Rich将会很快升级CI。安全注意到:会话类会自动地保存关于访问者的 IP 地址和使用者的资料。你可使用一些加强的安全措施。经过修改config文件的二处设置可增长安全性:。 sess_match_ip: 若是你设定这个参数为TRUE, 当它读取会话数据时,CI 将会尝试相配使用者的 IP 地址。 这将预防使用者使用'抢'来的cookie信息。可是,有些服务器 (ISP和大公司服务器) 可能存在不一样 IP 地址上的相同使用者登陆的请求。 若是你设定这个参数为TRUE,可能会给他们形成麻烦。。 sess_match_useragent: 若是你设定这为TRUE, 当读取会话数据的时候, CI将会试着匹配使用者代理。这意谓试着“抢夺”会话的人还须要匹配真正用户的user agent设置。 它使“抢夺”变得稍稍有些困难。CI 也有一个 user_agent 类, 你能够这样装载:$this->load->library('user_agent');一旦装载, 你能要求它返回访问你网站的浏览器和操做系统的各类信息, 而无论它是一个浏览器,手机或机器人。 好比,若是你想列出叁观你的网站的机器人,你能够这样作:$fred = $this->agent->is_robot();if ($fred == TRUE) {$agent = $this->agent->agent_string();/*add code here to store or analyse the name the user agent is returning*/}类经过装入后开始工做, 与用代理,浏览器,机器人和其它的类型的数组做比较,这个数组存放在system/application/config/user_agents。若是你愿,你能够容易开发出使你的网站锁定特定机器人,特定浏览器类型的功能。 不过,记得一个攻击者很容易写出一个代理类型,并返回他想要扔给你的那种类型。所以,他们能容易地假装成一般的浏览器。 许多机器人,包括象CI 的 user_agents 数组已列出的 Googlebot,是'品行端正的'。 这意味着若是你设定你的 robots.txt 文件排除他们,他们将不会强行攻击。没有容易的方法去阻击一个不知名的的机械手,除非你预先知道他们的名字!在 CI框架中 ,会话机制保存那发出请求的 IP 地址,所以你可使用这个功能维护一个网站的黑名单。能够用以下代码取回来自会话的 IP:/*remember to load the library!*/ $this->load->library('session');/*look for an 'ip_address' variable in the contents of the session cookie*/$ip = $this->session->userdata('ip_address');所以你能针对黑名单做相应的安全处理,好比拒绝登陆。你也能够用CI 的会话机制限制来自重复请求的损害-像是一个机器人经过重复地请求网页来使你的网站超载。 你也可使用这一个机制处理 '字典'攻击,即一个机器人不断重复尝试数百或者数以千计的密码/用户名组合直到它找到正确的一组。由于 CI 的会话类保存每一个会话的last_activity ,因此你能作到这一点。 每次,当网页被请求时, 你能检查多久之前这个IP地址的用户发出一请求,两次请求的间隔若是不正常,你能够终止会话,或放慢响应的速度。摘要咱们已经概略介绍了咱们想要创建的一个应用, 和几乎全部应用都须要解决的问题:会话管理和安全保证。为了作到这一点,咱们已经学习了CI会话类的一引发细节,并且见到它如何生成会话记录和在访客的浏览器中生成cookie。当后续的请求发生时,你能够读取cookie对响应进行控制。