W3Cschool
恭喜您成為首批注冊用戶
獲得88經(jīng)驗值獎勵
注意:本節(jié)內(nèi)容正在開發(fā)中。
好的安全策略對任何應用的健康和成功極其重要。不幸的是,許多開發(fā)者在遇到安全問題時,因為認識不夠或者實現(xiàn)起來比較麻煩,都不是很注意細節(jié)。為了讓你的 Yii 應用程序盡可能的安全, Yii 囊括了一些卓越并簡單易用的安全特性。
大部分開發(fā)者知道密碼不能以明文形式存儲,但是許多開發(fā)者仍認為使用?md5
?或者?sha1
?來哈?;艽a是安全的。一度,使用上述的哈希算法是足夠安全的,但是,現(xiàn)代硬件的發(fā)展使得短時間內(nèi)暴力破解上述算法生成的哈希串成為可能。
為了即使在最糟糕的情況下(你的應用程序被破解了)也能給用戶密碼提供增強的安全性,你需要使用一個能夠?qū)贡┝ζ平夤舻墓K惴āD壳白詈玫倪x擇是?bcrypt
。在 PHP 中,你可以通過?crypt 函數(shù)?生成?bcrypt
?哈希。Yii 提供了兩個幫助函數(shù)以讓使用crypt
?來進行安全的哈希密碼生成和驗證更加容易。
當一個用戶為第一次使用,提供了一個密碼時(比如:注冊時),密碼就需要被哈希化。
$hash = Yii::$app->getSecurity()->generatePasswordHash($password);
哈希串可以被關聯(lián)到對應的模型屬性,這樣,它可以被存儲到數(shù)據(jù)庫中以備將來使用。
當一個用戶嘗試登錄時,表單提交的密碼需要使用之前的存儲的哈希串來驗證:
if (Yii::$app->getSecurity()->validatePassword($password, $hash)) {
// all good, logging user in
} else {
// wrong password
}
偽隨機數(shù)據(jù)在許多場景下都非常有用。比如當通過郵件重置密碼時,你需要生成一個令牌,將其保存到數(shù)據(jù)庫中,并通過郵件發(fā)送到終端用戶那里以讓其證明其對某個賬號的所有權。這個令牌的唯一性和難猜解性非常重要,否則,就存在攻擊者猜解令牌,并重置用戶的密碼的可能性。
Yii security helper makes generating pseudorandom data simple: Yii 安全助手使得生成偽隨機數(shù)據(jù)非常簡單:
$key = Yii::$app->getSecurity()->generateRandomString();
注意,你需要安裝有?openssl
?擴展,以生成密碼的安全隨機數(shù)據(jù)。
Yii 提供了方便的幫助函數(shù)來讓你用一個安全秘鑰來加密解密數(shù)據(jù)。數(shù)據(jù)通過加密函數(shù)進行傳輸,這樣只有擁有安全秘鑰的人才能解密。比如,我們需要存儲一些信息到我們的數(shù)據(jù)庫中,但是,我們需要保證只有擁有安全秘鑰的人才能看到它(即使應用的數(shù)據(jù)庫泄露)
// $data and $secretKey are obtained from the form
$encryptedData = Yii::$app->getSecurity()->encryptByPassword($data, $secretKey);
// store $encryptedData to database
隨后,當用戶需要讀取數(shù)據(jù)時:
// $secretKey is obtained from user input, $encryptedData is from the database
$data = Yii::$app->getSecurity()->decryptByPassword($encryptedData, $secretKey);
有時,你需要驗證你的數(shù)據(jù)沒有第三方篡改或者使用某種方式破壞了。Yii 通過兩個幫助函數(shù),提供了一個簡單的方式來進行數(shù)據(jù)的完整性校驗。
首先,將由安全秘鑰和數(shù)據(jù)生成的哈希串前綴到數(shù)據(jù)上。
// $secretKey our application or user secret, $genuineData obtained from a reliable source
$data = Yii::$app->getSecurity()->hashData($genuineData, $secretKey);
驗證數(shù)據(jù)完整性是否被破壞了。
// $secretKey our application or user secret, $data obtained from an unreliable source
$data = Yii::$app->getSecurity()->validateData($data, $secretKey);
todo: XSS 防范, CSRF 防范, Cookie 保護相關的內(nèi)容,參考 1.1 文檔
你同樣可以給控制器或者 action 設置它的?enableCsrfValidation
?屬性來單獨禁用 CSRF 驗證。
namespace app\controllers;
use yii\web\Controller;
class SiteController extends Controller
{
public $enableCsrfValidation = false;
public function actionIndex()
{
// CSRF validation will not be applied to this and other actions
}
}
為了給某個定制的 action 關閉 CSRF 驗證,你可以:
namespace app\controllers;
use yii\web\Controller;
class SiteController extends Controller
{
public function beforeAction($action)
{
// ...set `$this->enableCsrfValidation` here based on some conditions...
// call parent method that will check CSRF if such property is true.
return parent::beforeAction($action);
}
}
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網(wǎng)安備35020302033924號
違法和不良信息舉報電話:173-0602-2364|舉報郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: