亚洲精品久久久中文字幕-亚洲精品久久片久久-亚洲精品久久青草-亚洲精品久久婷婷爱久久婷婷-亚洲精品久久午夜香蕉

您的位置:首頁技術(shù)文章
文章詳情頁

PHP安全-跨站請(qǐng)求偽造

瀏覽:72日期:2022-09-12 09:33:37
跨站請(qǐng)求偽造

跨站請(qǐng)求偽造(CSRF)是一種允許攻擊者通過受害者發(fā)送任意HTTP請(qǐng)求的一類攻擊方法。此處所指的受害者是一個(gè)不知情的同謀,所有的偽造請(qǐng)求都由他發(fā)起,而不是攻擊者。這樣,很你就很難確定哪些請(qǐng)求是屬于跨站請(qǐng)求偽造攻擊。事實(shí)上,如果沒有對(duì)跨站請(qǐng)求偽造攻擊進(jìn)行特意防范的話,你的應(yīng)用很有可能是有漏洞的。

請(qǐng)看下面一個(gè)簡單的應(yīng)用,它允許用戶購買鋼筆或鉛筆。界面上包含下面的表單:

CODE:

<form action='buy.php' method='POST'>

<p>

Item:

<select name='item'>

<option name='pen'>pen</option>

<option name='pencil'>pencil</option>

</select><br />

Quantity: <input type='text' name='quantity' /><br />

<input type='submit' value='Buy' />

</p>

</form>

一個(gè)攻擊者會(huì)首先使用你的應(yīng)用以收集一些基本信息。例如,攻擊者首先訪問表單并發(fā)現(xiàn)兩個(gè)表單元素item及quantity,他也同時(shí)知道了item的值會(huì)是鉛筆或是鋼筆。

下面的buy.php程序處理表單的提交信息:

CODE:

<?php

session_start();

$clean = array();

if (isset($_REQUEST[’item’] && isset($_REQUEST[’quantity’]))

{

/* Filter Input ($_REQUEST[’item’], $_REQUEST[’quantity’]) */

if (buy_item($clean[’item’], $clean[’quantity’]))

{

echo ’<p>Thanks for your purchase.</p>’;

}

else

{

echo ’<p>There was a problem with your order.</p>’;

}

}

?>

攻擊者會(huì)首先使用這個(gè)表單來觀察它的動(dòng)作。例如,在購買了一支鉛筆后,攻擊者知道了在購買成功后會(huì)出現(xiàn)感謝信息。注意到這一點(diǎn)后,攻擊者會(huì)嘗試通過訪問下面的URL以用GET方式提交數(shù)據(jù)是否能達(dá)到同樣的目的:

http://store.example.org/buy.php?item=pen&quantity=1

如果能成功的話,攻擊者現(xiàn)在就取得了當(dāng)合法用戶訪問時(shí),可以引發(fā)購買的URL格式。在這種情況下,進(jìn)行跨站請(qǐng)求偽造攻擊非常容易,因?yàn)楣粽咧灰l(fā)受害者訪問該URL即可。

雖然有多種發(fā)起跨站請(qǐng)求偽造攻擊的方式,但是使用嵌入資源如圖片的方式是最普遍的。為了理解這個(gè)攻擊的過程,首先有必要了解瀏覽器請(qǐng)求這些資源的方式。

當(dāng)你訪問http://www.google.com (圖 2-1),你的瀏覽器首先會(huì)請(qǐng)求這個(gè)URL所標(biāo)識(shí)的資源。你可以通過查看該頁的源文件(HTML)的方式來看到該請(qǐng)求的返回內(nèi)容。在瀏覽器解析了返回內(nèi)容后發(fā)現(xiàn)了Google的標(biāo)志圖片。這個(gè)圖片是以HTML的img標(biāo)簽表示的,該標(biāo)簽的src屬性表示了圖片的URL。瀏覽器于是再發(fā)出對(duì)該圖片的請(qǐng)求,以上這兩次請(qǐng)求間的不同點(diǎn)只是URL的不同。

圖 2-1. Google的首頁

A CSRF attack can use an img tag to leverage this behavior. Consider visiting a web site with the following image identified in the source:

根據(jù)上面的原理,跨站請(qǐng)求偽造攻擊可以通過img標(biāo)簽來實(shí)現(xiàn)。考慮一下如果訪問包括 下面的源代碼的網(wǎng)頁會(huì)發(fā)生什么情況:

<img src='http://store.example.org/buy.php?item=pencil&quantity=50' />

由于buy.php腳本使用$_REQUEST而不是$_POST,這樣每一個(gè)只要是登錄在store.example.org商店上的用戶就會(huì)通過請(qǐng)求該URL購買50支鉛筆。

跨站請(qǐng)求偽造攻擊的存在是不推薦使用$_REQUEST的原因之一。

完整的攻擊過程見圖2-2。

圖2-2. 通過圖片引發(fā)的跨站請(qǐng)求偽造攻擊

當(dāng)請(qǐng)求一個(gè)圖片時(shí),某些瀏覽器會(huì)改變請(qǐng)求頭部的Accept值以給圖片類型以一個(gè)更高的優(yōu)先權(quán)。需要采用保護(hù)措施以防止這種情況的發(fā)生。

你需要用幾個(gè)步驟來減輕跨站請(qǐng)求偽造攻擊的風(fēng)險(xiǎn)。一般的步驟包括使用POST方式而不是使用GET來提交表單,在處理表單提交時(shí)使用$_POST而不是$_REQUEST,同時(shí)需要在重要操作時(shí)進(jìn)行驗(yàn)證(越是方便,風(fēng)險(xiǎn)越大,你需要求得方便與風(fēng)險(xiǎn)之間的平衡)。

任何需要進(jìn)行操作的表單都要使用POST方式。在RFC 2616(HTTP/1.1傳送協(xié)議,譯注)的9.1.1小節(jié)中有一段描述:

“特別需要指出的是,習(xí)慣上GET與HEAD方式不應(yīng)該用于引發(fā)一個(gè)操作,而只是用于獲取信息。這些方式應(yīng)該被認(rèn)為是‘安全’的。客戶瀏覽器應(yīng)以特殊的方式,如POST,PUT或DELETE方式來使用戶意識(shí)到正在請(qǐng)求進(jìn)行的操作可能是不安全的。”

最重要的一點(diǎn)是你要做到能強(qiáng)制使用你自己的表單進(jìn)行提交。盡管用戶提交的數(shù)據(jù)看起來象是你表單的提交結(jié)果,但如果用戶并不是在最近調(diào)用的表單,這就比較可疑了。請(qǐng)看下面對(duì)前例應(yīng)用更改后的代碼:

CODE:

<?php

session_start();

$token = md5(uniqid(rand(), TRUE));

$_SESSION[’token’] = $token;

$_SESSION[’token_time’] = time();

?>

<form action='buy.php' method='POST'>

<input type='hidden' name='token' value='<?php echo $token; ?>' />

<p>

Item:

<select name='item'>

<option name='pen'>pen</option>

<option name='pencil'>pencil</option>

</select><br />

Quantity: <input type='text' name='quantity' /><br />

<input type='submit' value='Buy' />

</p>

</form>

通過這些簡單的修改,一個(gè)跨站請(qǐng)求偽造攻擊就必須包括一個(gè)合法的驗(yàn)證碼以完全模仿表單提交。由于驗(yàn)證碼的保存在用戶的session中的,攻擊者必須對(duì)每個(gè)受害者使用不同的驗(yàn)證碼。這樣就有效的限制了對(duì)一個(gè)用戶的任何攻擊,它要求攻擊者獲取另外一個(gè)用戶的合法驗(yàn)證碼。使用你自己的驗(yàn)證碼來偽造另外一個(gè)用戶的請(qǐng)求是無效的。

該驗(yàn)證碼可以簡單地通過一個(gè)條件表達(dá)式來進(jìn)行檢查:

CODE:

<?php

if (isset($_SESSION[’token’]) &&

$_POST[’token’] == $_SESSION[’token’])

{

/* Valid Token */

}

?>

你還能對(duì)驗(yàn)證碼加上一個(gè)有效時(shí)間限制,如5分鐘:

CODE:

<?php

$token_age = time() - $_SESSION[’token_time’];

if ($token_age <= 300)

{

/* Less than five minutes has passed. */

}

?>

通過在你的表單中包括驗(yàn)證碼,你事實(shí)上已經(jīng)消除了跨站請(qǐng)求偽造攻擊的風(fēng)險(xiǎn)。可以在任何需要執(zhí)行操作的任何表單中使用這個(gè)流程。

盡管我使用img標(biāo)簽描述了攻擊方法,但跨站請(qǐng)求偽造攻擊只是一個(gè)總稱,它是指所有攻擊者通過偽造他人的HTTP請(qǐng)求進(jìn)行攻擊的類型。已知的攻擊方法同時(shí)包括對(duì)GET和POST的攻擊,所以不要認(rèn)為只要嚴(yán)格地只使用POST方式就行了。

標(biāo)簽: PHP
相關(guān)文章:
主站蜘蛛池模板: 国产中文99视频在线观看 | 久久久久久久久a免费 | 国产成人99精品免费观看 | 中国美女黄色一级片 | 久久久久久综合对白国产 | 欧美成人免费全部观看在线看 | 国产无遮挡色视频免费视频 | 九九热伊人 | 国产欧美日韩免费一区二区 | 国产在线精品福利一区二区三区 | 手机看片一区 | 久久538| 视频一区二区免费 | 在线看片网站 | 黄色网久久 | 91av国产精品| 国产成人啪午夜精品网站男同 | 成年人快播 | 日本三级3本三级带黄 | 特级毛片免费 | 国产免费一区二区三区在线 | 亚洲午夜在线观看 | 国产欧美二区三区 | 成在线人免费视频一区二区三区 | 一级做a爰视频免费观看2019 | a男人的天堂久久a毛片 | 91免费在线视频 | 亚洲成人免费视频在线 | 国产精品亚洲欧美大片在线看 | a级毛片免费在线观看 | 亚洲在线免费 | 最近免费中文字幕大全免费版视频 | 国产免费怕怕免费视频观看 | 精品欧美 | 久久国产精品亚洲综合 | 国产成人精品综合 | 伊人网国产 | 免费在线亚洲 | 1000部国产成人免费视频 | 国产特一级毛片 | 国产综合亚洲欧美日韩一区二区 |