章 30. 會員送出的資料

很多 PHP 程式所存在的重大弱點並不是 PHP 語系本身的問題,而是寫程式者的安全意識不高而導致的。因此,必須時時注意每一段代碼可能存在的問題,去發現非正確資料送出時可能造成的影響。

例子 30-1. 危險的變量用法

<?php
// 從會員目錄中移除一個檔案,或是……能移除更多的東西?
unlink ($evil_var);

// 記錄會員的登入,或是……能否在 /etc/passwd 增加資料?
fwrite ($fp$evil_var);

// 執行一些普通的指令,或是……可以執行 rm -rf * ?
system ($evil_var);
exec ($evil_var);

?>
必須時常留意你的代碼,以確保每一個從用戶端送出的變量都經由適當的檢查,然後問自己以下一些問題:

  • 此腳本是否只能影響所預期的檔案?

  • 非標準的資料被送出後能否產生作用?

  • 此腳本能用於計劃外的用途嗎?

  • 此腳本能否和其它腳本結合起來做壞事?

  • 是否所有的事務都被充分記錄了?

在寫代碼的時候問自己這些問題,否則以後可能要為了增加安全性而重寫代碼了。注意了這些問題的話,也許還不完全能保證系統的安全,但是至少可以提高安全性。

還可以考慮關閉 register_globals,magic_quotes 或是其它使寫程式更方便但會使某個變量的合法性,來源和其值被搞亂的設定。在開發時,可以使用 error_reporting(E_ALL) 模式說明檢查變量使用前是否有被檢查或被起始化,這樣就可以防止某些非標準的資料的撓亂了。