在典型的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:
小技巧
# 欲了解更多常數, 請造訪http://www.php.cn /
如第一章所討論過的,register_globals可使確定一個變數如$email的來源變得十分困難。所有來自外部資料來源的資料在被證明合法之前都應該被認為是被污染的。
儘管一個使用者能用多種方式傳送數據,大多數應用程式還是依據表單的提交結果進行最重要的操作。另外一個攻擊者只要透過操縱提交資料(你的應用程式進行操作的依據)即可危害,而表單向他們方便地開放了你的應用程式的設計方案及你需要使用的資料。這也是表單處理是所有網路應用程式安全問題中的首先要關心的問題的原因。
一個使用者可以透過三種方式您的應用程式傳輸資料:
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=mypass HTTP/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安全-表单与数据的内容,更多相关内容请关注PHP中文网(www.php.cn)!