Web開(kāi)發(fā)中,CSFT是一個(gè)非常重要的安全概念。CSFT即Cross-site Request Forgery的縮寫(xiě),其中Cross-site意為跨站,在網(wǎng)絡(luò)中可以理解為攻擊者偽造一個(gè)請(qǐng)求,讓一個(gè)已經(jīng)登錄的用戶(hù)去執(zhí)行它。例如,一個(gè)電商網(wǎng)站有一個(gè)修改用戶(hù)密碼的操作,攻擊者就可能偽造一條包含修改密碼的請(qǐng)求,然后通過(guò)郵件或者其他方式誘導(dǎo)用戶(hù)去點(diǎn)擊這個(gè)請(qǐng)求。
PHP作為一種非常流行的Web開(kāi)發(fā)語(yǔ)言,理所當(dāng)然地有著很好的CSFT保護(hù)機(jī)制。雖然PHP在最初的設(shè)計(jì)中沒(méi)有直接支持CSFT攻擊的預(yù)防,但是隨著Web技術(shù)的發(fā)展和安全意識(shí)的普及,PHP社區(qū)也在不斷地開(kāi)發(fā)和推廣更好的CSFT防范方案。
<form action="example.php" method="post">
<input name="name" value="Jane">
<input type="submit" value="Submit">
</form>
在PHP中,第一個(gè)推薦的方案是使用Token(或者CSRF Token,CSRF Prevention Token)作為CSFT攻擊的防范手段。具體來(lái)說(shuō),一個(gè)Token是一串綁定到用戶(hù)認(rèn)證信息上的隨機(jī)字符串,在一個(gè)表單中設(shè)置Token可以達(dá)到防范CSFT攻擊的目的。
<form action="example.php" method="post">
<input type="hidden" name="csrf_token" value="xxxxxx">
<input name="name" value="Jane">
<input type="submit" value="Submit">
</form>
在這個(gè)例子中,用戶(hù)在提交表單時(shí)會(huì)自動(dòng)添加Token作為表單數(shù)據(jù)的一部分。后端的PHP代碼就可以檢驗(yàn)Token并且防范CSFT攻擊。
除了Token以外,PHP還有其他的一些防范方案。例如POST-Redirect-GET(PRG)也可以被用于防范CSFT攻擊。在這個(gè)模式中,一個(gè)POST請(qǐng)求會(huì)隨后被一個(gè)重定向指令GET取代。由于GET請(qǐng)求不會(huì)對(duì)服務(wù)器上的數(shù)據(jù)產(chǎn)生任何影響,所以攻擊者就無(wú)法偽造出一個(gè)危險(xiǎn)的請(qǐng)求。
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
// Validate the request and redirect if success
header('Location: /success');
exit;
}
無(wú)論是使用Token還是PRG,PHP的CSFT預(yù)防能力都差不多。但是考慮到在現(xiàn)實(shí)中CSFT攻擊可能會(huì)被結(jié)合其他漏洞繞過(guò),就應(yīng)該盡量使用這兩種防范方案的組合。例如,添加一個(gè)Token并且使用PRG來(lái)讓CSFT攻擊變得更加困難。
總結(jié)一下,PHP中可以非常簡(jiǎn)單地防范CSFT攻擊。PHP社區(qū)中已經(jīng)有了很好的防范方案,只需要開(kāi)發(fā)者們?nèi)ズ侠硎褂盟鼈兗纯伞?/p>