Rasmus 校園講座台大場:Simple is Hard

此篇文章最近更新時間為2008-11-18 22:03:16 目前共有3篇留言

關於作者 - JosephJ

任職於 Faria。喜好戶外運動、2008 年 5 月完成「跑步環島」。對於新技術跟程式碼有著強烈的偏執狂。

Simple is Hard
照片來源:http://www.flickr.com/photos/myhsu/3040774379/
相關資源:投影片 | 照片

在台大我看到與中央完全不一樣的 Rasmus! 中央場他給人的感覺是個很享受生活的 Life Hacker、 但在台大場則完全展顯技術實力的一面, 將 Scalability、Performance 與 Security 講得淋漓盡致、火力全開: Demo 了某網站登入頁的 XSS 漏洞、比較各 PHP Framework 的 Performance、 對於 Python, RoR 等語言也有犀利的評論,以及好用且非常重要的 Profiling 與 Benchmarking 工具。


Scalability:大型網站的實作

對於大型網站的實作,他非常反對建立單一層的 Front Controller。 不同類型的 Request 應該導到不同的 Server 群組來做處理。 以 Yahoo! 電子郵件這個服務來說,全部走 AJAX Request, 像是讀取郵件及列表、撰寫及發送電子郵件、以及存取通訊錄等不同的 Request。 裡面我們知道讀取郵件列表是操作最頻繁的,所以應直接由最多的 Server 群組來處理。 大部分的 Framework 都會在應用程式的層級建立一個 Front Controller,這樣的效果對 Performance 是很不好的。

也因此他主張讓 PHP 非常簡單就可以使用,不往 Framework 的方向來發展。 對於 Scalability,只要有對的 Architecture 及適當定義的 API,就會有非常好的效能。

Performance:效能面面觀

在這個部分,Rasmus 展示了很多的效能檢測的工具。 給我很大的啟示是永遠用 Benchmarking 的數字來證明你的問題所在,而不要空口說白話。 以下的工具大家一定要用啊:

Siege

siege, 測 response time 開發者可以使用 Siege 來偵測一個網站的 Response Time 與 Transaction Rate。 Rasmus 的測試範例是一個叫 Laconica 的網站,其實就是 Open Source 版的 Twitter。 Laconica 用了很複雜的方式來產生 header 的部份,但在 99% 的情況下都只會產生一種。 另外它還採用了 DBObject 這種方便使用的 Class,以上兩個作法讓程式的效能變得很差: Response time 為 0.27 秒、Transaction rate 為每秒 18.71 個。但把上面兩個問題解決後, 加上 APC Cache 與 include path 的微調,Response Time 變為 0.11 秒、Transaction rate 為每秒 46.63 個。
http://talks.php.net/show/ntu/10/

inclued.so

CakePHP 的 Performance inclued 是一個 PHP 的 extension,讓開發者可以檢查檔案間的 require 的關係、還有物件的繼承關係。 應盡可能減少 require_once、改為 require 的方式,可以節省很多的效能。
http://talks.php.net/show/ntu/16

Valgrind

超屌的 Profiler 圖表 Rasmus 說他無法理解一個 Programmer 竟然沒有使用 Callgrind 這樣的工具來做 Profiling。 他在開發時,一天要使用至少 30 次來檢查程式的 Bottleneck 為何。 那麼 Callgrind 究竟為何呢?它可以產出一份報表,顯示出你的 PHP 在每一個程序裡面耗費了多少 CPU 資源。
http://talks.php.net/show/ntu/25

另外就是有許多被人忽略的小地方,像是未設定 TimeZone 或者是不去處理 error log 像是 notice 或 warning 的部份都會影響 Performance。也有提到另一套 Profiling 的工具叫 XDebug。 有人說 PHP 很慢,但當你用了 Profiling 方式來證明時,數字會說話。 遠比像是 RoR 這些寫起來很漂亮的框架來得快上許多。

對於現有的 PHP Framework 他也用以上的效能檢測工具全部測試了一遍(請參考 http://talks.php.net/show/froscon08/24)。 以最簡單的 echo 'hello world' 的 Transaction Rate 為例 (每秒600個), 有名的 Framework 像是 CakePHP 居然慢了 15 倍(每秒約40個)。 另外像是 Symfony 或 Zend 同樣好不到哪裡去。 對於這些 Framework,Rasmus 說他不會反對大家用,但是他希望我們知道這些 Framework 都是解決一些特定的問題, 不是所有的問題都可以由一個 Framework 解決。如果你要用 Symfony,你必須完整地了解他、 找出它對你應用程式的 Bottoleneck、並且修改它成你所希望的,這樣才是對的作法。絕對不要照著說明書上的 Suggestion 就依樣畫葫蘆,這不是建立一個好系統的作法。


Security:令人吃驚的資安問題

超連結是很危險的! 這個部分 Rasmus 直接以一個有 XSS 漏洞的線上網站為範例,講解了一系列結合 JavaScript 的 XSS 攻擊模式。
http://talks.php.net/show/ntu/27

像是之前 Firefox 2.0.0.5 的 bug 在 mailto: 的 URL Handler 的部份沒有處理好。 讓 Hacker 可在惡意網站裡埋入執行碼 (cmd.exe) 對使用者的電腦造成危害。 同樣的問題仍有可能出現在使用者安裝的 Extension 中,像是 Skype 會自動將電話格式轉為連結, 但這樣的連結是否會對使用者造成危害?只能祈禱開發軟體的人不會有任何疏漏。

另外 Rasmus 提了許多 XSS 的類型(像是 HTML 屬性沒有雙引號、GET、POST、Cookie、PHP_SELF/REQUEST_URI、Header、img 的 src 可執行 JavaScript 等), 一個重點就是不要將沒有 filter 過的使用者輸入字串顯示在頁面上。 PHP 有提供一個 filter 的 extension, 可以讓你比較快速地做使用者資料的檢驗。

但即使如此,你還是要非常小心,因為即使字串經過 filter,還是可能有問題。 像是我們常用在標籤裡的 onClick 之類的事件處理、innerHTML、或者是 style 等, 都會以 eval 的方式直接對特殊編碼做轉換,提供給 XSS 另外一種可入侵的 pattern。

在演講中,Rasmus 也提到了 sla.ckers 這個 Security 網站, 上面會有人分享新發現的漏洞,Yahoo! 內部也定期有人會去觀看,確定這些漏洞不會對 Yahoo! 造成危害。



Comments

  1. josephj 2008-11-21 14:10:39
    很高興你們喜歡 :D
  2. laudieh 2008-11-20 14:10:37
    非常精彩,也謝謝 Joseph 的筆記! (Y)
  3. johnpupu 2008-11-20 10:54:35
    感謝你的分享~~
    這篇很受用
暱稱: 必填。
Email: 非必填。若填寫為不公開欄位,僅供站長參考聯繫。
內容: 必填。限 255 個字元以內。
驗證碼:
送出

Facebook Comment