安全性

Fuel 非常重視安全性,并引此採取了以下對策,來確保你 web 应用程序的安全:

預設情況下,Fuel 不在輸入時過濾 POST 和 GET 變数,并且在輸出编码所有事物。 當使用 URI 分段時,Fuel 也编码 URI,以防止討厭的驚喜,并轉義要進入資料庫的所有事物。

本頁面說明 Fuel 提供的一般安全性對策,Security 类別 記錄在 Classes 底下。你也会在該頁面找到配置 Fuel 安全性类別的詳情。

编码輸出

預設情況下,Fuel 傾向编码輸出多於過濾輸入。这背後的原因是雙重的。 無論你的資料來源,以及它是否被過濾,當它送到客戶端時,编码輸出将使之無害化。 这也意味著所有的輸入都儲存在原始和未改變的形式,所以無論发生什么事, 你始終可以存取原始資料。

这也意味著你就不会遇到麻煩當你需要資料是未改變的形式。 一个常見的例子是資料由 HTML 编輯器如 TinyMCE 或 ckeditor 產生,用於大量应用程序中給終端使用者编輯內容。 在这種情況下,你可能想要在这些輸入變数运行過濾 XSS, 以過濾掉任何可能已经產生的討厭驚喜,因为这是一个典型的例子, 你不想要在輸出時编码資料。

由於编码輸出只能发生在字串,你必須注意你想要傳遞給檢視的物件。 或確保你的物件包含一个 __toString() 方法让编码可以发生, 添加你的物件类別到在安全配置中的类別白名单(別忘了命名空間!),或傳遞它到檢視帶著 $encode 标誌設为 false。 你也可以使用 auto_encode 方法, 在每个檢視的基础上臨時停用自动编码輸出。

詳見檢視安全性段落以了解这如何为檢視實现。

CSRF 保護

跨網站請求偽造(Cross-site request forgery),也被稱为一鍵式攻擊或 session 欺騙,并縮寫为 CSRF,是一種惡意的網站漏洞利用, 從使用者信任的網站傳輸未授权的命令。不像跨網站指定码(XSS), 它利用使用者對特定網站的信任,CSRF 利用在使用者瀏覽器中網站的信任。 攻擊的原理是透過在頁面引入一个連結或指令码, 來存取使用者已知(或假設)已認證的網站。

例如,一个使用者 Bob 可能会瀏覽聊天論壇其他使用者,Mallory,发表的訊息。 假設 Mallory 擬訂一个 HTML 圖像元素,引用自 Bob 的銀行網站上(而不是一个圖像档案)的动作。 如果 Bob 的銀行保留他的認證資訊在 cookie,而且如果 cookie 沒過期,然後 Bob 的瀏覽器企圖使用他的 cookie 來載入会提交提款表格的圖像,從而批准交易而不須 Bob 的授权。 來源:wikipedia (English)

Fuel 提供你工具來保護你的表单對抗此类型的攻擊,透過在表单中引入一个安全符記, 它将可以在表单提交後被驗證,并将確保驗證時,被送交的表单是客戶端所請求。

CSRF 保護可以透過在应用程序 config/config.php 档案中的安全部份來配置。

要啟用 CRSF 保護,從添加符記到你的表单開始:

// 純 HTML
<input type="hidden" name="<?php echo \Config::get('security.csrf_token_key');?>" value="<?php echo \Security::fetch_token();?>" />

// 使用 Form 类別
echo \Form::csrf();

// 使用一个 Form 實例,也会添加一个驗證規則到表单欄位組
$form = \Form::forge();
$form->add_csrf();

要手动檢查是否被送交的表单是客戶端所請求:

// 檢查是否表单被提交
if ($_POST)
{
	// 檢查 CSRF 符記是否有效
	if ( ! \Security::check_token())
	{
		// CSRF 攻擊或過期的 CSRF 符記
	}
	else
	{
		// 符記有效,你可以处理表单輸入
	}
}

過濾 XSS

Fuel 提供過濾 XSS 使用 HTMLawed 函式庫, 一个非常快速且高度可配置的函式庫。預設情況下它運作在安全及平衡模式。

安全是指 HTML 受到限制以減少基於 HTML 程式码的指令码攻擊(例如 XSS)漏洞, 即使該程式码仍然是合法且符合 HTML 标准規格。當像指令码和物件的元素, 以及像 onmouseover 及 style 屬性在輸入文本中是被允許的,輸入者可以引入惡意的 HTML 程式码。

在平衡模式,HTMLawed 檢查并改正輸入來適當平衡标籤及合法元素內容 (即:任何巢狀元素應該是有效的,而且純文本可能只在允許元素的內容中被呈现)。

出於效能考量,建議你在个別輸入值使用 xss_clean 方法, 而不是做为一个通用輸入過濾。

過濾輸入

雖然預設不啟用,你可以配置 Fuel 來過濾所有輸入($_GET、$_POST 和 $_COOKIE)在每个頁面請求。 要做到这一點,在应用程序的 config/config.php 档案中配置要被用來過濾的函式或方法。

/**
 * Security settings
 */
'security' => array(
    'input_filter' => array(),
)

任何在 PHP 可呼叫的以及接受单一值做为參数的事物可用於過濾目的。 这包含 PHP 函式像 'htmlentities'、靜態类別方法像 '\\Security::xss_clean' 或甚至被定義为 array($object, 'method') 的物件方法。如果你使用一个物件方法,確保該物件在 Fuel 初始化前是可用的, 因为過濾輸入发生在請求過程中非常早期。

SQL 注入

SQL 注入是一種程式码注入技術,它利用了发生在应用程序的資料庫層(像查詢)的安全漏洞。 漏洞存在於未正確過濾使用者輸入的字串为轉義字元,嵌入在 SQL 語句, 或使用者輸入不是強型態,進而意外地执行。 这是一个更常見类型漏洞的實例,可能发生在一種程式語言指令码被嵌入其他語言時。 SQL 注入攻擊也被稱为 SQL 插入式攻擊。
此形式的 SQL 注入发生在使用者輸入沒有過濾轉義字元,并且傳進 SQL 語句。 这導致应用程序的終端用戶對資料庫执行語句的潛在操縱。 來源:wikipedia (English)

Fuel 透過轉義所有傳遞給 Database 类別方法的值來防止 SQL 注入。由於这发生在 Fuel 的中心 Query Builder 層級,所有使用 Query Builder 的程式码,包含 Fuel 的 ORM 套件,将自动使用轉義。