国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發(fā) > PHP > 正文

初學(xué):學(xué)習(xí)PHP相關(guān)安全問題的入門知識

2024-05-04 23:03:23
字體:
供稿:網(wǎng)友

  有時候,您的業(yè)務(wù)可能涉及到 php 應(yīng)用程序的安全性。當(dāng)您遇到審計任務(wù)時,您知道如何執(zhí)行查找嗎?本系列將帶您進(jìn)入 php,并幫您在一定程序上了解它,讓您在進(jìn)行安全審計時知道查找什么。

  第 1 部分向您介紹 register_globals 設(shè)置。
  
  入門知識
  
  我在此假定您對 php 的語法有一個大致的了解,至少能夠編寫“hello world”之類的程序。如果您不具備基礎(chǔ)知識,則請首先學(xué)習(xí) php 手冊和某些基本的 php 教程(參閱 參考資料)。很多出版商都有關(guān)于 php 的好書。建議初學(xué)者一開始先看看入門書籍或食譜形式的書籍。
  
  在生產(chǎn)環(huán)境的準(zhǔn)確副本上執(zhí)行審計。您不需要復(fù)制硬件,但是需要確保軟件版本盡量和實際的完全一樣。php 配置必須精確匹配,這一點在 php.ini 文件中、在 .htaccess 文件的 apache 指令中或在 httpd.conf 中已經(jīng)指定。您需要準(zhǔn)備一個單獨的環(huán)境,因為您將顯示和記錄可能包含敏感的密碼及其他信息的錯誤。此外,您將嘗試中斷站點的安全性,這一點是您在活動應(yīng)用程序中極力避免的。
  
  第一步是將 php 的 error_reporting 設(shè)置更改為 e_all。設(shè)置更改后,每當(dāng)使用未初始化的變量、進(jìn)行錯誤的文件訪問及發(fā)生其他(大多數(shù))無害錯誤時,php 都會報告一條警告消息,但也存在這是一個潛在攻擊矢量的可能性。這些錯誤一般情況下只是表明編程草率,所以如果這是您的代碼,您把它們清除掉即可。
  
  該設(shè)置如下所示:
  
  error_reporting = e_all
  
  如果您不知道 php.ini 文件在哪里,則可以通過創(chuàng)建包含以下文本的 .php 腳本來查找:
  
  <?php
  
  phpinfo();


  值可能會有些變化,但 /usr/local/lib/php.ini 是大多數(shù) unix? 系統(tǒng)上的公共位置,c:/php/php.ini 或 c:/windows/php.ini 是大多數(shù) microsoft? windows? 系統(tǒng)上的公共位置。如果該文件不存在,則創(chuàng)建一個并在文件中鍵入上面的 error_reporting 行即可。修改 php.ini 文件后,需要重啟 web 服務(wù)器,php 才能啟用新設(shè)置。
  
  如果您以前沒有創(chuàng)建 phpinfo() 頁面,則可以現(xiàn)在創(chuàng)建。第二個主要部分的標(biāo)簽是“配置”,它包含許多關(guān)于如何設(shè)置 php 的有用信息。該部分包括三列:設(shè)置名稱、本地值 和 xmaster 值。主值是通過 php.ini 指令為您機(jī)器上的所有 php 腳本全局設(shè)置的值。本地值是對當(dāng)前腳本生效的值。對它有影響的有:.htaccess 設(shè)置、httpd.conf 的 <location> 或 <directory> 部分中的設(shè)置和 php 腳本中的 ini_set 調(diào)用。在運行時,只有某些設(shè)置是可更改的。請參閱 參考資料中的 php 手冊以獲取詳細(xì)信息。
  
  還需要自定義的另外兩種設(shè)置是 display_errors 和 log_errors。您至少需要啟用這兩種設(shè)置中的一種,或者兩種都啟用。log_errors 通知 php 將注意、警告或錯誤記錄在文件中,display_errors 將這些被記錄下來的注意、警告和錯誤顯示在屏幕上。它們不互相排斥。至少啟用它們中的一個,可以有效地發(fā)現(xiàn)可能導(dǎo)致安全漏洞的編程錯誤。
  
  應(yīng)該查找哪些種類的安全問題?
  
  值得慶幸的是,導(dǎo)致安全漏洞的很多編程錯誤在 php 中不可能存在。堆棧和緩沖溢出是 c 和 c++ 環(huán)境中兩個常見的問題。因為 php 可以為您管理記憶,所以 php 代碼不會導(dǎo)致堆棧和緩沖溢出。
  
  然而,php 本身也是使用 c 語言編寫的,有時記憶問題深至 php 的核面。因此,您需要時時關(guān)注安全公報和更新。php 在其 web 站點(參見 參考資料)公布新 php 版本并說明是否包含安全修補程序。
  
  php 應(yīng)用程序中的大多數(shù)問題與使用用戶提供的數(shù)據(jù)有關(guān),在使用它和對它執(zhí)行操作前未曾預(yù)先驗證和消毒。您可能聽說過稱為 cross-site scripting (xss) 的漏洞。xss 通過提供程序不期望的輸入,然后利用程序?qū)o賴輸入的處理方式發(fā)動進(jìn)攻。編寫良好的程序可以避免這些假定。在機(jī)場安全方面,php 程序用于檢查旅客的行李。
  
  其他問題是一些細(xì)微的邏輯錯誤。例如,檢查一系列參數(shù),看看是否批準(zhǔn)某個用戶訪問某種資源、是否把括弧放錯位置以至于某些用戶進(jìn)入了他們原本不該到的地方。我們希望您的應(yīng)用程序組織良好并具有這種集中式邏輯。
  
  識別用戶輸入
  
  最棘手的一件事情是如何從外部源(如某個用戶、別的 web 站點或某些其他資源)和已經(jīng)驗證的數(shù)據(jù)中區(qū)分出不受信任的輸入。有人提出了“不相信一切”的觀點,即不管來自何處,對于所有函數(shù)都要驗證其數(shù)據(jù)。這一做法會牽涉到以下幾件事情:第一,驗證在不同的上下文中意味著不同的事情;第二,在應(yīng)用程序的所有級別上快速執(zhí)行驗證是一件枯燥乏味和易于出錯的事情;第三,您是在審計應(yīng)用程序而不是在從頭重新編寫它。您需要通過現(xiàn)有代碼來跟蹤用戶輸入,而不能用驗證函數(shù)包裝您看到的每個變量。
  
  不期望的用戶輸入
  
  用戶輸入從何而來?第一個源是 get、post 和 cookie 數(shù)據(jù)。一般稱為 gpc 數(shù)據(jù)。此數(shù)據(jù)的可識別程序依賴于一個有爭議的 php.ini 設(shè)置:register_globals。在 php v4.3.0 以后,register_globals 默認(rèn)情況下被設(shè)置為 off。但是幾年前,在 php 中,register_globals 的默認(rèn)值是打開的,所以存在很多需要它的代碼。
  
  register_globals 本身并非安全風(fēng)險。但是,它為跟蹤用戶輸入和確保應(yīng)用程序安全增加了難度。為什么會這樣?因為如果打開 register_globals,在全局名稱空間和 $_get、$_post 或 $_cookie 數(shù)組中,將創(chuàng)建 get、post 和 cookie 傳遞到 php 腳本的所有變量。
  
  下面是工作方式及其重要性的示例:
  
  清單 1. cookie 的安全性
  
  1 <?php
  2
  3 // see if the user has the secret cookie.
  4 if (!empty($_cookie['secret'])) {
  5  $authorized = true;
  6 }
  7
  8 // now let's go through a list of press releases and show them.
  9 $releases = get_press_releases();
  10 foreach ($releases as $release) {
  11
  12   // some releases are restricted. only show them to people who can
  13   // see secrets.
  14   if ($release['secret']) {
  15     if (!$authorized) {
  16       continue;
  17     }
  18   }
  19
  20   // we must be allowed to see it.
  21   showrelease($release);
  22 }
  
  您應(yīng)該注意幾件事。第一,依靠 cookie 來判斷用戶是否已通過身份驗證不是個好主意 —— 因為人們可以很容易地設(shè)置自己的 cookie 值。我們將在另外一篇文章中敘述這一點。無論如何,此腳本的缺點在于,如果打開 register_globals,它就不具備安全性了。
  
  下面介紹名為 press.php 的腳本。一般來說,當(dāng)用戶訪問 press 發(fā)行版的腳本時,其瀏覽器將顯示 http://www.example.com/company/press.php。
  
  現(xiàn)在注意當(dāng)用戶擅自將其更改為 http://www.example.com/company/press.php?authorized=1 時將發(fā)生什么事?
  
  看看前面的代碼:僅當(dāng)用戶使用 cookie 時才設(shè)置 $authorized。它永遠(yuǎn)不會被設(shè)置為假。后來引入了 register_globals —— 它取代了剛才使用的 $_get['authorized'],同時在全局范圍內(nèi)還存在一個值為 1 的變量 $authorized。因此,即使用戶沒有通過 cookie 檢查,$authorized 后來在 foreach 循環(huán)中引用時,仍然會被驗證為真。
  
  修復(fù)此缺陷可以使用兩種方式。其一,當(dāng)然是關(guān)閉 register_globals。如果關(guān)閉它對您的生產(chǎn)站點沒有影響,則這是個好主意。您需要測試一下應(yīng)用程序,確保它沒有因此中斷運行。
  
  另一種方式有點像“防御性編程”。我們只需要將 cookie 檢查更改為以下形式即可:
  
  清單 2. 使用 cookie 提高安全性
  
  1 <?php
  2
  3 // see if the user has the secret cookie.
  4 $authorized = false;
  5 if (!empty($_cookie['secret'])) {
  6  $authorized = true;
  7 }
  
  ...
  
  這時,當(dāng)用戶將 ?authorized=1 添加到腳本 url 時,$authorized 變量仍然被設(shè)置為 1 —— 但是它隨即會被 $authorized = false 覆蓋,只有那些實際具有秘密 cookie 的用戶才能看到受限的 press 發(fā)行版。他們?nèi)匀豢梢栽O(shè)計自己的 cookie。
  
  審計代碼的教訓(xùn):設(shè)法關(guān)閉 register_globals。如果不打開 register_globals 應(yīng)用程序就不能運行,并且您無法修改它,或者在應(yīng)用程序必須運行的地方您無法控制 php 配置,則需要在條件塊中查找所有全局變量設(shè)置,或者通過某些函數(shù)調(diào)用進(jìn)入全局范圍。如果 register_globals 為打開狀態(tài),則這兩種情形都是由用戶將變量設(shè)置為任意值引起的。
  
  找到這些變量的好辦法是將 php.ini 設(shè)置 error_reporting 設(shè)置為 e_all,同時使用 log_errors 或 display_errors,這樣,所有 php 警告和錯誤都會被分別記錄在文件中或顯示在屏幕上。每當(dāng)使用未初始化的變量(假定具有值)時,您將得到一條 e_notice。這像 c 和 java? 語言中那樣,仍然與讓 php 要求聲明 變量有所不同。結(jié)果,當(dāng)我們的第一個版本的腳本運行時,出現(xiàn)的錯誤消息是:
  
  notice: undefined variable: authorized in c:/var/www/articles/press.php
  on line 15
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 西充县| 灵石县| 临汾市| 德阳市| 武城县| 新民市| 永康市| 郸城县| 台安县| 宜春市| 乌兰县| 南江县| 治县。| 嫩江县| 拉萨市| 凉城县| 嘉鱼县| 湟中县| 太仓市| 镇江市| 江都市| 聂荣县| 湘潭县| 咸宁市| 桓仁| 若尔盖县| 习水县| 济源市| 文安县| 台江县| 遂平县| 赫章县| 连山| 伊金霍洛旗| 任丘市| 广丰县| 六安市| 辛集市| 开鲁县| 绥宁县| 玉屏|