4
一、前言 1995 年 丹 麥 的 Rasmus Lerdorf 開 發 出 Personal Home Pages(PHP) 後,PHP 已成為網站使用最 頻繁的程式語言,特別是 PHP 語言正好搭上企 業使用開放源碼工具的風潮。PHP 出現的頭 10 年,安全上已經聲名狼籍。PHP 是否能勝任企業 應用程式開發工具,或其快速開發能力與使用簡 便也能讓開發出來的應用程式足夠堅實與安全? 即便 PHP 正逐漸演變為滿足企業使用的程式語 言,但這樣的疑問在 2009 年仍被大量的提起。 也就是說,PHP 的開發人員的開發習慣並未和安 全劃上等號。 開發人員最需要的是嚴格的 PHP 撰寫規範,避 免落入使用不安全的功能窠臼裡。這些程式撰寫 規範最少要使用 PHP 5.3.0 之後版本,並進行相 關安全設定。撇開撰寫技巧,開發人員必須額外 關注 PHP 的安全性,而非紙上談兵。 接下來,我們會比較 PHP、Java 和 .NET 三種 程式語言,到底 PHP 是否適用於企業、PHP 的 安全性、以及探討企業軟體安全未來動向。 二、「適用」的定義 「判斷」某個程式語言是否適合企業使用之前, 我們先來「判斷」該如何「判斷」。首先,昇陽 科 技 公 司 (Sun) 區 別 Java SE(Java Standard Edition) 和 Java EE (Java Enterprise Edition) 之 不 同; 以 Java SE 建 立 起 Java 使 用 環 境 之 後,Java EE 提供企業更完整、穩定、安全、快 速的企業平台功能。再者,微軟也針對 .NET 的 範圍、安全性、穩定度、整體表現等提出類似看 法。本章節歸納出企業採用的必備條件如函式 庫、健全性、及效能等面向,同時分析 PHP、. NET、Java 於各面向的優劣評比,最後再帶出 資安議題。 網站語言醜小鴨: PHP 之安全性 探討 原作者:Edward Lee, Brian Chess, Jacob West(Fortify Software 顧問 ) 翻譯整理:康凱雄 產品顧問、方馨瑩 業務代表(叡揚資訊 資訊安全部) 叡揚 e 論壇 / 61 期/ 2010.8 38 技術 e 專欄 Technology

網站語言醜小鴨: PHP之安全性 探討 · 為「語言安全性」與「安全實作方式」來看, 在3.1節,我們討論語言安全性,開發人員出錯 的可能性如何(例如新手使用C語言最容易造

  • Upload
    others

  • View
    0

  • Download
    0

Embed Size (px)

Citation preview

Page 1: 網站語言醜小鴨: PHP之安全性 探討 · 為「語言安全性」與「安全實作方式」來看, 在3.1節,我們討論語言安全性,開發人員出錯 的可能性如何(例如新手使用C語言最容易造

一、前言

1995 年丹麥的 Rasmus Lerdorf 開發出 Personal

Home Pages(PHP) 後,PHP 已成為網站使用最

頻繁的程式語言,特別是 PHP 語言正好搭上企

業使用開放源碼工具的風潮。PHP 出現的頭 10

年,安全上已經聲名狼籍。PHP 是否能勝任企業

應用程式開發工具,或其快速開發能力與使用簡

便也能讓開發出來的應用程式足夠堅實與安全?

即便 PHP 正逐漸演變為滿足企業使用的程式語

言,但這樣的疑問在 2009 年仍被大量的提起。

也就是說,PHP 的開發人員的開發習慣並未和安

全劃上等號。

開發人員最需要的是嚴格的 PHP 撰寫規範,避

免落入使用不安全的功能窠臼裡。這些程式撰寫

規範最少要使用 PHP 5.3.0 之後版本,並進行相

關安全設定。撇開撰寫技巧,開發人員必須額外

關注 PHP 的安全性,而非紙上談兵。

接下來,我們會比較 PHP、Java 和 .NET 三種

程式語言,到底 PHP 是否適用於企業、PHP 的

安全性、以及探討企業軟體安全未來動向。

二、「適用」的定義

「判斷」某個程式語言是否適合企業使用之前,

我們先來「判斷」該如何「判斷」。首先,昇陽

科 技 公 司 (Sun) 區 別 Java SE(Java Standard

Edition) 和 Java EE (Java Enterprise Edition)

之不同;以 Java SE 建立起 Java 使用環境之

後,Java EE 提供企業更完整、穩定、安全、快

速的企業平台功能。再者,微軟也針對 .NET 的

範圍、安全性、穩定度、整體表現等提出類似看

法。本章節歸納出企業採用的必備條件如函式

庫、健全性、及效能等面向,同時分析 PHP、.

NET、Java 於各面向的優劣評比,最後再帶出

資安議題。

網站語言醜小鴨:

PHP 之安全性探討

原作者:Edward Lee, Brian Chess, Jacob West(Fortify Software 顧問 )

翻譯整理:康凱雄 產品顧問、 方馨瑩 業務代表(叡揚資訊 資訊安全部)

叡揚 e 論壇 /61 期 /2010.8 月38

技術e

專欄 Technology

Page 2: 網站語言醜小鴨: PHP之安全性 探討 · 為「語言安全性」與「安全實作方式」來看, 在3.1節,我們討論語言安全性,開發人員出錯 的可能性如何(例如新手使用C語言最容易造

1. 函式庫涵蓋廣度

企業所用的系統程式語言非常複雜,他們希望採

用的 framework 能簡化程式碼,並且元件可以

重複使用。設計良好的 framework 已經考量常

用的演算法與資料結構,開發人員程式碼可以精

簡,管理起來也比較方便。

Java EE 函式庫涵蓋度很好,而且開發人員都

有許多第三方函式庫及 framework 能選擇使

用,這些函式庫與 framework 讓開發人員增

加資料庫的使用授權認證與管理功能。.NET

framework 的第三方函式庫雖不及 Java EE,但

因微軟函式庫涵蓋度很好,開發工具完備,開發

彈性一樣深受開發人員喜愛。

PHP 內建的函式 (function) 與方法 (method) 已

經很多,但是開發人員需要的更多。在開放源

碼裡,PEAR 與 PECL 專案是為了提供 PHP 核

心函式庫擴充功能而生。PEAR 與 PECL 套件

(package) 的加入,PHP 開發人員多了數千種

第三方函式庫的支援。新版的 PHP 核心函式庫

已經納入許多新的功能。例如 PHP 6 現在納入

XML 函式庫,取代原來的 PECL 套件。簡單來

說,現在的 PHP 開發人員想要的函式庫幾乎都

已經有了。

提到資安,第三方函式庫能給開發人員最有力的

支援。像是 Hibernate、CakePHP 與 Doctrine

這 類 的 物 件 關 連 式 對 應 (Object-Related

Mapping) framework 函式庫,可以對資料庫

建立參數化 (parameterized) 的查詢語法,限制

變數資料型態,限制使用者的存取權限。另一方

面,第三方函式庫更新的速度其實有限,PHP

就沒有 MVC 架構,而其他程式語言早就支援,

看來使用方便的重要性還是大於資安議題。

2. 穩定性與效能

一般來說,網頁開發平台沒有所謂的「穩定性」

及「效能」標準,所以我們以大型商業建置案例

做為「標準」。企業應用程式必須處理大量資料,

系統故障時間必須降至最低,反應時間必須合

理;這表示程式語言至少需具備「穩定」和「效

能」以應付龐大資料量。以「穩定」和「效能」

來說,Java 於業界有口皆碑,事實上大部分的

應用程式伺服器 (application server) 以 Java

撰寫。而微軟陣營,流量最大的網站包括 msn.

com, live.com. Microsoft.com,皆以 .NET 語

言開發。此外,不少財政機構、電子商務平台、

新聞媒體組織等都是 .NET 的成功案例。PHP

也不惶多讓,知名網站如 Yahoo、Facebook、

MySpace、Wikipedia 等使用 PHP 語言開發。

根據統計,世界十大流量網站,使用 PHP 的比

例居各語言之冠(如表一)。既然 PHP 使用率如

此高,不管是穩定性或效能,早已不證自明。然

而,若上述範圍擴大至資安面,PHP 似乎又多了

些不確定性。

三、PHP 的安全性

說到安全性,PHP 名聲不算太好;但若追根究

底,是否 PHP 本身漏洞百出?或者只是 PHP 使

網站 語言

Google Python

Yahoo! PHP

YouTube Python

Facebook PHP

Windows Live ASP .NET

Microsoft Network (MSN) ASP .NET

Wikipedia PHP

Blogger.com Java

MySpace PHP

Baidu PHP

表一:十大流量網站及其使用語言

叡揚 e 論壇 /61 期 /2010.8 月 39

Page 3: 網站語言醜小鴨: PHP之安全性 探討 · 為「語言安全性」與「安全實作方式」來看, 在3.1節,我們討論語言安全性,開發人員出錯 的可能性如何(例如新手使用C語言最容易造

用比率高,使得出錯量相對較高?我們將問題分

為「語言安全性」與「安全實作方式」來看,

在 3.1 節,我們討論語言安全性,開發人員出錯

的可能性如何 ( 例如新手使用 C 語言最容易造

成「緩衝區溢位 (buffer overflow)」的漏洞 )。

安全實作方式,換句話說就是開發人員可實作使

用的安全功能為何,我們要研究 PHP 函式庫,

解析他的安全實作能力。在 3.2 節,我們將從

Fortify Open Review 專案裡統計 PHP 開發的

應用程式弱點,並作為討論的基準。

1. 語言安全性

早期版本的 PHP 因功能強大,方便性夠,連帶

使開發人員忘了注意安全問題。隨著 PHP 越來

越成熟,許多功能預設關閉,或乾脆完全移除。

本節後續篇幅將討論 PHP 最危險的功能,使

PHP 安全性惡名昭彰的功能。

� Register Globals

觀察程式語言安全的一個重要的點,就是這個語

言如何保護程式碼與資料。程式語言不應讓程式

使用者隨意的更動程式碼與資料。PHP 有一個

register globals 功能,使得程式開發人員無法

輕易安全的處理使用者的輸入資料。這個功能會

自動產生變數,將 HTTP request 收到的資料定

義於變數數值內。所以,攻擊者也可以如法炮製

產生變數數值。PHP 3 可以將此功能關閉,但

是在 PHP 4.2.0 又恢復。好消息是,在 PHP 6

已經將此功能移除。沒有經驗的開發人員遇上這

樣的功能,其實是件雪上加霜的壞消息。現今大

部分有危機意識的開發人員已經可以調整心態,

不使用這樣危險的撰寫方式。

� SafeMode-Sandboxing

早期版本的 PHP 提供數種「安全」選項,應用

程式可使用「沙盒」這樣的安全機制。PHP 的

安全模式用在相同主機上隔離不同的應用程式環

境。然而 PHP 的沙盒功能並不完備,甚至有可

能被避開,導致管理者與開發人員對於 PHP 的

安全機制有所誤解。

Java 開發人員可以使用 Security Manager 隔離

應用程式,但大多數的開發人員並不重視這項功

能。同樣地,.NET 允許開發人員設定程式碼存

取安全原則, 但是開發人員大都只使用預設原

則。

沙盒可增進應用程式的安全強度,但是安全原則

必須由有經驗的人士設定方可達到最大效力,所

以不該視沙盒為最主要的防線。原本可增進安全

強度的安全模式,到 PHP6 被移除了。

� Allow_URL_Fopen 功能

PHP 有一項功能讓開發人員存取 URL 像開檔一

樣的簡單。這個功能看起來方便,但容易釀成大

禍。例如 Web 應用程式允許使用者指定 PHP 檔

案並加以執行,這個功能給駭客有機可乘,指定

主機上已存在的檔案並加以執行。如果主機的檔

案系統的存取控制有適當的設定,那這個漏洞對

系統不會有多大影響。但是 PHP 可以 include

遠端檔案的機制卻可對系統造成相當大的危害,

因為遠端檔案不受主機的存取控制的限制,駭客

可以將遠端檔案注入主機並加以執行。

PHP 5.2.0 版本已經可關閉 Allow_URL_Fopen

功能,可限制遠端檔案注入弱點。但是 Allow_

URL_Fopen 已經在 Java 與 .NET 之外開了一扇

不同的弱點之門。

� 神奇的引號功能

PHP 在版本 5.0 之前,開發人員通常會使用動

態數值,字串相加方式組成 SQL 語法字串,這

樣的組成方式非常容易遭受 SQL 注入攻擊。

叡揚 e 論壇 /61 期 /2010.8 月40

技術e

專欄 Technology

Page 4: 網站語言醜小鴨: PHP之安全性 探討 · 為「語言安全性」與「安全實作方式」來看, 在3.1節,我們討論語言安全性,開發人員出錯 的可能性如何(例如新手使用C語言最容易造

PHP 稱為神奇引號功能的 addslashes() 函式,

是 PHP 團隊嘗試過濾動態組成 SQL 字串內容的

一項工作。神奇引號功能函式 addslashes() 可自

動地在單引號「’」、雙引號「”」、反斜線「\」

與空字元之前加入反斜線「\」符號。神奇引號

功能可自動塞入反斜線,開發人員若非用於處理

SQL 字串,就必須拿掉這些多出來的反斜線。

神奇引號功能並非 SQL 注入攻擊的萬用解藥,

他對資料後製處理的複雜度也相對提高,在 PHP

5.3.0 版神奇引號已經不受重視,在 PHP 6 這個

功能也已被移除。

2. PHP 安全性

本節以 Fortify Open Review 專案大量的 PHP

專案檢核,深入討論 PHP 安全實作的一些問題。

Fortify Open Review 專案以找出熱門開放源

碼軟體弱點為工作主旨。Fortify Open Review

專案使用 Fortify SCA 進行掃描,為了撰寫本

文,我們依據 freshmeat.net 網站的 10 大 PHP

專案挑選掃描標的:phpMyAdmin、Gallery、

Squ i r r eMa i l、T i k iW i k i、Doc uW i k i、

phpBB、PHPP r o j e k t、WebCa l e n d a r、

eZPublish 與 Group-Office。 這 些 專 案 共 有

的 弱 點 包 括:Cross-Site Scripting、SQL

Injection、System Information Leak、Path

Manipulation、Header Manipulation、use of

dangerous function 與 code injection 等問題。

表二總結了所有找出的弱點問題。

四、結論

PHP 需要的是全新的設計。經過我們的分析,雖

然 PHP 正逐漸成形為安全與堅實的開發環境,

但現今的 PHP 專案正反應了 PHP 開發社群並未

趕上最新的安全技術。

開發時期使用到的第三方元件可以為 PHP 專案

開發帶來安全上的好處。軟體系統規模越來越

大,可重複使用的元件就越能彰顯他們的價值。

像是 OWASP 提供的安全專用的 API OWASP

Enterprise Security API(ESAPI) 能解決特定

的安全問題,如 Input Validation,就是這些第

三方軟體崛起的最好時機。可重複使用的元件在

鼓勵開發人員注重安全開發佔有重要的地位。換

句話說,當第三方元件採用不良的安全設計,追

蹤問題的困難度相對更高,因為元件與程式碼中

間通常隔了一層抽離層。對使用者來說,軟體開

發社群必須持續不斷精進安全技術能力,打造夠

出安全的元件。

弱點類別 專案數

Cross-Site Scripting 8

SQL Injection 6

System Information Leak 5

Path Manipulation 5

Dangerous function 4

Header Manipulation 3

Dangerous File Inclusion 3

code injection 1

叡揚 e 論壇 /61 期 /2010.8 月 41

表二 : 各類別找出的弱點問題