2016-08-16 160 views
0

好吧,仍然試圖環繞它們是什麼我的頭,並且需要..believe我我讀過它豐富和認爲我理解,但我可能不...需要CSRF令牌嗎?

最接近我可以得到的是,他們是絕對當您在您的網站上以任何形式登錄頁面時需要...

我的問題是當您有任何基本聯繫表單和/或填寫表格理由......你需要這些頁面的CSRF令牌嗎?

+0

是 - 因爲它們有助於防止大規模虐待接觸形式,論壇等都是偉大的目標,垃圾郵件發送者有這麼一個CSRF令牌檢查機制是到了好處 – RamRaider

回答

1

CSRF令牌不「絕對需要」(如,表格將沒有他們的工作),但他們是一個非常好主意每當從一個網頁提交的任何數據,到另一個網頁/腳本。 信任有任何數據page 2收到來自page 1(閱讀說明如下),是非常小的方式。隔離中的每個頁面都不知道用戶之前在哪個頁面上,甚至可以輕鬆地由瀏覽器用戶操縱那些旨在暗示此事的內容,如$_SERVER['HTTP_REFERER']

CSRF令牌是頁面到頁面的關鍵字,它爲接收頁面提供了更高級別的信任,該訪問者來自預期的發送者頁面。部署的屬性,他們也可以防止數據重複,這也是一個巨大的獎金,並減少不道德的垃圾郵件和浪費的CPU週期。該CSRF令牌可用於


一個方面:

假設你有一個頁面上的表單,該頁面被稱爲page1.php和形式爲send contact email,其中表格填寫然後發送,它發送到的頁面(page2.php)可以構建,然後發送一封聯繫電子郵件給目標收件人。

由此下一步是有人可以讀取page1.php表單的源代碼。這非常簡單,並告訴人們存在哪些$_POST值以及表單發送到的目的地的位置(page2.php)。

一個簡單的用戶將加載您的page1.php,花10分鐘寫一封措辭謹慎的電子郵件,然後按SEND按鈕並提交表單。關閉表單到page2.php,將其詳細信息放入發送到[email protected]的電子郵件中。現在

,如果有人從page1.php取得源代碼,他們可以使用一個簡單的PHP腳本(或任何其他代碼)處理髮送成百上千的垃圾郵件形式page2.php,他們每個人用正確的信息生成和發送發送電子郵件,這可以用於各種各樣的進程,他們可以從許多其他網站,互聯網的任何其他部分,甚至從整個僵屍網絡發送表單,如果他們選擇 - page2.php將被一秒鐘的許多請求淹沒,電子郵件的收件人將有一個郵箱擠滿了無用的表單生成的消息。

輸入CSRF令牌

甲CSRF令牌是一個唯一的密鑰,其上page1.php保存在表格中,在生成和通常(但不排他地)使用(可能隨機地)生成$_SESSION值,以使得當表格被提交,並且$_POST數據被髮送到page2.php這是一個相當可靠的檢查,表單正在提交從同一個網站。因此,不要讓整個僵屍網絡向page2.php提交數據並導致很多電子郵件,數據不會被採取行動,而只會從page2.php腳本中運行同一網站提交的頁面。

Alternaitvely如果上述情況發生,您還可以跟蹤不良提交來自哪裏,並使用其他進程/腳本來阻止/禁止各種其他僵屍網絡/服務器向您的服務器提交數據。


上圖是保險和過程控制的一種形式,以便你有通過CSRF傳遞page2.php強烈堅固可靠的數據:

if ($_SESSION['key'] === $_POST['key']){ 
    unset($_SESSION['key']); ///prevent repetition 
     ... 
     send email 
    } 

(例如)。

if聲明僅與從可靠來源(page1.php)可靠提交的表單數據一起運行。因此,請預防其他服務器捎帶在您的腳本上,防止在DOS操作系統上出現惡意攻擊,從而使您的page2.php以及其他各種積極因素知道page1.php發送的數據正在page2.php上使用。

另一方面CSRF令牌用於

參見上面的代碼我取消設置$_SESSION CSRF值?這意味着如果你按F5或者刷新page2.php訪問(在瀏覽器或其他地方輸入)它不會重新提交兩次真正的數據。這可以幫助防止人們填寫表單一次,然後不斷地在論壇上重新提交它,就像一個憤怒的少年()POST數據總是保存在頁面HTTP標題,並在頁面被調用時重新提交,所以在PHP中取消設置$_POST數據是毫無意義的。)。


CSRF是一種安全機制, - 當CSRF令牌測試通過 - 意味着你可以可靠地判斷數據發送到一個腳本在您的服務器從一個有效的來了,預期的來源。

+0

哇能不造成傷害。非常感謝你花時間寫出這種深思熟慮的答案。這是非常讚賞。如果你不介意=)...如果我的表單,即「page1.php」直接進入「PHPMailer」頁面而不是「page2.php」 '......這是否改變了檢查它是從同一個網站提交的事實的需要?順便說一句,我喜歡你在論壇上憤怒的少年的有趣比喻... =)....但是誰說他們只是青少年?=) – user273072545345

+0

'page2.php'與PHPMailer頁面相同,它是一個可以做你想做的任何事情的結果頁面,'page2.php'可以是任何頁面,做任何事情。它不需要是一個輸出HTML頁面,只是一個處理由'page1.php'發送給它的數據的頁面。在向PHPMailer對象發送任何內容之前,您需要運行'if'語句來檢查發送數據的有效性。 – Martin