首頁  >  文章  >  後端開發  >  PHP應用程式的安全性 xp應用程式相容性 應用程式相容性引擎 應用程式相容性設

PHP應用程式的安全性 xp應用程式相容性 應用程式相容性引擎 應用程式相容性設

WBOY
WBOY原創
2016-07-29 08:52:55988瀏覽


無論在開發中,還是在面試時或技術討論時,安全性都是需要深入了解及掌握的。


目標
本教學目標是讓您了解應該如何保護自己建立的 Web 應用程式。講解如何防禦最常見的安全威脅:SQL 注入、操縱 GET 和 POST 變數、緩衝區溢位攻擊、跨站腳本攻擊、瀏覽器內的資料操縱和遠端表單提交。
安全性快速簡介
Web 應用程式最重要的部分是什麼?根據回答問題的人不同,這個問題的答案可能是五花八門。業務人員需要可靠性和可擴展性。 IT 支援團隊需要健壯的可維護的程式碼。最終用戶需要漂亮的使用者介面和執行任務時的高效能。但是,如果回答 “安全性”,那麼每個人都會同意這對 Web 應用程式很重要。
但是,大多數討論到此就打住了。儘管安全性在專案的檢查表中,但是往往到了專案交付之前才開始考慮解決安全性問題。採用這種方式的 Web 應用程式專案的數量多得驚人。開發人員工作幾個月,只在最後才添加安全特性,讓 Web 應用程式能夠向公眾開放。
結果往往是一片混亂,甚至需要返工,因為程式碼已經經過檢驗、單元測試並集成為更大的框架,之後才在其中添加安全特性。添加安全性之後,主要組件可能會停止工作。安全性的整合使得原本順暢(但不安全)的過程增加額外負擔或步驟。
本教學提供一種將安全性整合到 PHP Web 應用程式中的好方法。它討論幾個一般性安全主題,然後深入討論主要的安全漏洞以及如何堵住它們。在學完本教學之後,您會對安全性有更好的理解。
主題包括:
SQL 注入攻擊
操縱GET 字串
緩衝區溢位攻擊
跨站點腳本攻擊(XSS)
瀏覽器內的資料操縱
遠端表單提交
Web 安全性101
在討論實現安全性的細節之前,最好先從比較高的角度討論Web 應用程式安全性。本節介紹安全哲學的一些基本信條,無論正在創建何種 Web 應用程序,都應該牢記這些信條。這些想法的一部分來自 Chris Shiflett(他關於 PHP 安全性的書是無價的寶庫),有些來自 Simson Garfinkel(參見 參考資料),還有一些來自多年累積的知識。
規則 1:絕對不要信任外部資料或輸入
關於 Web 應用程式安全性,必須認識到的第一件事是不應該信任外部資料。外部資料(outside data) 包括任何不是由程式設計師在 PHP 程式碼中直接輸入的資料。在採取措施確保安全之前,來自任何其他來源(例如 GET 變數、表單 POST、資料庫、設定檔、會話變數或 cookie)的任何資料都是不可信任的。
例如,下面的資料元素可以被認為是安全的,因為它們是在 PHP 中設定的。
清單 1。 . $myUsername); [/php]
但是,下面的資料元素都是有瑕疵的。
清單2. 不安全、有瑕疵的程式碼
                   
[php]$myUsername = $_POST['username']; //tainted!
[php]$myUsername = $_POST['username']; //tainted!
$1]$myUsername = $_POST['username']; //tainted!
$array); /tainted!
define(”GREETING”, 'hello there' . $myUsername); //tainted! [/php]
為什麼第一個變數$myUsername 是有瑕疵的?因為它直接來自表單 POST。使用者可以在這個輸入域中輸入任何字串,包括用來清除檔案或運行以前上傳的檔案的惡意命令。您可能會問,「難道不能使用只接受字母A-Z 的客戶端(JavaScript)表單檢驗腳本來避免這種危險嗎?」是的,這總是一個有好處的步驟,但是正如在後面會看到的,任何人都可以將任何表單下載到自己的機器上,修改它,然後重新提交他們需要的任何內容。
解決方案很簡單:必須對 $_POST['username'] 執行清理程式碼。如果不這麼做,那麼在使用 $myUsername 的任何其他時候(例如在陣列或常數中),就可能污染這些物件。
對使用者輸入進行清理的一個簡單方法是,使用正規表示式來處理它。在這個範例中,只希望接受字母。將字串限制為特定數量的字符,或要求所有字母都是小寫的,這可能也是個好主意。
清單3. 使用用戶輸入變得安全
                   
[php]$myUsername = cleanInput($_POST['username']); //fmy! ; //clean!
define(”GREETING”, 'hello there' . $myUsername); //clean!
function cleanInput($input){
$clean = strtolower($input);
$clean = preg_replace(”/[^a-z]/ ”, “”, $clean);
$clean = substr($clean,0,12);
return $clean;
}[/php]
規則2:禁用那些使安全性難以實施的PHP 設定
已經知道了不能信任使用者輸入,也應該知道不應該信任機器上配置PHP 的方式。例如,請確保停用 register_globals。如果啟用了 register_globals,就可能做一些粗心的事情,例如使用 $variable 替換同名的 GET 或 POST 字串。透過停用這個設置,PHP 強迫您在正確的名稱空間中引用正確的變數。要使用來自表單 POST 的變量,應該引用 $_POST['variable']。這樣就不會將這個特定變數誤會成 cookie、會話或 GET 變數。
要檢查的第二個設定是錯誤報告等級。在開發期間,希望獲得盡可能多的錯誤報告,但是在交付專案時,希望將錯誤記錄到日誌檔案中,而不是顯示在螢幕上。為什麼呢?因為惡意的駭客會使用錯誤報告資訊(例如 SQL 錯誤)來猜測應用程式正在做什麼。這種偵察可以幫助駭客突破應用程式。為了堵住這個漏洞,需要編輯 php.ini 文件,為 error_log 條目提供合適的目的地,並將 display_errors 設定為 Off。
規則 3:如果不能理解它,就不能保護它
一些開發人員使用奇怪的語法,或者將語句組織得很緊湊,形成簡短但是含義模糊的程式碼。這種方式可能效率高,但是如果您不理解程式碼正在做什麼,那麼就無法決定如何保護它。
例如,您喜歡下面兩段程式碼中的哪一段?
清單4. 使程式碼容易受到保護
                   
[php]//obfuscated
$input = ”;
if (isset($_POST['username'])){
$input = $_POST['username'];
}else{
$input = ”;
}[/php]
在第二個比較清晰的程式碼片段中,很容易看出$input 是有瑕疵的,需要進行清理,然後才能安全地處理。來說明如何保護線上表單,同時在處理表單的PHP 程式碼中採用必要的措施。縱深防禦不只是一種好思想,它可以確保您不會陷入嚴重的麻煩。攻擊中,使用者透過操縱表單或GET 查詢字串,將資訊加入資料庫查詢。一張登入表單,讓使用者能夠登入。 action=”verify.php” method=”post”>









陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn