本文将介绍php-CodeIgniter身份验证安全模型的详细情况,特别是关于php身份证验证的相关信息。我们将通过案例分析、数据研究等多种方式,帮助您更全面地了解这个主题,同时也将涉及一些关于CI(
本文将介绍php-CodeIgniter身份验证安全模型的详细情况,特别是关于php身份证验证的相关信息。我们将通过案例分析、数据研究等多种方式,帮助您更全面地了解这个主题,同时也将涉及一些关于CI(CodeIgniter)模型用法实例分析,cicodeigniter_PHP教程、CodeIgniter 4 建议路线图 codeigniter thinkphp codeigniter 3.0 codeigniter cms、CodeIgniter 4 的内容协商 codeigniter session codeigniter join nginx codeigniter rewrite、CodeIgniter 4 的请求和响应 codeigniter thinkphp codeigniter 3.0 codeigniter cms的知识。
本文目录一览:- php-CodeIgniter身份验证安全模型(php身份证验证)
- CI(CodeIgniter)模型用法实例分析,cicodeigniter_PHP教程
- CodeIgniter 4 建议路线图 codeigniter thinkphp codeigniter 3.0 codeigniter cms
- CodeIgniter 4 的内容协商 codeigniter session codeigniter join nginx codeigniter rewrite
- CodeIgniter 4 的请求和响应 codeigniter thinkphp codeigniter 3.0 codeigniter cms
php-CodeIgniter身份验证安全模型(php身份证验证)
我已经为CodeIgniter构建了一个自定义身份验证系统(我知道有各种第三方库可用,但这是出于我自己的利益),但是我担心我遗漏了一些明显的东西,可能会使整个系统崩溃.
我使用CI会话(通过数据库)并为一些可能毫无意义的混淆加密cookie值.登录通过SSL进行(并且cookie被修改为仅安全).我也使用PHPass对存储的密码进行哈希处理,尽管那在这里并不重要.这部分的某个地方可能存在薄弱环节,但是我主要担心的是,页面间检查基本上由if is_logged_in = true类型方法以及会话中的用户名组成.这一点让我感到担忧,因为这似乎太“容易”了.这种方法是否很脆弱?我应该计算用户代理或其他内容的逐页哈希值,并确保它们匹配吗?
任何指针将不胜感激.就像我说的,我知道已经存在的解决方案,但是我想在这里学习一些知识:)
解决方法:
您提到的一切都很好.我不熟悉PHPass.确保在对密码进行哈希处理时使用的是盐.
if_logged_in = true检查就足够了,因为会话数据存储在服务器端.检查诸如用户代理之类的内容的原因是为了帮助防止会话劫持,即一个人获得另一人的会话ID.
CI(CodeIgniter)模型用法实例分析,cicodeigniter_PHP教程
ci(codeigniter)模型用法实例分析,cicodeigniter
本文实例分析了ci(codeigniter)模型用法。分享给大家供大家参考,具体如下:
MVC中的业务逻辑放在控制器中或者模型里都是不合适的,所以这里对业务逻辑进行了分离,多出一层用来处理业务逻辑,模型就只当作数据访问层,这样子模型将会变得比较轻。CI中并未通过实体对象来传参,参数的传入和返回都由开发者控制,比较灵活。很多情况下都会以数组的方式传入或者返回。
模型的使用也比较简单,这里只提一下使用前想到的几个问题吧。
1、既然已经有了数据访问层了,那我们就应当避免在控制器或者某些类中直接通过SQL查询数据库,所有的数据库访问操作都应当经过模型获取,大多数情况下一个表名对应着一个模型类。
2、模型应当很方便的连接多个数据库,在database配置文件中有谈到多个库的配置问题,根据group_name的不同可以很方便的连接不同的库。如果有主从,还可以考虑到主从的切换使用问题。
立即学习“PHP免费学习笔记(深入)”;
3、模型是否还要按模块区分?在控制器中存在公用控制器分发的做法,在模型中这种思维可能不太好,但可以通过继承不同的公用模型类来实现,这些类再继承CI的MY_Model。在某些业务下根据模块来继承可能比较有用,大部分情况可以直接继承MY_Model,MY_Model主要实现数据库的初始化连接以及一些公用方法。
4、数据库提供的操作方式都是比较基础的,需要我们根据自身的需求去组装,但在我们日常操作中很多操作是类似的,如,根据主键获取信息,根据ID获取信息,根据属性获取信息等,可以对这些基础的操作在进行一次封装,更方便使用。因为如果要使用AR的方式来操作数据库,需要记住很多的方法,如我们根据用户名查询:
$query = $this->db->from(''user'')->where(array(''username'' => ''BobbyPeng''))->get(); return $query->row_array();
如果封装后,则只需要记住一个方法即可,如:
public function findByAttributes($where = array()) { $query = $this->db->from($this->tableName())->where($where)->get(); return $query->row_array(); }
这样子在每个模型中添加一个tableName的方法返回表名后,再通过模型就可以很方便的使用该方法了。
5、上面的方法属于一个公用方法,我们会写在MY_Model中,但这种类似的方法会很多,我们可否将该类型的方法独立于一个文件中?因为这种方法大部分情况下是不会改的,而放在MY_Model中则表示对它的修改开放了,可能会影响到这些方法。如果说该类叫ActiveRecord类,那可以让MY_Model继承ActiveRecord类,而ActiveRecord类继承CI_Model,参考代码见后面。
很多时候类库提供给我们的方法都是比较细的,我们可以封装一下,减少使用难度。关于模型中公用方法的封装一直还在考虑中,下面给出的只是一个针对单表的简单的操作,复杂的操作就得在特定的模型中实现,还有一些公用操作或者说非AR的操作方式可以统一下,看以后是否有机会再来考虑下这个问题。
公用AR封装类,可进行常用的操作,需要赋予db属性为数据库连接对象,并在模型中设置几个方法,如主键、表名
<?php if ( ! defined(''BASEPATH'')) exit(''No direct script access allowed''); class ActiveRecord extends CI_Model { /** * 保存数据 * * @param array $data 需要插入的表数据 * @return boolean 插入成功返回ID,插入失败返回false */ public function save($data) { if($this->db->set($data)->insert($this->tableName())) { return $this->db->insert_id(); } return FALSE; } /** * Replace数据 * @param array $data */ public function replace($data) { return $this->db->replace($this->tableName(), $data); } /** * 根据主键更新记录 * * @param string $pk 主键值 * @param array $attributes 更新字段 * @param array $where 附加where条件 * @return boolean true更新成功 false更新失败 */ public function updateByPk($pk, $attributes, $where = array()) { $where[$this->primaryKey()] = $pk; return $this->updateAll($attributes, $where); } /** * 更新表记录 * * @param array $attributes * @param array $where * @return bollean true更新成功 false更新失败 */ public function updateAll($attributes, $where = array()) { return $this->db->where($where)->update($this->tableName(), $attributes); } /** * 根据主键删除数据 * * @param string $pk 主键值 * @param array $where 附加删除条件 * @return boolean true删除成功 false删除失败 */ public function deleteByPk($pk, $where = array()) { $where[$this->primaryKey()] = $pk; return $this->deleteAll($where); } /** * 删除记录 * * @param array $where 删除条件 * @param int $limit 删除行数 * @return boolean true删除成功 false删除失败 */ public function deleteAll($where = array(), $limit = NULL) { return $this->db->delete($this->tableName(), $where, $limit); } /** * 根据主键检索 * * @param string $pk * @param array $where 附加查询条件 * @return array 返回一维数组,未找到记录则返回空数组 */ public function findByPk($pk, $where = array()) { $where[$this->primaryKey()] = $pk; $query = $this->db->from($this->tableName())->where($where)->get(); return $query->row_array(); } /** * 根据属性获取一行记录 * @param array $where * @return array 返回一维数组,未找到记录则返回空数组 */ public function findByAttributes($where = array()) { $query = $this->db->from($this->tableName())->where($where)->limit(1)->get(); return $query->row_array(); } /** * 查询记录 * * @param array $where 查询条件,可使用模糊查询,如array(''name LIKE'' => "pp%") array(''stat >'' => ''1'') * @param int $limit 返回记录条数 * @param int $offset 偏移量 * @param string|array $sort 排序, 当为数组的时候 如:array(''id DESC'', ''report_date ASC'')可以通过第二个参数来控制是否escape * @return array 未找到记录返回空数组 */ public function findAll($where = array(), $limit = 0, $offset = 0, $sort = NULL) { $this->db->from($this->tableName())->where($where); if($sort !== NULL) { if(is_array($sort)){ foreach($sort as $value){ $this->db->order_by($value, '''', false); } } else { $this->db->order_by($sort); } } if($limit > 0) { $this->db->limit($limit, $offset); } $query = $this->db->get(); return $query->result_array(); } /** * 统计满足条件的总数 * * @param array $where 统计条件 * @return int 返回记录条数 */ public function count($where = array()) { return $this->db->from($this->tableName())->where($where)->count_all_results(); } /** * 根据SQL查询, 参数通过$param绑定 * @param string $sql 查询语句,如SELECT * FROM some_table WHERE id = ? AND status = ? AND author = ? * @param array $param array(3, ''live'', ''Rick'') * @return array 未找到记录返回空数组,找到记录返回二维数组 */ public function query($sql, $param = array()) { $query = $this->db->query($sql, $param); return $query->result_array(); } } /* End of file ActiveRecord.php */ /* Location: ./application/core/database/ActiveRecord.php */
MY_Model可以继承该类,这样子模型中可以直接调用上面的方法。
<?php if ( ! defined(''BASEPATH'')) exit(''No direct script access allowed''); require_once APPPATH.''core/database/ActiveRecord.php''; class MY_Model extends ActiveRecord { public function __construct($group_name = '''') { $this->initDb($group_name); parent::__construct(); } protected function initDb($group_name = '''') { $db_conn_name = $this->getDbName($group_name); $CI = & get_instance(); if(isset($CI->{$db_conn_name}) && is_object($CI->{$db_conn_name})) { $this->db = $CI->{$db_conn_name}; } else { $CI->{$db_conn_name} = $this->db = $this->load->database($group_name, TRUE); } } private function getDbName($group_name = '''') { if($group_name == '''') { $db_conn_name = ''db''; } else { $db_conn_name = ''db_''.$group_name; } return $db_conn_name; } } /* End of file MY_Model.php */ /* Location: ./application/core/MY_Model.php */
更多关于CodeIgniter相关内容感兴趣的读者可查看本站专题:《codeigniter入门教程》和《CI(CodeIgniter)框架进阶教程》
希望本文所述对大家基于CodeIgniter框架的PHP程序设计有所帮助。
您可能感兴趣的文章:
- CodeIgniter自定义控制器MY_Controller用法分析
- Codeigniter控制器controller继承问题实例分析
- 2个Codeigniter文件批量上传控制器写法例子
- CodeIgniter钩子用法实例详解
- CodeIgniter配置之database.php用法实例分析
- CodeIgniter多语言实现方法详解
- CodeIgniter视图使用注意事项
- CodeIgniter读写分离实现方法详解
- CI(CodeIgniter)简单统计访问人数实现方法
- CodeIgniter控制器之业务逻辑实例分析
CodeIgniter 4 建议路线图 codeigniter thinkphp codeigniter 3.0 codeigniter cms
data-id="1190000004868218">
我们综合考虑了社区的愿望和意见后,也对什么样的未来对 ci 是最合适的做了一些思考,然后,ci 理事会对框架的未来做出了一些决策。预告一下,未来将会有重大变化,但我们相信他们不仅为我们的未来做准备,也会保持 codeigniter 的一贯特点 - 简洁、快速和灵活。
这篇文章是对未来的一个简单概述。请记住,这仅仅是最初的计划。任何信息都可能会随着开发的进行而发生变化。
核心变化
从 CodeIgniter 第一版发布以来,PHP 社区发生了巨大变化。CodeIgniter 的许多核心要素在当时是必须的,但当 PHP5 发布后,CodeIgniter 的核心几乎没有任何变化。如果未来 CodeIgniter 想要继续保持高水准并巩固其在 PHP 框架中的地位,则必须进行大改变。
这意味着系统必须全部重写。新的 CI 将在独立的代码库中开发以保持代码的清晰。我们设想会复用一些以前的代码,但重点是 现代的 清晰的代码。
立即学习“PHP免费学习笔记(深入)”;
自从我们以 PHP 7 为目标以来,PHP 5.6 已进入安全维护模式,并将在几个月后完全停止支持。CI 暂时不会为一个即将停止支持的 PHP 版本发布新版本。我们知道主机的环境千差万别,那么一些程序可能就无法完全支持 PHP 7,所以 3.x 分支将继续维护一段时间 - 将远远长于 3.x 发布后的 2.x 分支的 EOL 时限。
application 和 system 目录都将支持 PSR-4 自动加载。CodeIgniter 将使用自己的自动加载器,并将会整合 Composer。
我们将封装一些组件,以便在大多数情况下可以用于 CodeIgniter 以外的项目。
包/模块
我们将丢弃应用程序包和模块的概念。不必惊慌!因为你可以用名字空间来处理大多数情况 - 至少控制器和模型是这样的。对于其他的例如视图、配置文件和 Helper 等,我们相信可以让这些东东支持名字空间。你也可以把所有包的功能和模块的路由能力放到任意目录中,只需告诉自动加载器如何找到他们。
路由
路由功能将被更新。URI 直接映射到控制器/方法这个『魔术路由』功能将可关闭,以便让你选择自己喜欢的路由方式。在路由配置文件中你可以选择使用『魔术路由』或者单独指定每个路由。
改进的日志系统
日志系统将被改进,但具体细节尚未确定。
测试
我们将继续使用 PHPUnit 做测试。这也意味着你需要自己测试应用程序,但我们将为你准备好所需的工具。
向后兼容性
正如上面讲到的那样,这一定是一个和老版本不兼容的版本。我们认为这应该是框架最好的未来。对于这次的重大变化,我们已经做了很多年的基础工作,我们将尽可能的使过渡更平滑,但是对于我们能提供一个怎样的现代化的基础代码仍有待观察。
我们将尽最大努力保持让 CodeIgniter 多年来流行的特性,即快速、简洁和『优雅』。
开发时间表
整个开发过程将分为三个阶段。
下列类库将从内核删除,改为按需下载:排版类、FTP 类、ZIP 类和 XML-RPC 类。
购物车类、Javascript 类、单元测试类和 Trackback 类将被删除。
我们期望在一年内能完成一个内核基本成型的 Alpha 版本。之后,我们将把重点放在改进内核与开发剩余软件包的工作中。确切的时间表可能会有所不同,因为,与大多数开源项目一样,这取决于社区贡献的数量与质量,以及核心开发者的时间和精力。
第一阶段
第一阶段将侧重于抓住框架最重要的部分。这将是框架其他部分的基础。他们包括:
自动加载器
依赖注入
日志
异常处理
HTTP 请求/响应层(或输入/输出)
路由
控制器
模型
数据库层
配置
安全
第二阶段
第二阶段的重点是完善一些 CodeIgniter 用户喜闻乐见的类和特性。他们包括:
Helper
语言/国际化特性
缓存
Email
加密
表单验证
图像处理类库
分页
上传类
Session
视图
调试和分析工具
第三阶段 - 可选类库
第三阶段将主要用来扩充可选软件包。在这个时间点,框架应该可以发布了,不需要等到所有类库都准备就绪。
FTP
XML-RPC
Zip
排版类
模板解析器
框架迎来了新的机遇使我们很兴奋,并迫不及待的希望框架为新版迈出第一步。不要在一旁围观了,赶快来构筑框架的未来吧。
以上就介绍了CodeIgniter 4 建议路线图,包括了codeigniter方面的内容,希望对PHP教程有兴趣的朋友有所帮助。
CodeIgniter 4 的内容协商 codeigniter session codeigniter join nginx codeigniter rewrite
data-id="1190000004868343">
当我关注到 http 层的时候,发现很多 cier 对内容协商还不是很了解,下面我们一起来探讨一下什么是内容协商,以及如何在即将到来的 codeigniter 4 中使用他。
什么是内容协商?
简而言之,内容协商是指客户端和服务器端就响应的资源内容进行交涉,然后提供给客户端最为适合的资源。内容协商会以响应资源的语言、图片类型和编码方式等作为判断的基准(包含在请求头中的某些 Accept 字段就是判断的基准)。
举个例子,我用 Chrome 访问 Mozilla 的站点,可以看到下面的 HTTP 请求头信息:
accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,/;q=0.8
accept-encoding:gzip, deflate, sdch
accept-language:en-US,en;q=0.8
这些 accept 信息告诉我们浏览器所支持的格式,并提供这些格式的优先级信息(通过 q 的值来确定优先级)。以上信息说明浏览器在所有支持的内容类型中更希望接收 text/html 类型的内容。由于我的浏览器的语言设置是英语,所以 accept-language 请求头表示我更喜欢美式英语(en-US)的页面。
很显然,即使我们不提供任何内容协商信息,Web 站点还是可以照常运行,并且我们已经这样做了很多年。然而事实上 Web 服务器可以帮我们处理某些形式的内容协商,我们通常不太善于利用这一点,但并不意味着服务器不能处理这些信息。
内容协商有两个很吸引人的用处,一个是用于那些支持多国语言的站点,另一个是用于返回特定格式数据的 API 接口。
是不是必须要使用内容协商呢?可能不一定,他也许是把双刃剑,有些人提议不要使用他,也有些人认为他就像切片面包一样令人喜爱。但如果你想用,那在 CodeIgniter 中使用内容协商也是很容易的。
一个简单的例子
这里我不会对内容协商作过多详细的介绍(详细介绍将写到用户手册中),这个例子简单介绍了内容协商是如何确定输出语言的。
class BaseController extends \CodeIgniter\Controller { protected $language; public function __construct(...$params) { parent::__construct(...$params); $supportedLangs = [''en-US'', ''en'', ''fr'']; $this->language = $this->request->negotiate(''language'', $supportedLangs); } }
这个例子表示该站点可以支持英语和法语,我们将支持的语言赋值到 $supportedLangs 数组里,预示着默认语言是美式英语,但也支持普通英语和法语,然后简单调用 $negotiate->language() 方法,传递支持的语言类型,解析时就能识别正确的 HTTP 头,然后按照数组里定义的优先级顺序,返回最匹配的结果。如果两种语言都无法匹配,就会使用数组中的第一个语言。
Negotiate 类中的 4 个协商方法分别为:
media() 不同于通常的 Accept 请求头,他可以用来请求不同版本的 html/text,或者音频支持,图像支持,等等。
charset() 不同于 Accept-Charset 请求头,如果没有匹配的话,默认值为 UTF-8。
encoding() 不同于 Accept-Encoding 请求头,可以决定任何客户端支持使用的压缩类型。
language() 不同于 Accept-Language 请求头。
并不是所有场景都用得着内容协商,但他却是构建高质量 API 的一个有力工具,并且也能够创造性的应用于其他地方。
以上就介绍了CodeIgniter 4 的内容协商,包括了codeigniter方面的内容,希望对PHP教程有兴趣的朋友有所帮助。
CodeIgniter 4 的请求和响应 codeigniter thinkphp codeigniter 3.0 codeigniter cms
data-id="1190000004868315">
codeigniter 4 对输入和输出的处理方式做了一个较大的改变。在上一个版本中,包括最新的 v3 版,输入和输出分别是用两个包含相关函数的类来处理的。这样的处理方式背后虽然没有什么高深的技术,但却能简单直接的实现功能。在 v4 版中,我们将更加模块化 http 层,并构建全新的类结构来同时处理 http 的请求和响应。
概览
在开发 Web 应用时(不同于 CLI 程序),你只需关心两个类:IncomingRequest 和 Response。
IncomingRequest 类
IncomingRequest 类包含了 HTTP 请求和该请求附带的数据,包括:
立即学习“PHP免费学习笔记(深入)”;
GET、POST、SERVER 和 ENV 等环境变量
HTTP 请求头
Cookie
当前请求的 URL 对象
上传的文件
并且还包括常见的请求信息比如:
客户端的 IP 地址
是否为 Ajax 请求
是否为 CLI 请求
是否为 HTTPS
如果你对 IncomingRequest 这个类名感到奇怪,或者说 IncomingRequest 是不是可以简单的称为 Request?答案是否定的,因为已经有另一个包含 GET 和 POST 等变量的更为通用的 Request 类,但这个类不包括详细的 HTTP 请求信息。一个请求通常只做两件事:一个是浏览器客户端发送请求到服务器(连入),或者是当前服务器发送请求到外部服务器(连出)。
Response 类
Response 类用于把程序的执行结果返回给客户端。你可以设置 HTTP 响应头,或直接发送内容到客户端,等等。Response 类提供了一些便捷方法比如:
设置适当的 no-cache 头信息
处理 HTTP 缓存头信息
重定向页面
一个简单的例子
上面说的这些看起来好像很有科技含量,但其实很简单。这些类的实例已作为属性放到每个控制器中,如果你觉得很麻烦,则无需直接使用这些属性。Response 类会捕获控制器的输出,并自动设置为响应的主体。一个简单的 Hello World 看起来像这样:
class Home extends \CodeIgniter\Controller { public function index() { echo "Hello World!"; } }
易如反掌。
在需要的时候,框架为你提供了精确控制响应的能力。你可以创建复杂的 HTTP 缓存策略,并与 IncomingRequest 类一起通过内容协商定制响应内容。
下面是一个稍微复杂一点的例子,你会发现代码很容易看明白,并且处理的很简单。
class Home extends \CodeIgniter\Controller { public function __construct(...$params) { parent::__construct(...$params); // This controller is only accessible via HTTPS if (! $this->request->isSecure()) { // Redirect the user to this page via HTTPS, and set the Strict-Transport-Security // header so the browser will automatically convert all links to this page to HTTPS // for the next year. force_https(); } } public function index() { $data = [ ... ]; // Set some HTTP cache rules for this page. $this->response->setCache([ ''max-age'' => 300, ''s-max-age'' => 900, ''etag'' => ''foo'' ]); // Return JSON $this->response->setContentType(''application/json'') ->setOutput(json_encode($data)); } }
在这个例子中,我们主要做了三件事。首先,通过将当前 URL 重定向到 HTTPS URL,并设置一个 Strict-Transport-Security 响应头(这种方式已被很多主流浏览器所支持,在发送请求前通过浏览器自动将 HTTP 请求转换成 HTTPS 请求),来强制这个页面以 HTTPS 的方式访问;然后,我们通过设置一些 HTTP 缓存规则来帮助浏览器正确处理缓存,这意味着能减少 HTTP 请求量,减轻服务器负担,提高性能;最后,我们输出 JSON 数据给用户,并确保内容类型是正确的。
希望这篇文章能有助于大家粗略的了解 CodeIgniter 的未来,让大家意识到改变并不可怕。:) 未来将敲定框架更多的细节,直到形成一个相对稳定的架构,并且会撰写更多的文章来讲述这些内容。
以上就介绍了CodeIgniter 4 的请求和响应,包括了codeigniter方面的内容,希望对PHP教程有兴趣的朋友有所帮助。
今天关于php-CodeIgniter身份验证安全模型和php身份证验证的介绍到此结束,谢谢您的阅读,有关CI(CodeIgniter)模型用法实例分析,cicodeigniter_PHP教程、CodeIgniter 4 建议路线图 codeigniter thinkphp codeigniter 3.0 codeigniter cms、CodeIgniter 4 的内容协商 codeigniter session codeigniter join nginx codeigniter rewrite、CodeIgniter 4 的请求和响应 codeigniter thinkphp codeigniter 3.0 codeigniter cms等更多相关知识的信息可以在本站进行查询。
本文标签: