利用第三方程式庫與技術框架
大多數軟體專案,尤其是使用開源技術,會使用第三方程式碼。這種做法帶來許多好處和一些挑戰。
不重新發明輪子
在專案中可重複使用的軟體數量是巨大的。這可能是開源的程式庫或框架,也可能是商業軟件設備或應用程序,也可能是組織內已經寫好的程式碼。最後非常少的軟體開發專案會從頭開始開發。
在可能時重複現有程式碼是有理的,並可開發軟體所花費的時間。這是一般非特定領域的部分,是使用第三方程式庫的好例子。例如,用於管理:
- 時間和日期
- 金錢
- 路由的HTTP請求
- 呈現 HTML
- 數學與統計
策略
還有一些重複是用程式碼的策略,在此描述其中一部份。在許多情況下,一個專案可能會使用多於一種策略,但是在所有情況下,有自覺地做是值得的。
供應商的依賴性
管理依賴性的其中一種方法是簡單地將程式碼複製到專案中。如果採取這種方法要注意不是所有的開源軟體授權允許這一點,而其他授權規定可能會強迫你以同樣的方式授權你的程式碼。
一般來說這種方法應該是最後的手段。供應商提供(如其所稱)會中斷與第三方程式碼的聯繫,這意味跟踪上游程式碼的變化變成人工(可能緩慢,不具一致性且耗時的)工作。供應商提供程式碼往往很快會過時,理想中該應避免並使用更結構化的方法。
信任但要核查
常見的方法,特別為開源社群所使用,是使用依賴性管理工具在運行、部署或編譯時自動取得第三方程式碼。此方法透過廣泛的測試,通常是自動化測試,可保證第三方程式碼是可運行的。
這些測試應包括安全性能測試。例如,如果用於生成表單的程式庫會引入 SQL 注入脆弱性,那麼驗收測試應該會失敗。在此模式下進行核查是重要的,而不是完全信任所依賴的第三方程式碼。信任正在使用的特定的程式碼和版本,而不是一般的程式庫或框架。不同的服務根據其風險所適合方式也不同。
分支的相依性
有時候,直接信任第三方程式庫不代表提供所需要的認證。在這種情況下,其中一種方法是分支或複製第三方程式碼到你所管理的獨立程式庫中。這樣可以讓上游程式碼的更新與組織程式碼的更新分離,但仍保持與原來程式碼的關係。您的程式碼分支可以週期性地更新,或者根據新功能需求更新。更新你的分支程式碼過程可能包括的程式碼審查、病毒掃描、針對已知漏洞檢查等。此時也可能根據內部需求修改程式碼。
這種方法和上述信任但要核查方法相比,缺點是需要花時間管理分支程式碼,並和上游程式碼同步。不與上游程式碼同步更新會有如上述外包方法所具有的花費與問題。
不同程式語言的社群是不同的
值得注意的是,不同的程式語言社群往往對相依性有不同看法。例如 Ruby 或JavaScript 社群,有許多解決小問題的程式庫。這會讓專案很快和上百個程式庫產生相依性。例如主流的的Ruby on Rails框架在這篇文章撰寫時已經有31個外部相依程式庫。
在其他社群比較少有這麼多的相依性,但這往往意味著一個較全面的標準程式庫(如Python),或更大型的相依性關係(如JAVA)。
最終,所有程式社群都存在相依管理的問題,但值得注意所使用工具和方法是不同的。
依賴性管理工具
大多數程式語言都有些流行的依賴性管理工具。下面列出不同語言的相依性管理工具。
- Maven (JAVA)
- Bundler (Ruby)
- Pip (Python)
- sbt (Scala)
- Leiningen (Clojure)
- Composer (PHP)
- Bower (JavaScript, CSS)
管理使用第三方程式碼的風險
在專案引入第三方程式碼,很可能會引入已知或未知的程式碼脆弱性。為了降低風險,接受它是重要的。有時可能需要對第三方程式碼進行審查,有時良好的測試就足夠。
工具
在一些語言中,存在商業工具對第三方程式碼的脆弱性提出警告,以建立對程式碼的信任。
這些通常是根據公開的脆弱性揭露表,所以這些脆弱性可被單獨追蹤。
電子郵件表
大多數操作系統、供應商和一些自由軟體專案提供揭露脆弱性的電子郵件表,提醒有關第三方程式碼的安全漏洞。你應該總是注意在專案中所使用軟體的相關電子郵件表。一些常見的例子包括:
以上是少部分例子。建議讓這些電子郵件轉寄給內部相關人士,而不是依賴於一個人去提醒其他人。
延伸閱讀
翻譯:Pei Cheng
校稿:Sharon Wang
原始出處:https://www.gov.uk/service-manual/making-software/dependency-management.html