PHP安全-表單與數(shù)據(jù)
在典型的PHP應(yīng)用開發(fā)中,大多數(shù)的邏輯涉及數(shù)據(jù)處理任務(wù),例如確認用戶是否成功登錄,在購物車中加入商品及處理信用卡交易。
數(shù)據(jù)可能有無數(shù)的來源,做為一個有安全意識的開發(fā)者,你需要簡單可靠地區(qū)分兩類數(shù)據(jù):
l已過濾數(shù)據(jù)
l被污染數(shù)據(jù)
所有你自己設(shè)定的數(shù)據(jù)可信數(shù)據(jù),可以認為是已過濾數(shù)據(jù)。一個你自己設(shè)定的數(shù)據(jù)是任何的硬編碼數(shù)據(jù),例如下面的email地址數(shù)據(jù):
$email = ’chris@example.org’;
上面的Email地址chris@example.org并不來自任何遠程數(shù)據(jù)源。顯而易見它是可信的。任何來自遠程數(shù)據(jù)源的數(shù)據(jù)都是輸入,而所有的輸入數(shù)據(jù)都是被污染的,必須在要在使用前對其進行過濾。
被污染數(shù)據(jù)是指所有不能保證合法的數(shù)據(jù),例如用戶提交的表單,從郵件服務(wù)器接收的郵件,及其它web應(yīng)用中發(fā)送過來的xml文檔。在前一個例子中,$email是一個包含有已過濾數(shù)據(jù)的變量。數(shù)據(jù)是關(guān)鍵,而不是變量。變量只是數(shù)據(jù)的容器,它往往隨著程序的執(zhí)行而為被污染數(shù)據(jù)所覆蓋:
$email = $_POST[’email’];
當然,這就是$email叫做變量的原因,如果你不希望數(shù)據(jù)進行變化,可以使用常量來代替:
CODE:
define(’EMAIL’, ’chris@example.org’);
如果用上面的語句進行定義,EMAIL在整個腳本運行中是一個值為chris@example.org的不變的常量,甚至在你把試圖把它重新賦值時也不會改變(通常是不小心)。例如,下面的代碼輸出為chris@example.org (試圖重定義一個常量會引起一個級別為Notice的報錯信息)。
CODE:
<?php
define(’EMAIL’, ’chris@example.org’);
define(’EMAIL’, ’rasmus@example.org’);
echo EMAIL;
?>
小提示
欲更多了解常量, 請訪問 http://php.net/constants.
正如第一章中所討論過的,register_globals可使確定一個變量如$email的來源變得十分困難。所有來自外部數(shù)據(jù)源的數(shù)據(jù)在被證明合法前都應(yīng)該被認為被污染的。
盡管一個用戶能用多種方式發(fā)送數(shù)據(jù),大多數(shù)應(yīng)用還是依據(jù)表單的提交結(jié)果進行最重要的操作。另外一個攻擊者只要通過操縱提交數(shù)據(jù)(你的應(yīng)用進行操作的依據(jù))即可危害,而表單向他們方便地開放了你的應(yīng)用的設(shè)計方案及你需要使用的數(shù)據(jù)。這也是表單處理是所有Web應(yīng)用安全問題中的首先要關(guān)心的問題的原因。
一個用戶可以通過三種方式您的應(yīng)用傳輸數(shù)據(jù):
l通過URL(如GET數(shù)據(jù)方式)
l通過一個請求的內(nèi)容(如POST數(shù)據(jù)方式)
l通過HTTP頭部信息(如Cookie)
由于HTTP頭部信息并不與表單處理直接相關(guān),在本章中不作討論。通常,對GET與POST數(shù)據(jù)的懷疑可以推及到所有輸入,包括HTTP頭部信息。
表單通過GET或POST請求方式傳送數(shù)據(jù)。當你建立了一個HTML表單,你需要在form標簽的method屬性中指定請求方式:
<form action='http://example.org/register.php' method='GET'>
在前例中,請求方式被指定為GET,瀏覽器將通過URL的請求串部分傳輸數(shù)據(jù),例如,考慮下面的表單:
CODE:
<form action='http://example.org/login.php' method='GET'>
<p>Username: <input type='text' name='username' /></p>
<p>Password: <input type='password' name='password' /></p>
<p><input type='submit' /></p>
</form>
如果我輸入了用戶名chris和密碼mypass,在表單提交后,我會到達URL為http://example.org/login.php?username=chris&password=mypass的頁面。該URL最簡單的合法HTTP/1.1請求信息如下:
CODE:
GET /login.php?username=chris&password=mypass HTTP/1.1
Host: example.org
并不是必須要使用HTML表單來請求這個URL,實際上通過HTML表單的GET請求方式發(fā)送數(shù)據(jù)與用戶直接點擊鏈接并沒有什么不同。
記住如果你在GET方式提交的表單中的action中試圖使用請求串,它會被表單中的數(shù)據(jù)所取代。
而且,如果你指定了一個非法的請求方式,或者請求方式屬性未寫,瀏覽器則會默認以GET方式提交數(shù)據(jù)。
為說明POST請求方式,只對上例進行簡單的更改,考慮把GET請求方式更改為POST的情況:
CODE:
<form action='http://example.org/login.php' method='POST'>
<p>Username: <input type='text' name='username' /></p>
<p>Password: <input type='password' name='password' /></p>
<p><input type='submit' /></p>
</form>
如果我再次指定用戶名chris和密碼mypass,在提交表單后,我會來到http://example.org/login.php頁面。表單數(shù)據(jù)在請求的內(nèi)部而不是一個URL的請求串。該方式最簡單的合法HTTP/1.1請求信息如下
CODE:
POST /login.php HTTP/1.1
Host: example.org
Content-Type: application/x-www-form-urlencoded
Content-Length: 30
username=chris&password=mypass
現(xiàn)在你已看到用戶向你的應(yīng)用提供數(shù)據(jù)的主要方式。在下面的小節(jié)中,我們將會討論攻擊者是如何利用你的表單和URL作為進入你的應(yīng)用的缺口的。
相關(guān)文章:
1. el-input無法輸入的問題和表單驗證失敗問題解決2. 不要在HTML中濫用div3. react腳手架配置代理的實現(xiàn)4. JavaScript中顏色模型的基礎(chǔ)知識與應(yīng)用詳解5. XML入門的常見問題(三)6. JavaScript快速實現(xiàn)一個顏色選擇器7. CSS3實例分享之多重背景的實現(xiàn)(Multiple backgrounds)8. 前端html+css實現(xiàn)動態(tài)生日快樂代碼9. Jquery使用原生AJAX方法請求數(shù)據(jù)10. React實現(xiàn)一個倒計時hook組件實戰(zhàn)示例
