確保PHP應用程式的安全 1

2021-04-13 09:00:37 字數 2758 閱讀 7651

本教程是為至少有一年程式設計經驗的 php 開發人員編寫的。您應該了解 php 的語法和約定;這裡不解釋這些內容。有使用其他語言(比如 ruby、python 和 perl)的經驗的開發人員也能夠從本教程中受益,因為這裡討論的許多規則也適用於其他語言和環境。

安全性快速簡介

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 = 'tmyer';

$arrayusers = array('tmyer', 'tom', 'tommy');

define("greeting", 'hello there' . $myusername);

但是,下面的資料元素都是有瑕疵的。

清單 2. 不安全、有瑕疵的**

$myusername = $_post['username']; //tainted!

$arrayusers = array($myusername, 'tom', 'tommy'); //tainted!

define("greeting", 'hello there' . $myusername); //tainted!

清單 3. 使使用者輸入變得安全

$myusername = cleaninput($_post['username']); //clean!

$arrayusers = array($myusername, 'tom', 'tommy'); //clean!

define("greeting", 'hello there' . $myusername); //clean!

function cleaninput($input)

規則 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. 使**容易得到保護

//obfuscated code

$input = (isset($_post['username']) ? $_post['username']:'');

//unobfuscated code

$input = '';

if (isset($_post['username']))else

在第二個比較清晰的**段中,很容易看出 $input 是有瑕疵的,需要進行清理,然後才能安全地處理。

確保 PHP 應用程式的安全一

web 應用程式最重要的部分是什麼?根據回答問題的人不同,對這個問題的答案可能是五花八門。業務人員需要可靠性和可伸縮性。it 支援團隊需要健壯的可維護的 終端使用者需要漂亮的使用者介面和執行任務時的高效能。但是,如果回答 安全性 那麼每個人都會同意這對 web 應用程式很重要。但是,大多數討論到此就...

PHP應用程式安全

繼續php應用程式安全的 主要一定要注意以下幾個方面 1 過濾sql注入攻擊 可以使用addslashes等php內建的直接給出函式,方便使用 function verifyinput input 而在顯示時則用 正常顯示之 或者乾脆就用 mysql real escape string函式過濾,就...

PHP應用程式安全

繼續php應用程式安全的 主要一定要注意以下幾個方面 1 過濾sql注入攻擊 可以使用addslashes等php內建的直接給出函式,方便使用 function verifyinput input 而在顯示時則用 正常顯示之 或者乾脆就用 mysql real escape string函式過濾,就...