- CodeIgniter 教程
- CodeIgniter - 首页
- CodeIgniter - 概述
- CodeIgniter - 安装 CodeIgniter
- CodeIgniter - 应用架构
- CodeIgniter - MVC 框架
- CodeIgniter - 基本概念
- CodeIgniter - 配置
- CodeIgniter - 数据库操作
- CodeIgniter - 库
- CodeIgniter - 错误处理
- CodeIgniter - 文件上传
- CodeIgniter - 发送邮件
- CodeIgniter - 表单验证
- CodeIgniter - 会话管理
- CodeIgniter - Flash 数据
- CodeIgniter - Temp 数据
- CodeIgniter - Cookie 管理
- CodeIgniter - 常用函数
- CodeIgniter - 页面缓存
- CodeIgniter - 页面重定向
- CodeIgniter - 应用性能分析
- CodeIgniter - 基准测试
- CodeIgniter - 添加 JS 和 CSS
- CodeIgniter - 国际化
- CodeIgniter - 安全性
- CodeIgniter 有用资源
- CodeIgniter - 快速指南
- CodeIgniter - 有用资源
- CodeIgniter - 讨论
CodeIgniter - 安全性
XSS 防御
XSS 指跨站脚本攻击。CodeIgniter 自带 XSS 过滤安全功能。此过滤器将阻止任何尝试劫持 Cookie 并执行恶意活动的恶意 JavaScript 代码或任何其他代码。要通过 XSS 过滤器过滤数据,请使用如下所示的 **xss_clean()** 方法。
$data = $this->security->xss_clean($data);
只有在提交数据时才应使用此函数。可选的第二个布尔参数也可用于检查图像文件是否存在 XSS 攻击。这对于文件上传功能很有用。如果其值为 true,则表示图像安全,否则表示不安全。
SQL 注入防御
SQL 注入是对数据库查询发起的攻击。在 PHP 中,我们使用 **mysql_real_escape_string()** 函数以及其他技术来防止这种情况,但 CodeIgniter 提供了内置函数和库来防止这种情况。
我们可以通过以下三种方式防止 CodeIgniter 中的 SQL 注入:
- 转义查询
- 查询绑定
- 活动记录类
转义查询
<?php $username = $this->input->post('username'); $query = 'SELECT * FROM subscribers_tbl WHERE user_name = '. $this->db->escape($email); $this->db->query($query); ?>
**$this->db->escape()** 函数会自动在数据周围添加单引号,并确定数据类型以便它只能转义字符串数据。
查询绑定
<?php $sql = "SELECT * FROM some_table WHERE id = ? AND status = ? AND author = ?"; $this->db->query($sql, array(3, 'live', 'Rick')); ?>
在上面的示例中,问号 (?) 将被 query() 函数第二个参数中的数组替换。这种构建查询方式的主要优点是值会自动转义,从而生成安全的查询。CodeIgniter 引擎会自动执行此操作,因此您无需记住它。
活动记录类
<?php $this->db->get_where('subscribers_tbl',array ('status'=> active','email' => '[email protected]')); ?>
使用活动记录,查询语法由每个数据库适配器生成。它还允许更安全的查询,因为值会自动转义。
隐藏 PHP 错误
在生产环境中,我们通常不希望向用户显示任何错误消息。如果在开发环境中启用它以进行调试,则会更好。这些错误消息可能包含某些信息,出于安全原因,我们不应向网站用户显示这些信息。
有三个与错误相关的 CodeIgniter 文件。
PHP 错误报告级别
不同的环境需要不同级别的错误报告。默认情况下,开发环境将显示错误,而测试和生产环境将隐藏错误。根目录下有一个名为 **index.php** 的 CodeIgniter 文件,用于此目的。如果我们将零作为参数传递给 **error_reporting()** 函数,则将隐藏所有错误。
数据库错误
即使您已关闭 PHP 错误,MySQL 错误仍然处于开启状态。您可以在 **application/config/database.php** 中关闭它。将 **$db** 数组中的 **db_debug** 选项设置为 **FALSE**,如下所示。
$db['default']['db_debug'] = FALSE;
错误日志
另一种方法是将错误转移到日志文件。因此,它不会显示在网站上的用户面前。只需将 **$config** 数组中的 **log_threshold** 值设置为 1,在 **application/config/config.php** 文件中,如下所示。
$config['log_threshold'] = 1;
CSRF 防御
CSRF 代表跨站请求伪造。您可以通过在 **application/config/config.php** 文件中启用它来防止此攻击,如下所示。
$config['csrf_protection'] = TRUE;
当您使用 **form_open()** 函数创建表单时,它将自动插入 CSRF 作为隐藏字段。您也可以使用 **get_csrf_token_name()** 和 **get_csrf_hash()** 函数手动添加 CSRF。**get_csrf_token_name()** 函数将返回 CSRF 的名称,**get_csrf_hash()** 将返回 CSRF 的哈希值。
CSRF 令牌每次提交都可以重新生成,或者您也可以在 CSRF Cookie 的整个生命周期内保持不变。通过将值为 **TRUE** 设置在 config 数组中,键为 **‘csrf_regenerate’** 将重新生成令牌,如下所示。
$config['csrf_regenerate'] = TRUE;
您还可以通过在 config 数组中使用键 **‘csrf_exclude_uris’** 设置它来将 URL 从 CSRF 保护中列入白名单,如下所示。您也可以使用正则表达式。
$config['csrf_exclude_uris'] = array('api/person/add');
密码处理
许多开发人员不知道如何在 Web 应用程序中处理密码,这可能是许多黑客如此容易侵入系统的原因。处理密码时,应记住以下几点:
不要以纯文本格式存储密码。
始终对密码进行哈希处理。
不要使用 Base64 或类似的编码来存储密码。
不要使用 MD5 或 SHA1 等弱哈希算法或已损坏的哈希算法。只使用强大的密码哈希算法,例如 PHP 自身的密码哈希函数中使用的 BCrypt。
切勿以纯文本格式显示或发送密码。
不要对用户的密码设置不必要的限制。