Kate Li (Taiwan)的部落格

首頁

如何編寫安全的yii應用程序

作者 zindani 時間 2020-03-20
all

警告:雖然本安全指南試圖非常完整,但並非詳盡無遺。如果安全性對您很重要,您應該檢查其他幾個參考資料。

一般原則

YII_DEBUG index.php error_reporting(E_ALL);

驗證用戶輸入

工作原理

如果用戶可以將其出生日期添加到其設定檔中,則必須確保他指定了一個有效日期。它不僅有助於防止類型錯誤,還提供更好的安全性。驗證輸入是否為“1951-01-25”格式將禁止試圖攻擊資料庫的SQL或網站的HTML的危險文字。驗證不是一個完美的保護,但它是一個極好的第一步。

用戶端驗證

用JavaScript驗證表單對安全性沒有任何影響!它應該只是一種增强介面和使用舒適性的方法。

HTML限制是相同的。例如,如果頁面的表單包含:~~~[html]12~~~

在PHP應用程序中接收到的數據可以包含任何內容,“id”、“date”和“list”欄位可以是大字串或數組。例如,用戶可以修改頁面的HTML原始程式碼,用文字區域替換這兩個欄位。

我能幫上什麼忙

Yii提供了一些特定的方法,可以代替或與常用的PHP方法一起使用,作為參攷,建議不使用Yii的方法主要是使用類型轉換和篩檢程式擴展。

通過模型驗證

大多數情况下,用戶輸入將被發送到模型。模型通常會擴展CFormModel或CActiveRecord。它們都派生自類CModel。該類有一個方法rules()來聲明驗證將如何處理。其他測試可以使用behaviors或beforeValidate()方法來完成。

CFormModel CActiveRecord rules() beforeValidate()

控制器:

<?php $model = new Comment; $model->attributes = $_POST['Comment']; if ($model->save()) { $this->redirect(array('view', 'id' => $model->id)); } else { }

模型:

<?php class Comment extends CActiveRecord { public function rules() { return array( array('parent', 'numerical', 'integerOnly' => true), array('strangedata', 'customValidateForStrangedata'), array('description', 'length', 'max' => 255), ); } protected function beforeValidate() if (!empty($this->description) && substr_count($this->description, '"') % 2 !== 0) { $this->addError("description", "Odd number of quotes"); } return parent::beforeValidate(); } protected function customValidateForStrangedata($attribute, $params) { $this->addError($attribute, "validation failed"); return false; }

您應該特別注意驗證。它保持數據的乾淨,這不僅對安全性有用。許多類型的規則已經聲明,您可以添加自己的規則。您還可以僅在給定的上下文中應用一些規則,例如,僅在修改記錄時驗證字段(“更新”方案),創建記錄時不會(“插入”場景)。

更進一步:
在控制器中驗證

一些輕量用戶輸入將由控制器直接處理。在這種情況下,您應該使用PHP類型轉換。對於您應該使用(int)的數位id,這種情況經常發生。

(int) <?php $model = Post::model()->findByPk($_GET['id']); $model = Post::model()->findByPk((int) $_GET['id']);

如果輸入不應為整數,則考慮進行模型驗證。

最後一個例子的邊注

事實上,即使在第一種情况下,Yii也會有所幫助。findByPk()方法使用錶架構來確保數值列只獲取數值條件。有關詳細資訊,請參閱SQL注入部分。但是,在某些情况下,這種自動保護可能不够。如果惡意用戶輸入查詢注釋/删除,會怎麼樣?id[]=2\&id[]=1?然後$_GET['id']將成為一個數組,如果這個id沒有被驗證,它可能會產生奇怪的效果,並可能導致安全性漏洞(但findByPk沒有)。

comment/delete?id[]=2\&id[]=1 $_GET['id'] findByPk

HTML輸出和XSS

如果應用程序在HTML頁面中列印未經篩選的用戶輸入,則它允許惡意用戶更改此頁面的顯示,並注入可由其他用戶運行的用戶端程式碼(通常為JavaScript)。這些XSS攻擊的一個典型用途是竊取用戶會話。

關於詞彙表的一個注意事項:為安全問題過濾數據通常稱為轉義。

這是一個視圖的摘錄。該頁只顯示一個用戶設定檔。~~~~[html]

<?php echo$user->名稱?>

其他未過濾和不安全輸出: