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' => 'info@arjun.net.in'));
?>

使用活動記錄,查詢語法由每個資料庫介面卡生成。它還允許更安全的查詢,因為值會自動轉義。

隱藏 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。

  • 切勿以純文字格式顯示或傳送密碼。

  • 不要對使用者的密碼設定不必要的限制。

廣告