CodeIgniter - 安全
XSS 预防
XSS 表示跨站点脚本。CodeIgniter 带有 XSS 过滤安全性。此过滤器将阻止任何恶意 JavaScript 代码或任何其他试图劫持 cookie 并进行恶意活动的代码。要通过 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 引擎会自动为您完成此操作,因此您不必记住它。
Active Record 类
<?php $this->db->get_where('subscribers_tbl',array ('status'=> active','email' => 'info@arjun.net.in')); ?>
使用活动记录,查询语法由每个数据库适配器生成。它还允许更安全的查询,因为值会自动转义。
隐藏 PHP 错误
在生产环境中,我们通常不想向用户显示任何错误消息。如果在开发环境中启用它以进行调试,那就好了。这些错误消息可能包含一些信息,出于安全原因,我们不应该向站点用户显示这些信息。
有三个 CodeIgniter 文件与错误有关。
PHP 错误报告级别
不同的环境需要不同级别的错误报告。默认情况下,开发将显示错误,但测试和实时将隐藏它们。CodeIgniter 根目录中有一个名为 index.php 的文件,用于此目的。如果我们将零作为参数传递给 error_reporting() 函数,那么将隐藏所有错误。
数据库错误
即使您已关闭 PHP 错误,MySQL 错误仍然打开。您可以在 application/config/database.php 中将其关闭。将 $db 数组中的 db_debug 选项设置为 FALSE,如下所示。
$db['default']['db_debug'] = FALSE;
错误日志
另一种方法是将错误传输到日志文件。因此,它不会显示给网站上的用户。简单来说,在 application/cofig/config.php 文件中将 $config 数组中的 log_threshold 值设置为 1,如下所示。
$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,在配置数组中使用键 'csrf_regenerate' 将重新生成令牌,如下所示。
$config['csrf_regenerate'] = TRUE;
您还可以通过在配置数组中使用键 'csrf_exclude_uris' 设置白名单,从而将 URL 列入 CSRF 保护白名单,如下所示。您也可以使用正则表达式。
$config['csrf_exclude_uris'] = array('api/person/add');
密码处理
许多开发人员不知道如何在 Web 应用程序中处理密码,这可能就是为什么许多黑客发现入侵系统如此容易的原因。处理密码时应牢记以下几点 −
请勿以纯文本格式存储密码。
始终对密码进行哈希处理。
请勿使用 Base64 或类似编码来存储密码。
请勿使用弱或损坏的哈希算法(如 MD5 或 SHA1)。仅使用强密码哈希算法(如 BCrypt),它在 PHP 自己的密码哈希函数中使用。
切勿以纯文本格式显示或发送密码。
请勿对用户的密码设置不必要的限制。