作為網站的所有者或從業者無不希望自己的網站可以安全的運營,然而很多時候網站開發時的一點小疏忽,很可能成為網站巨大的安全隱患。如今web開發的工具和語言有很多,PHP便是其中一種。PHP語言本身具有無可比擬的安全特徵,但卻沒有引起廣大網站開發人員的重視。網站安全可以保證企業員工敏感性資料的安全,甚至能有效阻止伺服器遭劫持等問題。以下筆者將對使用PHP開發時的幾點建議和大家討論,希望可以帶給使用者一些協助。
首先,最重要的事情就是要弄清各種變數和使用者輸入資料。許多你不曾注意的變數本身很可能成為惡意軟體程式傳播感染的極佳途徑。我們可以假設在你的網站上存在一些不是太安全的代碼,但卻運行正常。攻擊者發掘這些漏洞後可以肆無忌憚的在你的網站中進行破壞活動。不要小看這些不起眼的變數名,這些漏洞一旦被駭客利用,其不僅僅是刪除檔案而且刪除整個密碼系統或其它敏感資訊,最終可能對伺服器的正常運轉造成巨大的傷害。
網站管理員對所有從外部輸入的檔案必須檢查其內容是否存在惡意代碼,同時資料庫安全也是至關重要的。資料庫安全必將涉及很多SQL注入等攻擊方式,這裡不做詳細闡述,使用者如果希望瞭解資料庫安全資訊,我會按需求詳細介紹。
Magic Quotes
Magic Quotes在處理使用者檔案輸入時非常好用。當這個選項開啟之後(位於你的php.ini檔案中)它將會把所有的單引號和雙引號區分開,也可以將NULL位元組從使用者的輸入資訊中分開。當開啟Magic Quote時的一個問題是你是否希望你的使用者進行引號過濾。如果你關閉Magic Quote的話可以在“runtime”中分析到使用者輸入資料的字串。
如果你對PHP還不熟悉,我建議你開啟這一功能直到你學會了怎麼樣分析和表現使用者輸入的資料。我個人建議使用我編寫的“清除”功能。我將會給你提供一個模板,這樣你就可以自己編寫一個清除功能了。
| function clean($string) { $string = stripslashes($string); $string = htmlentities($string); $string = strip_tags($string); return $string; } ?> |
如果你的使用者正在提交一個需要使用者名稱驗證的form時,你可以使用如下的功能:
| $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開啟:
| if($authed = true) { echo "my sensitive information"; } ?> |
任何使用者都可以通過發送GET請求訪問敏感資訊。你可以通過telnet(用於遠程聯結服務的標準協議或者實現此協議的軟體遠程登入)或是瀏覽器,譬如sin.php?authed=true,這樣就會顯示敏感資訊。如果我們將其關閉,就會阻止這一問題,現在當我們訪問sin.php?authed=true頁面的時候,就會一片空白。使用者不能從外部來源初始設定變數。另外一個保護你的變數免於外部來源影響的一個辦法就是檢查它們是否是通過GET或是POST請求。
| $authed = true; if(isset($_POST[authed]) || $_GET[authed]) { echo "variable violation"; } else { if($authed == true) { echo "my sensitive information"; } } ?> |
通過監控GET或是POST請求我們就可以檢查到是否有人在我們的變數中注入什麼東西。接下來我們收到的訊息不僅包括他們已經破壞了變數,還可以及時通知管理員做出應急措施。
http://www.bkjia.com/PHPjc/364205.htmlwww.bkjia.comtruehttp://www.bkjia.com/PHPjc/364205.htmlTechArticle作為網站的所有者或從業者無不希望自己的網站可以安全的運營,然而很多時候網站開發時的一點小疏忽,很可能成為網站巨大的安全隱患...