作為網站的所有者或從業者無不希望自己的網站可以安全的運營,然而很多時候網站開發時的一點小疏忽,很可能成為網站巨大的安全隱患。如今web開發的工具和語言有很多,PHP便是其中一種。PHP語言本身具有無可比擬的安全特征,但卻沒有引起廣大網站開發者的重視。網站安全可以保證企業員工敏感數據的安全,甚至能有效的阻止服務器遭劫持等問題。以下筆者將對使用PHP開發時的幾點建議和大家討論,希望可以帶給用戶一些幫助。
首先,最重要的事情就是要弄清各種變量和用戶輸入數據。許多你不曾注意的變量本身很可能成為惡意軟件程序傳播感染的極佳途徑。我們可以假設在你的網站上存在一些不是太安全的代碼,但卻運行正常。攻擊者發掘這些漏洞後可以肆無忌憚的在你的網站中進行破壞活動。不要小看這些不起眼的變量名,這些漏洞一旦被黑客利用,其不僅僅是刪除文件而且刪除整個密碼系統或其它敏感信息,最終可能對服務器的正常運轉造成巨大的傷害。
網站管理員對所有從外部輸入的文件必須檢查其內容是否存在惡意代碼,同時數據庫安全也是至關重要的。數據庫安全必將涉及很多SQL注入等攻擊方式,這裡不做詳細闡述,用戶如果希望了解數據庫安全信息,我會按需求詳細介紹。
Magic Quotes
Magic Quotes在處理用戶文件輸入時非常好用。當這個選項開啟之後(位於你的php.ini文件中)它將會把所有的單引號和雙引號區分開,也可以將NULL字節從用戶的輸入信息中分開。當開啟Magic Quote時的一個問題是你是否希望你的用戶進行引號過濾。如果你關閉Magic Quote的話可以在“runtime”中分析到用戶輸入數據的字符串。
如果你對PHP還不熟悉,我建議你開啟這一功能直到你學會了怎麼樣分析和表現用戶輸入的數據。我個人建議使用我編寫的“清除”功能。我將會給你提供一個模板,這樣你就可以自己編寫一個清除功能了。
<?php
function clean($string)
{
$string = stripslashes($string);
$string = htmlentities($string);
$string = strip_tags($string);
return $string;
}
?>
如果你的用戶正在提交一個需要用戶名驗證的form時,你可以使用如下的功能:
<?php
$username = $_POST[username];
echo clean($mystring);
?>
對於這個Magic Quote來說,有3種指令來實現。你可以參考php.net網站或是php manual。這三種指示基本上就是magic_quotes_gpc,這些用來處理訪問請求(get,post,cookies)。magic_quotes_runtime用來處理文件和數據庫,外部文件。第三種就是magic_quotes_sybase,如果它被激活的話就會直接廢掉magic_quotes_gpc。
通過朦胧而獲得的安全
最近你可能沒有注意到,但是我發現在一些網站上的PHP語言中可以找得到ASP (Active Server Page 動態服務器主頁)或是PERL(一種GGI腳本語言)擴展語言,我們可以100%肯定這個網站使用的正是PHP/SQL為基礎的架構。這是一種典型的迷惑式安全策略,而不是告訴黑客你使用的正是PHP腳本從而誤導他們以為你運行的是PERL或python或是其它任何腳本語言。
例如,你可以使用php擴展運行php腳本,就和一般情況下一樣。為了不讓別人看到你的"hello.php"腳本,你實際上使用Apache來隱藏或是迷惑真正的文件擴展名。因此不是使用的"hello.php"擴展名,你可以將這些文件偽裝成PERL語言,你的"hello.php"仍然是PHP腳本。就像下面一樣:
[quote]AddType application/x-httpd-php .asp .py .pl[/quote]
我最喜歡的就是編一個文件擴展名, 譬如 .sun 或 .fuck
[quote]AddType application/x-httpd-php .sun .fuck .1e3t[/quote]
我確信當黑客在碰到看似是運行php文件的。Sun文件的時候會急於發動攻擊,後果可想而知。試一下就知道了。上面的代碼使用於Apache配置文件,如果你是在一台共享的主機上的話你就不會訪問到Apache配置文件。
Register Globals
當Global4.2版本出現時PHP發生很大的變化。對於php.ini文件中的INI文件來說這是一個開或閉的選擇,PHP並不是逼你采用類似其它語言一樣的原始參數,正因為如此,人們將它看作是一種不安全的語言。當register globals開啟的時候,它就會允許設置參數的請求。最好的例子就是用戶注冊形式。我們假設register globals開啟:
<?php
if($authed = true) {
echo "my sensitive information";
}
?>
任何用戶都可以通過發送GET請求訪問敏感信息。你可以通過telnet(用於遠程聯接服務的標准協議或者實現此協議的軟件遠程登錄)或是浏覽器,譬如sin.php?authed=true,這樣就會顯示敏感信息。如果我們將其關閉,就會阻止這一問題,現在當我們訪問sin.php?authed=true頁面的時候,就會一片空白。用戶不能從外部來源初始化變量。另外一個保護你的變量免於外部來源影響的一個辦法就是檢查它們是否是通過GET或是POST請求。
<?php
$authed = true;
if(isset($_POST[authed]) || $_GET[authed]) {
echo "variable violation";
} else {
if($authed == true) {
echo "my sensitive information";
}
}
?>
通過監控GET或是POST請求我們就可以檢查到是否有人在我們的變量中注入什麼東西。接下來我們收到的消息不僅包括他們已經破壞了變量,還可以及時通知管理員做出應急措施。