這篇文章跟大家介紹一下PHP操作使用者提交內容時需要注意的危險函數。有一定的參考價值,有需要的朋友可以參考一下,希望對大家有幫助。
對於我們的程式開發來說,使用者的輸入是解決安全性問題的第一大入口。為什麼這麼說呢?不管是SQL注入、XSS還是檔案上傳漏洞,全部都跟使用者提交的輸入參數有關。今天我們不講這些問題,我們主要探討下面對使用者的輸入,有一些危險的函數在未經驗證的情況下是不能直接使用這些函數來進行操作的,例如:
include($g);
假設這個$g 是使用者提交的內容,我們在未經驗證的情況下直接使用這個參數來包含文件,我們傳遞的參數為?g=/etc/passwd ,那麼伺服器上所有的使用者帳號資訊就很可能就直接洩漏了。
另外,一些執行 shell 指令的函數還是極度危險的。
echo system($g);
當我們傳遞的參數是 ?g=ls -la / 時,同樣的伺服器目錄也展示了出來,這也僅僅是顯示目錄結構,如果使用其它更恐怖的命令後果將不堪設想。
同理,我們經常會根據一些id或指定的文件名來操作文件,特別是在刪除文件的時候,如果未加判斷,那麼也可能直接去刪除某些非常重要的文件。
unlink('./' . $g);
我們繼續將 $g 建構成 ?g=../../../xxxx ,如果在權限允許的情況下,就可以刪除各種系統檔案。
對這些內容,其實在 PHP 的官方手冊中就已經給了一些很好的建議,我們不妨來直接看看 PHP 手冊中是如何說的。
許多 PHP 程式所存在的重大弱點並不是 PHP 語言本身的問題,而是程式設計者的安全意識不高而導致的。因此,必須時時注意每一段程式碼可能存在的問題,去發現非正確資料提交時可能造成的影響。
必須時常留意你的程式碼,以確保每一個從客戶端提交的變數都經過適當的檢查,然後問自己以下一些問題:
此腳本是否只能影響所預期的文件?
非正常的資料提交後能否產生作用?
此腳本能用於計劃外的用途嗎?
此腳本能否和其它腳本結合起來做壞事?
是否所有的事務都被充分記錄了?
也可以考慮關閉 register_globals,magic_quotes 或者其它使程式設計更方便但會使某個變數的合法性,來源和其值被搞亂的設定。在開發時,可以使用 error_reporting(E_ALL) 模式來幫助檢查變數使用前是否有被檢查或被初始化,這樣就可以防止某些非正常的資料的撓亂了。
其實,只要能遵守這些建議,大部分的安全問題都能解決。還是那句話,不能相信使用者的任何輸出,在測試的時候請做好各種驗證,包括但不限於邊界值、特殊符號、特殊指令、越界值、目錄權限等。在非必要的情況下不要使用使用者的輸入作為包含文件、執行腳本及文件操作的直接參數,如果一定要用的話千萬要進行各種形式的過濾驗證。
測試程式碼:
[https://github.com/zhangyue05...
推薦學習:php影片教學
#以上是三分鐘帶你了解PHP操作使用者提交內容時需要注意的危險函數的詳細內容。更多資訊請關注PHP中文網其他相關文章!