<?php
unlink (
$evil_var
);
fwrite (
$fp
,
$evil_var
);
system (
$evil_var
);
exec
(
$evil_var
);
?>
必須時常留意你的代碼,以確保每一個從客戶端提交的變量都經過適當的檢查,然後問自己以下一些問題:此腳本是否只能影響所預期的文件?非正常的數據被提交後能否產生作用?此腳本能用於計劃外的用途嗎?此腳本能否和其它腳本結合起來做壞事?是否所有的事務都被充分記錄了?在寫代碼的時候問自己這些問題,否則以後可能要為了增加安全性而重寫代碼了。注意了這些問題的話,也許還不完全能保證系統的安全,但是至少可以提高安全性。還可以考慮關閉 register_globals,magic_quotes 或者其它使編程更方便但會使某個變量的合法性,來源和其值被搞亂的設置。 2、用戶輸入表單問題驗證用戶輸入的任何數據,保證PHP代碼的安全。注意1:JS只是為了提高來訪用戶的體驗而產生的,而不是驗證的工具。因為任何一個來訪的用戶都可能會,也有可能無意間就禁用了客戶端腳本的執行,從而跳過這層驗證。所以我們必須在PHP的服務器端程序上檢驗這些數據。注意2:不要使用$_SERVER['HTTP_REFERER']這個超級變量來檢查數據的來源地址,一個很小的菜鳥黑客都會利用工具來偽造這個變量的數據,盡可能利用Md5,或者rand等函數來產生一個令牌,驗證來源的時候,驗證這個令牌是否匹配。3、PHP文件權限問題PHP 被設計為以用戶級別來訪問文件系統,所以完全有可能通過編寫一段 PHP 代碼來讀取系統文件如/etc/passwd,更改網絡連接以及發送大量打印任務等等。因此必須確保 PHP 代碼讀取和寫入的是合適的文件。請看下面的代碼,用戶想要刪除自己主目錄中的一個文件。假設此情形是通過 web 界面來管理文件系統,因此 Apache用戶有權刪除用戶目錄下的文件。 ?1234567
<?php
$username
=
$_POST
[
'user_submitted_name'
];
$homedir
=
"/home/$username"
;
$file_to_delete
=
"$userfile"
;
unlink (
"$homedir/$userfile"
);
echo
"$file_to_delete has been deleted!"
;
?>
既然 username 變量可以通過用戶表單來提交,那就可以提交別人的用戶名和文件名,並刪除該文件。這種情況下,就要考慮其它方式的認證:只給 PHP 的 web 用戶很有限的權限。檢查所有提交上來的變量。以下是更加安全的文件名和變量的驗證和檢查: ?12345678910
<?php