跨站腳本攻擊(簡稱 XSS),即web應用程式從使用者收集使用者資料。 攻擊者常常為易受攻擊的web應用注入JavaScript,VBScript,ActiveX,HTML或 Flash來迷惑訪客以收集訪客的資訊。 舉個例子,一個未經良好設計的論壇系統可能不經過檢查就顯示使用者所輸入的內容。 攻擊者可以在貼文內容中註入一段惡意的JavaScript程式碼。 這樣,當其他訪客在閱讀這個貼文的時候,這些JavaScript程式碼就可以在訪客的電腦上運作了。
一個防範XSS攻擊的最重要的措施之一就是:在顯示使用者輸入的內容之前進行內容檢查。 例如,你可以對內容中的HTML進行轉義處理。但在某些情況下這種方法就不可取了,因為這種方法禁用了所有的HTML標籤。
Yii整合了HTMLPurifier並且為開發者提供了一個很有用的元件CHtmlPurifier, 這個元件封裝了HTMLPurifier類別。它可以將透過有效的審查、安全性和白名單功能來把所審核的內容中的所有的惡意程式碼清除掉,並且確保過濾之後的內容過濾符合標準。
CHtmlPurifier元件可以當作一個widget或filter來使用。 當作為一個widget來使用的時候,CHtmlPurifier可以對在視圖中顯示的內容進行安全過濾。 以下是程式碼範例:
<?php $this->beginWidget('CHtmlPurifier'); ?> //...这里显示用户输入的内容... <?php $this->endWidget(); ?>
跨站請求惡意瀏覽器在網頁RFRF)時候,讓使用者的瀏覽器向一個受信任的網站發動攻擊者指定的請求。 舉個例子,一個惡意網站有一個圖片,這個圖片的src
地址指向一個銀行網站:http://www.php.cn/
。 如果使用者在登陸銀行的網站之後造訪了這個惡意網頁,那麼使用者的瀏覽器會向銀行網站發送一個指令,這個指令的內容可能是「向攻擊者的帳號轉帳10,000元」。 跨站攻擊方式利用使用者信任的某個特定網站,而CSRF攻擊正相反,它利用使用者在某個網站中的特定使用者身分。
要防範CSRF攻擊,必須謹記一條:GET
請求只允許檢索資料而不能修改伺服器上的任何資料。 而POST
請求應當含有一些可以被伺服器識別的隨機數值,用來確保表單資料的來源和運行結果發送的去向是相同的。
Yii實作了一個CSRF防範機制,用來幫助防範基於POST
的攻擊。 這個機制的核心就是在cookie中設定一個隨機數據,然後把它同表單提交的POST
數據中的相應值進行比較。
預設情況下,CSRF防範是禁用的。如果你要啟用它,可以編輯應用程式設定 中的元件中的CHttpRequest部分。
程式碼範例:
return array( 'components'=>array( 'request'=>array( 'enableCsrfValidation'=>true, ), ), );
要顯示一個表單,請使用CHtml::form而不要自己寫HTML程式碼。因為CHtml::form可以自動地在表單中嵌入一個隱藏項,這個隱藏項儲存著驗證所需的隨機數據,這些數據可在表單提交的時候發送到伺服器進行驗證。
保護cookie免受攻擊是非常重要的。因為session ID通常儲存在Cookie中。 如果攻擊者竊取到了一個有效的session ID,他就可以使用這個session ID對應的session資訊。
這裡有幾個防範對策:
您可以使用SSL來產生一個安全通道,並且只透過HTTPS連接來傳送驗證cookie。這樣攻擊者是無法解密所傳送的cookie的。
設定cookie的過期時間,對所有的cookie和seesion令牌也這樣做。這樣可以減少被攻擊的機會。
防範跨站代碼攻擊,因為它可以在用戶的瀏覽器觸發任意代碼,這些代碼可能會洩露用戶的cookie。
在cookie有變動的時候驗證cookie的內容。
Yii實作了一個cookie驗證機制,可以防止cookie被修改。啟用之後可以對cookie的值進行HMAC檢查。
Cookie驗證在預設情況下是禁用的。如果你要啟用它,可以編輯應用程式設定 中的元件中的CHttpRequest部分。
程式碼範例:
return array( 'components'=>array( 'request'=>array( 'enableCookieValidation'=>true, ), ), );
一定要使用經過Yii驗證過的cookie資料。使用Yii內建的cookies組件來進行cookie操作,不要使用$_COOKIES
。
// 检索一个名为$name的cookie值 $cookie=Yii::app()->request->cookies[$name]; $value=$cookie->value; ...... // 设置一个cookie $cookie=new CHttpCookie($name,$value); Yii::app()->request->cookies[$name]=$cookie;
以上就是Yii框架官方指南系列51——專題:安全措施 (Security)的內容,更多相關內容請關注PHP中文網(www.php.cn)!