当前位置: 首页 > 文档资料 > FuelPHP 中文文档 >

安全性 - 一般

优质
小牛编辑
132浏览
2023-12-01

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 套件,将自动使用转义。