CodeIgniter 安全性


XSS是指跨站脚本。CodeIgniter带有XSS过滤安全功能。这个过滤器将防止任何恶意的JavaScript代码或任何其他试图劫持cookie和做恶意活动的代码。要通过XSS过滤器过滤数据,请使用xss_clean()方法,如下所示。

$data = $this->security->xss_clean($data);

只有在提交数据时才应使用此功能。可选的第二个布尔参数也可用于检查图像文件是否存在 XSS 攻击。这对于文件上传工具很有用。如果它的值为真,则表示图像是安全的,否则不安全。

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' => '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 "键来设置CSRF保护的白名单URL,如下所示,同时也支持使用正则表达式。

$config['csrf_exclude_uris'] = array('api/person/add');

密码处理


许多开发人员不知道如何在 Web 应用程序中处理密码,这可能就是为什么许多黑客发现入侵系统如此容易的原因。处理密码时应注意以下几点:

  • 不要用明文保存密码;

  • 始终散列你的密码;

  • 不要使用 Base64 或类似的编码来保存密码;

  • 不要使用弱或损坏的散列算法,如 MD5 或 SHA1。仅使用强密码散列算法,如 BCrypt,它用于 PHP 自己的密码散列函数;

  • 永远不要以明文显示或发送密码;

  • 不要对用户的密码设置不必要的限制。