1. 程式人生 > >PHP防止站外表單跨站提交的幾種辦法詳解

PHP防止站外表單跨站提交的幾種辦法詳解

2、加密令牌:

很多CMS會用到這個方式,就是生成一個隨機串,比如VEPHP , 然後隨表單生成一個隱藏域<input type="hidden" value="vephp" name="chk" /> 並把這個值儲存到伺服器的SESSION上。

等到使用者提交後,檢查這個表單值和SESSION對比,不符就阻止。

不過,這個方式如果使用者多的話,會造成大量的SESSION,消耗伺服器資源。不推薦。一種優化的方式是把這個口令放在CACHE系統中,但是因為快取會不定時清除,所以也有問題。

3、加密方式:

推薦這種方式:分為單向加密和可逆向加密。

就是生成一個隨機且變換頻繁加密字串(可逆和不可逆)。跟方式2一樣放在表單中。等到表單提交後檢查。

這個隨機字串如果和當前使用者身份相關聯的話,那麼攻擊者偽造請求會比較麻煩。

對付偽造跨站請求的辦法是在表單里加入一個叫.crumb的隨機串;而facebook也有類似的解決辦法,它的表單裡常常會有post_form_id和fb_dtsg。這種方式中,字串的有效時間要設定好,太短了使用者體驗不好,比如好不容易寫好文章提交,令牌卻到期了。不得不重寫,這很糟糕的體驗。因此,TTL過期時間應可設定。

下面是一個網上的不可逆的驗證方式,值的推薦:


使用:

在表單中插入一個隱藏的隨機串crumb,其中,$uid可以是會員的ID,這樣就有獨立性。


在PHP伺服器接收端,這樣檢驗。預設下這個字串的有效期是7200秒。


上面這種是不可逆的加密,

有時,我們還希望在表單中加入私密資料,跟隨使用者表單加密串一直生成,在前端不被使用者看到,這樣就可以用到可解密的函式,生成的字串在PHP端解密,起到2個作用:

1、得到私密資料。

2、驗證表單來源的合法性。