开发学院

您的位置:首页>教程>正文

教程正文

CodeIgniter教程:安全

XSS防护

  XSS(cross site scripting)的意思是跨站点脚本。CodeIgniter自带XSS安全过滤。该过滤器将阻止任何恶意的JavaScript代码或任何其他试图劫持cookie并进行恶意活动的代码。要通过XSS过滤器过滤数据,请使用xss_clean()方法,如下所示。

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

  您应该仅在提交数据时使用此功能。可选的第二个布尔参数也可以用来检查文件的XSS攻击。这对文件上传工具很有用。如果它的值为真,则意味着图像是安全的,否则就不是.

SQL注入防护

  SQL注入是对数据库查询的攻击。在PHP中,我们使用mysql_real_escape_string()函数以及其他技术来防止这种情况,但是CodeIgniter提供了内置函数和相应的类库来防止这种情况。

  我们可以通过后面三种方式防止CodeIgniter中的SQL注入:查询转义,占位符以及ActiveRecord类.

查询转义

<?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引擎自动为您完成,因此您不必特意记住它。

ActiveRecord类

<?php
   $this->db->get_where('subscribers_tbl',array
      ('status'=> active','email' => 'info@arjun.net.in'));
?>

  使用ActiveRecord类,查询语法由数据库适配器生成。它还可以更安全的查询,因为值会自动转义。

隐藏PHP错误

  在生产环境中,我们通常不希望向用户显示任何错误消息。如果在开发环境中为了调试而启用它,这是很好的。这些错误消息可能包含一些信息,出于安全原因,我们不应该向站点用户显示这些信息。

  CodeIgniter框架有三个与错误相关的文件。

PHP错误报告级别

  不同的环境需要不同级别的错误报告。默认情况下,开发会显示错误,但是测试和运行会隐藏它们。CodeIgniter的根目录下有一个叫index.php的文件,就是为了这个目的。如果我们将0作为参数传递给error_reporting()函数,那么就会隐藏所有的错误。

数据库错误

  即使你已经关闭了PHP错误,MySQL错误仍然是打开的。您可以在application/config/database.php中关闭此选项。将$db数组中的db_debug选项设置为FALSE,如下所示。

$db['default']['db_debug'] = FALSE;

错误日志

  另一种方法是将错误转移到日志文件中。所以,它不会在网站上显示给用户。只需在application/config/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');

密码处理

许多开发人员不知道如何在网络应用程序中处理密码,这可能是许多黑客发现侵入系统如此容易的原因。在处理密码时,应该记住以下几点

  •   请勿以纯文本格式存储密码。

  •   请务必散列您的密码。

  •   请勿使用Base64或类似编码来存储密码。

  •   不要使用像MD5或SHA1这样的脆弱的散列算法。尽量使用强壮的散列算法,如在PHP自己的密码散列函数中使用的BCrypt。

  •   请勿以纯文本格式显示或发送密码。

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