表單與資料
在典型的PHP應用開發中,大多數的邏輯涉及資料處理任務,例如確認使用者是否成功登入,在購物車中加入商品及處理信用卡交易。
資料可能有無數的來源,做為一個有安全意識的開發人員,你需要簡單可靠地區分兩類資料:
l 已過濾資料
l 被汙染資料
所有你自己設定的資料可信資料,可以認為是已過濾資料。一個你自己設定的資料是任何的寫入程式碼資料,例如下面的email地址資料:
$email = 'chris@example.org';
上面的Email地址chris@example.org並不來自任何遠端資料源。顯而易見它是可信的。任何來自遠端資料源的資料都是輸入,而所有的輸入資料都是被汙染的,必須在要在使用前對其進行過濾。
被汙染資料是指所有不能保證合法的資料,例如使用者提交的表單,從郵件伺服器接收的郵件,及其它web應用中發送過來的xml文檔。在前一個例子中,$email是一個包含有已過濾資料的變數。資料是關鍵,而不是變數。變數只是資料的容器,它往往隨著程式的執行而為被汙染資料所覆蓋:
$email = $_POST['email'];
當然,這就是$email叫做變數的原因,如果你不希望資料進行變化,可以使用常量來代替:
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://www.php.cn/
正如第一章中所討論過的,register_globals可使確定一個變數如$email的來源變得十分困難。所有來自外部資料源的資料在被證明合法前都應該被認為被汙染的。
儘管一個使用者能用多種方式發送資料,大多數應用還是依據表單的提交結果進行最重要的操作。另外一個攻擊者只要通過操縱提交資料(你的應用進行操作的依據)即可危害,而表單向他們方便地開放了你的應用的設計方案及你需要使用的資料。這也是表單處理是所有Web應用安全問題中的首先要關心的問題的原因。
一個使用者可以通過三種方式您的應用傳輸資料:
l 通過URL(如GET資料方式)
l 通過一個請求的內容(如POST資料方式)
l 通過HTTP頭部資訊(如Cookie)
由於HTTP頭部資訊並不與表單處理直接相關,在本章中不作討論。通常,對GET與POST資料的懷疑可以推及到所有輸入,包括HTTP頭部資訊。
表單通過GET或POST請求方式傳送資料。當你建立了一個HTML表單,你需要在form標籤的method屬性中指定請求方式:
<form action="http://example.org/register.php"method="GET">
在前例中,請求方式被指定為GET,瀏覽器將通過URL的請求串部分傳輸資料,例如,考慮下面的表單:
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://www.php.cn/的頁面。該URL最簡單的合法HTTP/1.1請求資訊如下:
CODE:
GET /login.php?username=chris&password=mypassHTTP/1.1 Host: example.org
並不是必須要使用HTML表單來請求這個URL,實際上通過HTML表單的GET請求方式發送資料與使用者直接點選連結並沒有什麼不同。
記住如果你在GET方式提交的表單中的action中試圖使用請求串,它會被表單中的資料所取代。
而且,如果你指定了一個非法的請求方式,或者請求方式屬性未寫,瀏覽器則會預設以GET方式提交資料。
為說明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://www.php.cn/頁面。表單資料在請求的內部而不是一個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
現在你已看到使用者向你的應用提供資料的主要方式。在下面的小節中,我們將會討論攻擊者是如何利用你的表單和URL作為進入你的應用的缺口的。
以上就是PHP安全-表單與資料的內容,更多相關內容請關注topic.alibabacloud.com(www.php.cn)!