首頁 >後端開發 >PHP問題 >php如何防止csrf攻擊

php如何防止csrf攻擊

(*-*)浩
(*-*)浩原創
2019-09-20 13:51:135877瀏覽

CSRF概念:CSRF跨站點請求偽造(Cross—Site Request Forgery),跟XSS攻擊一樣,存在巨大的危害性,你可以這樣來理解:

php如何防止csrf攻擊

#攻擊者盜用了你的身份,以你的名義發送惡意請求,對伺服器來說這個請求是完全合法的,但是卻完成了攻擊者所期望的一個操作,比如以你的名義發送郵件、發送訊息,盜取你的帳號,新增系統管理員,甚至於購買商品、虛擬貨幣轉帳等。 (推薦學習:PHP程式設計從入門到精通

如:其中Web A為存在CSRF漏洞的網站,Web B為攻擊者建構的惡意網站,User C為Web A網站的合法使用者。

防禦CSRF攻擊:

目前防禦CSRF 攻擊主要有三種策略:驗證HTTP Referer 欄位;在請求位址中加入token 並驗證;在HTTP頭中自訂屬性並驗證。

(1)驗證 HTTP Referer 欄位

根據 HTTP 協議,在 HTTP 頭中有一個欄位叫 Referer,它記錄了該 HTTP 請求的來源位址。在通常情況下,造訪安全受限頁面的請求來自於同一個網站,例如需要造訪http://bank.example/withdraw?account=bob&amount=1000000&for=Mallory,使用者必須先登陸bank.example,然後透過點擊頁面上的按鈕來觸發轉帳事件。

這時,該轉帳請求的 Referer 值就會是轉帳按鈕所在的頁面的 URL,通常是以 bank.example 網域開頭的位址。而如果駭客要對銀行網站實施 CSRF 攻擊,他只能在他自己的網站建構請求,當使用者透過駭客的網站發送請求到銀行時,該請求的 Referer 是指向駭客自己的網站。

因此,要防禦CSRF 攻擊,銀行網站只需要對於每一個轉帳請求驗證其Referer 值,如果是以bank.example 開頭的域名,則說明該請求是來自銀行網站自己的請求,是合法的。如果 Referer 是其他網站的話,則有可能是駭客的 CSRF 攻擊,拒絕該請求。

(2)在請求位址中新增token 並驗證

CSRF 攻擊之所以能夠成功,是因為駭客可以完全偽造使用者的請求,該請求中所有的使用者驗證資訊都是存在於cookie 中,因此駭客可以在不知道這些驗證資訊的情況下直接利用使用者自己的cookie 來通過安全驗證。

要抵禦 CSRF,關鍵在於在請求中放入駭客所不能偽造的訊息,並且該資訊不存在於 cookie 之中。

可以在HTTP 請求中以參數的形式加入一個隨機產生的token,並在伺服器端建立一個攔截器來驗證這個token,如果請求中沒有token 或者token 內容不正確,則認為可能是CSRF 攻擊而拒絕該請求。

(3)在HTTP 頭中自訂屬性並驗證

#這種方法也是使用token 並進行驗證,和上一個方法不同的是,這裡並不是把token 以參數的形式置於HTTP 請求之中,而是把它放到HTTP 頭中自訂的屬性裡。透過 XMLHttpRequest 這個類,可以一次給所有該類請求加上 csrftoken 這個 HTTP 頭屬性,並把 token 值放入其中。這樣解決了上種方法在請求中加入 token 的不便,同時,透過 XMLHttpRequest 請求的位址不會被記錄到瀏覽器的位址欄,也不用擔心 token 會透過 Referer 洩漏到其他網站中去。

以上是php如何防止csrf攻擊的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn