2015-05-20 91 views
1

我有一個yii(php)項目,現在我想測試一下,如果它對於csrf攻擊是安全的。PHP/Yii項目中的CSRF

的代碼看起來是這樣的:

if (!Yii::app()->request->isAjaxRequest)){ 
    die("error"); 
} else { 
    // Do stuff 
} 

現在,如果我叫URL螢火蟲,它的工作原理(「做的東西」被執行)。

$.get("example.com/foo", function(data){ 
    // Works - no error 
}); 

可是,如果我叫完全相同的網址在瀏覽器中,我碰到一個「錯誤」,因爲Yii的應用::() - >請求 - > isAjaxRequest將是錯誤的。

意思,我的應用程序是針對CSRF攻擊的安全或者是有什麼辦法騙過「的Yii ::應用程序() - >請求 - > isAjaxRequest」,以爲它的一個真正的Ajax請求?

非常感謝!

回答

1

的代碼爲isAjaxRequest如下:

public function getIsAjaxRequest() 
{ 
    return isset($_SERVER['HTTP_X_REQUESTED_WITH']) && $_SERVER['HTTP_X_REQUESTED_WITH']==='XMLHttpRequest'; 
} 

這似乎是檢查該X-Requested-With HTTP標頭被設置。這實際上是a valid defence for CSRF,因爲它是一個不能跨域發送的頭,未經CORS的同意。是的,具有cURL的攻擊者可以通過設置此標頭來欺騙AJAX請求,但是它會在CSRF攻擊中無能爲力,因爲它們沒有用戶的cookie來發送它。

此方法的唯一缺點是您只能使用它來保護來自CSRF的AJAX請求,而不是正常的Web表單POST,因爲您無法使用此機制設置標頭。

如果您需要保護web表單POST,那麼您需要實施解決方案,例如Synchronizer Token Pattern。這是您生成加密安全令牌服務器端並將其與用戶會話關聯的位置。然後,您在每個表單POST上檢查此鍵,因爲您將其包含在隱藏表單字段中。這可防止CSRF,因爲攻擊者無法從頁面讀取令牌。

+0

非常感謝您的回覆。現在我明白了! – Tream

2

簡答:你誤解了CSRF的內容。

長答案:CSRF是關於保護POST請求,包括由AJAX製作的請求。這是通過創建一個隨機生成的令牌在頁面上呈現爲一個隱藏的表單字段來完成的,該表單字段將其添加到請求中,以便可以在處理表單的其餘部分之前對其進行驗證。如果您正在進行AJAX POST調用,則需要手動將CSRF令牌添加到請求中。當POST請求中缺少CSRF令牌時,框架將引發異常。

isAjaxRequest屬性只是檢查特定的http頭。你不應該依賴它,也就是說它不應該被用來保護訪問。

+0

謝謝您的回覆。如果應用程序在GET上更改數據,則也可以使用正常的GET執行CSRF攻擊。我發佈的示例中是否有任何攻擊媒介?如果我將url(例如)放在標記內並將其發送給登錄用戶,我會得到「錯誤」。有沒有辦法繞過這個檢查? - 謝謝!! – Tream

+0

你應該避免使用GET來修改任何東西,這就是整個問題。否則,您還應該爲這些請求請求CSRF令牌。 要回答你的問題,你必須修改請求頭。這需要一些工具。查看瀏覽器控制檯中的AJAX請求,查看標題現在的樣子。 – nineinchnick