202008-19 PHP依賴注入的含義 HOT 通俗來說,就是你當前操作一個類,但是這個類的某些方法或者功能不是單單只靠這個類就能完成的,而是要借助另一個類的才能完成的。 最直接的標志就是傳參數據為對象的時候。 嚴格來說,你目前操作的是兩個類,這兩個類之間相互依賴,傳參的方式叫注入。 繼續閱讀 >
202008-11 每天數十億次請求的web應用經驗分享 HOT Snapdeal是一家類似于京東和阿里巴巴結合體的電商平臺。獨立商戶可以借助這個平臺銷售高質量的商品,在Snapdeal出售的商品均為全新,并且支持七天免費退換。商家進駐Snapdeal后,隨后的事宜(交易、包裝和物流)都將由Snapdeal完成,也就是商家都將成為Snapdeal的“供貨商”,無需與用戶直接進行交易。 繼續閱讀 >
201603-16 PHP安全-加密 加密 作為一本相關安全方面的書,通常加密是需要提及的話題。我之所以在本書的主體部分忽略了加密問題,是因為它的用途是狹窄的,而開發者應從大處著眼來考慮安全問題。過分依賴于加密常常會混淆問題的根源。盡管加密本身是有效的,但是進行加密并不會神奇地提高一個應用的安全性。 一個PHP開發人員應主要熟悉以下的加密方式: l 對稱加密l ... 繼續閱讀 >
201603-16 PHP安全-函數 函數 在我寫作本書的時候,http://php.net/quickref.php列出了共3917個函數,其中包括一些類似函數的語法結構,在此我不準備把它們從函數中區分開來,而是把它作為函數看待。 由于函數數量很大,一一說明它們的正確及安全用法是不太可能的。在此我選出了我認為最需要注意的函數。選擇的標準包括使用的頻繁度、使用時的危險(安全)度及我本人的經驗。 對于每一個列出的函數,我都會提供推薦的使用方法。... 繼續閱讀 >
201603-16 PHP安全-配置選項 配置選項 盡管本書的焦點是在于應用的安全性,但有一些配置選項是任何關心安全的開發者必需熟悉的。PHP的配置會影響你所寫代碼的行為以及你使用的技巧,必要時你需要稍稍負責一下應用程序以外的東西。 PHP的配置主要由一個名為php.ini的文件所指定。該文件包含很多配置選項,每一項都會對PHP產生非常特定的影響。如果該文件不存在,或者該文件中的某選項不存在,則會使用默認值。 如果你不知道php.ini... 繼續閱讀 >
201603-15 PHP安全-安全模式 安全模式 PHP的safe_mode選項的目的是為了解決本章所述的某些問題。但是,在PHP層面上去解決這類問題從架構上來看是不正確的,正如PHP手冊所述(http://php.net/features.safe-mode)。 當安全模式生效時,PHP會對正在執行的腳本所讀?。ɑ蛩僮鳎┪募膶僦鬟M行檢查,以保證與該腳本的屬主是相同的。雖然這樣確實可以防范本章中的很多例子,但它不會影響其它語言編寫的程序。例如,使用Bash寫的CGI... 繼續閱讀 >
201603-15 PHP安全-文件系統瀏覽 文件系統瀏覽 除了能在共享服務器上讀取任意文件之外,攻擊者還能建立一個可以瀏覽文件系統的腳本。由于你的大多數敏感文件不會保存在網站主目錄下,此類腳本一般用于找到你的源文件的所在位置。請看下例: <pre> <?php if(isset($_GET['dir'])) { ls($_GET['dir']); } elseif(isset($_GET['file'])) { cat($... 繼續閱讀 >
201603-15 PHP安全-會話注入 會話注入 一個與會話暴露類似的問題是會話注入。此類攻擊是基于你的WEB服務器除了對會話存儲目錄有讀取權限外,還有寫入權限。因此,存在著編寫一段允許其他用戶添加,編輯或刪除會話的腳本的可能。下例顯示了一個允許用戶方便地編輯已存在的會話數據的HTML表單: <?php session_start(); ?> <formaction="inject.php"method="POST"> <?php&nbs... 繼續閱讀 >
201603-15 PHP安全-會話數據暴露(二) 會話數據暴露 當你關注于防止源碼的暴露時,你的會話數據只同樣存在著風險。在默認情況下,SESSION保存在/tmp目錄下。這樣做在很多情形下是很方便的,其中之一是所有用戶都有對/tmp的寫入權限,這樣Apache同樣也有權限進行寫入。雖然其他用戶不能直接從shell環境讀取這些會話文件,但他們可以寫一個簡單的腳本來進行讀?。?nbsp; <?php header('Content-Type:text/plain'); session_s... 繼續閱讀 >
201603-15 PHP安全-源碼暴露(二) 源碼暴露 你的WEB服務器必須要能夠讀取你的源確并執行它,這就意味著任意人所寫的代碼被服務器運行時,它同樣可以讀取你的源碼。在一個共享主機上,最大的風險是由于WEB服務器是共享的,因此其它開發者所寫的PHP代碼可以讀取任意文件。 <?php header('Content-Type:text/plain'); readfile($_GET['file']); ?> 通過在你的源碼所在的主機上運行上面... 繼續閱讀 >
201603-15 PHP安全-永久登錄 永久登錄 永久登錄指的是在瀏覽器會話間進行持續驗證的機制。換句話說,今天已登錄的用戶明天依然是處于登錄狀態,即使在多次訪問之間的用戶會話過期的情況下也是這樣。 永久登錄的存在降低了你的驗證機制的安全性,但它增加了可用性。不是在用戶每次訪問時麻煩用戶進行身份驗證,而是提供了記住登錄的選擇。 圖7-2.攻擊者通過重播用戶的cookie進行未授權訪問 據我觀察,最常見的有缺陷的永... 繼續閱讀 >
201603-15 PHP安全-重播攻擊 重播攻擊 重播攻擊,有時稱為演示攻擊,即攻擊者重現以前合法用戶向服務器所發送的數據以獲取訪問權或其它分配給該用戶的權限。 與密碼嗅探一樣,防止重播攻擊也需要你意識到數據的暴露。為防止重播攻擊,你需要加大攻擊者獲取任何用于取得受限資源的訪問權限的數據的難度。這主要要求做到避免以下做法: 設定受保護資源永久訪問權的數據的使用;設定受保護資源訪問權的數據的暴露(甚至是只提供臨時... 繼續閱讀 >
201603-15 PHP安全-密碼嗅探 密碼嗅探 盡管攻擊者通過嗅探(察看)你的用戶和應用間的網絡通信并不專門用于訪問控制,但要意識到數據暴露變得越來越重要,特別是對于驗證信息。 使用SSL可以有效地防止HTTP請求和回應不被暴露。對任何使用https方案的資源的請求可以防止密碼嗅探。最好的方法是一直使用SSL來發送驗證信息,同時你可能還想用SSL來傳送所有的包含會話標識的請求以防止會話劫持。 為防止用戶驗證信息不致暴露,在表單的actio... 繼續閱讀 >
201603-15 PHP安全-暴力攻擊 暴力攻擊 暴力攻擊是一種不使用任何特殊手段而去窮盡各種可能性的攻擊方式。它的更正式的叫法是窮舉攻擊——窮舉各種可能性的攻擊。 對于訪問控制,典型的暴力攻擊表現為攻擊者通過大量的嘗試去試圖登錄系統。在多數情況下,用戶名是已知的,而只需要猜測密碼。 盡管暴力攻擊沒有技巧性可言,但詞典攻擊似乎有一定的技巧性。最大的區別是在進行猜測時的智能化。詞典攻擊只會最可能的情況列表中進行窮舉,而... 繼續閱讀 >
201603-15 PHP安全-命令注入 命令注入 使用系統命令是一項危險的操作,尤其在你試圖使用遠程數據來構造要執行的命令時更是如此。如果使用了被污染數據,命令注入漏洞就產生了。 Exec()是用于執行shell命令的函數。它返回執行并返回命令輸出的最后一行,但你可以指定一個數組作為第二個參數,這樣輸出的每一行都會作為一個元素存入數組。使用方式如下: <?php $last=exec('ls',$output,$return); ... 繼續閱讀 >
201603-14 PHP安全-遠程文件風險 遠程文件風險 PHP有一個配置選項叫allow_url_fopen,該選項默認是有效的。它允許你指向許多類型的資源,并像本地文件一樣處理。例如,通過讀取URL你可以取得某一個頁面的內容(HTML): <?php $contents=file_get_contents('http://example.org/'); ?> 正如第五章所討論的那樣,當被污染數據用于include和require的文件指向時,會產生嚴重漏洞。實際上,我認為這種漏... 繼續閱讀 >
201603-14 PHP安全-文件系統跨越 文件系統跨越 無論你用什么方法使用文件,你都要在某個地方指定文件名。在很多情況下,文件名會作為fopen()函數的一個參數,同時其它函數會調用它返回的句柄: <?php $handle=fopen('/path/to/myfile.txt','r'); ?> 當你把被污染數據作為文件名的一部分時,漏洞就產生了: <?php $handle=fopen("/path/to/{$_GET['filename']}.t... 繼續閱讀 >
201603-14 PHP安全-代碼注入 代碼注入 一個特別危險的情形是當你試圖使用被污染數據作為動態包含的前導部分時: <?php include"{$_GET['path']}/header.inc"; ?> 在這種情形下攻擊者能操縱不只是文件名,還能控制所包含的資源。由于PHP默認不只可以包含文件,還可以包含下面的資源(由配置文件中的allow_url_fopen所控制): <?php include'http://www.google.com/';... 繼續閱讀 >
201603-14 PHP安全-文件名操縱 文件名操縱 在很多情形下會使用動態包含,此時目錄名或文件名中的部分會保存在一個變量中。例如,你可以緩存你的部分動態頁來降低你的數據庫服務器的負擔。 <?php include"/cache/{$_GET['username']}.html"; ?> 為了讓這個漏洞更明顯,示例中使用了$_GET。如果你使用了受污染數據時,這個漏洞同樣存在。使用$_GET['username']是一個極端的例子,通過它可以把問... 繼續閱讀 >
201603-14 PHP安全-后門URL 后門URL 后門URL是指雖然無需直接調用的資源能直接通過URL訪問。例如,下面WEB應用可能向登入用戶顯示敏感信息: <?php $authenticated=FALSE; $authenticated=check_auth(); /*...*/ if($authenticated) { include'./sensitive.php'; } ?> 由于sensitive.php位于網站主... 繼續閱讀 >
201603-14 PHP安全-源碼暴露 源碼暴露 關于包含的一個重要問題是源代碼的暴露。產生這個問題主要原因是下面的常見情況: l 對包含文件使用.inc的擴展名l 包含文件保存在網站主目錄下l Apache未設定.inc文件的類型l Apache的默認文件類型是text/plain 上面情況造成了可以通過URL直接訪問包含文件。更糟的是,它... 繼續閱讀 >
201603-14 PHP安全-會話劫持 會話劫持 最常見的針對會話的攻擊手段是會話劫持。它是所有攻擊者可以用來訪問其它人的會話的手段的總稱。所有這些手段的第一步都是取得一個合法的會話標識來偽裝成合法用戶,因此保證會話標識不被泄露非常重要。前面幾節中關于會話暴露和固定的知識能幫助你保證會話標識只有服務器及合法用戶才能知道。 深度防范原則(見第一章)可以用在會話上,當會話標識不幸被攻擊者知道的情況下,一些不起眼的安全措施... 繼續閱讀 >
201603-14 PHP安全-會話固定 會話固定 關于會話,需要關注的主要問題是會話標識的保密性問題。如果它是保密的,就不會存在會話劫持的風險了。通過一個合法的會話標識,一個攻擊者可以非常成功地冒充成為你的某一個用戶。 一個攻擊者可以通過三種方法來取得合法的會話標識: l 猜測l 捕獲l 固定 PHP生成的是隨機性很... 繼續閱讀 >
201603-14 PHP安全-會話數據暴露 會話數據暴露 會話數據常會包含一些個人信息和其它敏感數據?;谶@個原因,會話數據的暴露是被普遍關心的問題。一般來說,暴露的范圍不會很大,因為會話數據是保存在服務器環境中的,而不是在數據庫或文件系統中。因此,會話數據自然不會公開暴露。 使用SSL是一種特別有效的手段,它可以使數據在服務器和客戶端之間傳送時暴露的可能性降到最低。這對于傳送敏感數據的應用來說非常重要。SSL在HTTP之上提供了一個... 繼續閱讀 >