PHP安全-HTTP請求欺騙
一個(gè)比欺騙表單更高級和復(fù)雜的攻擊方式是HTTP請求欺騙。這給了攻擊者完全的控制權(quán)與靈活性,它進(jìn)一步證明了不能盲目信任用戶提交的任何數(shù)據(jù)。
為了演示這是如何進(jìn)行的,請看下面位于http://example.org/form.php的表單:
CODE:
<form action='process.php' method='POST'>
<p>Please select a color:
<select name='color'>
<option value='red'>Red</option>
<option value='green'>Green</option>
<option value='blue'>Blue</option>
</select><br />
<input type='submit' value='Select' /></p>
</form>
如果用戶選擇了Red并點(diǎn)擊了Select按鈕后,瀏覽器會(huì)發(fā)出下面的HTTP請求:
CODE:
POST /process.php HTTP/1.1
Host: example.org
User-Agent: Mozilla/5.0 (X11; U; Linux i686)
Referer: http://example.org/form.php
Content-Type: application/x-www-form-urlencoded
Content-Length: 9
color=red
.
看到大多數(shù)瀏覽器會(huì)包含一個(gè)來源的URL值,你可能會(huì)試圖使用$_SERVER[’HTTP_REFERER’]變量去防止欺騙。確實(shí),這可以用于對付利用標(biāo)準(zhǔn)瀏覽器發(fā)起的攻擊,但攻擊者是不會(huì)被這個(gè)小麻煩給擋住的。通過編輯HTTP請求的原始信息,攻擊者可以完全控制HTTP頭部的值,GET和POST的數(shù)據(jù),以及所有在HTTP請求的內(nèi)容。
攻擊者如何更改原始的HTTP請求?過程非常簡單。通過在大多數(shù)系統(tǒng)平臺上都提供的Telnet實(shí)用程序,你就可以通過連接網(wǎng)站服務(wù)器的偵聽端口(典型的端口為80)來與Web服務(wù)器直接通信。下面就是使用這個(gè)技巧請求http://example.org/頁面的例子:
CODE:
$ telnet example.org 80
Trying 192.0.34.166...
Connected to example.org (192.0.34.166).
Escape character is ’^]’.
GET / HTTP/1.1
Host: example.org
HTTP/1.1 200 OK
Date: Sat, 21 May 2005 12:34:56 GMT
Server: Apache/1.3.31 (Unix)
Accept-Ranges: bytes
Content-Length: 410
Connection: close
Content-Type: text/html
<html>
<head>
<title>Example Web Page</title>
</head>
<body>
<p>You have reached this web page by typing "example.com",
"example.net", or "example.org" into your web browser.</p>
<p>These domain names are reserved for use in documentation and are not
available for registration. See
<a >RFC 2606</a>, Section
3.</p>
</body>
</html>
Connection closed by foreign host.
$
上例中所顯示的請求是符合HTTP/1.1規(guī)范的最簡單的請求,這是因?yàn)镠ost信息是頭部信息中所必須有的。一旦你輸入了表示請求結(jié)束的連續(xù)兩個(gè)換行符,整個(gè)HTML的回應(yīng)即顯示在屏幕上。
Telnet實(shí)用程序不是與Web服務(wù)器直接通信的唯一方法,但它常常是最方便的。可是如果你用PHP編碼同樣的請求,你可以就可以實(shí)現(xiàn)自動(dòng)操作了。前面的請求可以用下面的PHP代碼實(shí)現(xiàn):
CODE:
<?php
$http_response = ’’;
$fp = fsockopen(’example.org’, 80);
fputs($fp, 'GET / HTTP/1.1rn');
fputs($fp, 'Host: example.orgrnrn');
while (!feof($fp))
{
$http_response .= fgets($fp, 128);
}
fclose($fp);
echo nl2br(htmlentities($http_response, ENT_QUOTES, ’UTF-8’));
?>
當(dāng)然,還有很多方法去達(dá)到上面的目的,但其要點(diǎn)是HTTP是一個(gè)廣為人知的標(biāo)準(zhǔn)協(xié)議,稍有經(jīng)驗(yàn)的攻擊者都會(huì)對它非常熟悉,并且對常見的安全漏洞的攻擊方法也很熟悉。
相對于欺騙表單,欺騙HTTP請求的做法并不多,對它不應(yīng)該關(guān)注。我講述這些技巧的原因是為了更好的演示一個(gè)攻擊者在向你的應(yīng)用輸入惡意信息時(shí)是如何地方便。這再次強(qiáng)調(diào)了過濾輸入的重要性和HTTP請求提供的任何信息都是不可信的這個(gè)事實(shí)。
相關(guān)文章:
1. XML在語音合成中的應(yīng)用2. HTTP協(xié)議常用的請求頭和響應(yīng)頭響應(yīng)詳解說明(學(xué)習(xí))3. ASP基礎(chǔ)入門第四篇(腳本變量、函數(shù)、過程和條件語句)4. .NET Framework各版本(.NET2.0 3.0 3.5 4.0)區(qū)別5. jscript與vbscript 操作XML元素屬性的代碼6. XML入門的常見問題(三)7. HTML5實(shí)戰(zhàn)與剖析之觸摸事件(touchstart、touchmove和touchend)8. php使用正則驗(yàn)證密碼字段的復(fù)雜強(qiáng)度原理詳細(xì)講解 原創(chuàng)9. 不要在HTML中濫用div10. ASP將數(shù)字轉(zhuǎn)中文數(shù)字(大寫金額)的函數(shù)
