問卷問題 === ### 實作,並附上GitHub link `*` > github link(偷懶版): https://github.com/TerrenceChao/universe-tech > github link(laravel版): https://github.com/TerrenceChao/lara-universe-tech >(可檢視 commit 時間。) > > 實作問題: > https://hackmd.io/@terrence32/H1yRGAeJI > [color=#13db88] <br/> ### 請以教學 Junior 角度,描述 PHP 的 Trait 及 Generator 是什麼? `*` > Trait: > 如果說 '繼承' 是 'Is A XXX', 那 Trait 就是一種 'Has A XXX' 的概念。 > [color=#13db88] > Generator: > 如果你需要有一個可以停 8 種顏色車輛的停車場,有兩種辦法: > 1). 停 8 個不同顏色的車輛 (共 8 台車); > 2). 學會噴漆,知道如何把‘ 1 台車子' 漆成 8 個不同顏色,這時你只需要一個停車位即可。 > 在程式中印出 1 ~ 100, 有兩種辦法: > 1). 你可以儲存一個有 100 個元素的陣列,陣列內容就是數字 1~100, 循序印出; > 2). 你只需要利用一個變數 X,不斷的遞增 (X++) 即可。 > [color=#13db88] > > Generator 就是第 2) 種辦法,他解決了空間複雜度,很大程度的節省記憶體空間。 > [color=#13db88] <br/> ### Laravel 的 Contianer 是什麼? `*` > 方便利用依賴注入 (無論是 interface 還是 class) 以實現鬆耦合和容易擴展的一種機制。 > [color=#13db88] <br/> ### 使用第三方 Composer 套件時,若該套件發生緊急 bug 需要即時修正,可以怎麼做? `*` > step 1: 在專案某個合適的路徑下新增資料夾,比如命名為 Extension/ > step 2: 從 project-root/vendor 下找尋該套件 (ex: pkgA/),將套件整個複製至 Extension/ 資料夾下。(Extension/pkgA/) > step 3: 將套件的 dependency 載入進來以後,初步進行舊有的測試。 > step 4: 依據需求針對程式邏輯修正, 調整。 > step 5: 檢視原本套件的 test cases, 依據需求並視情況調整,增加新的 test cases。 > step 6: 調整好以後,原本引入該套件的地方,暫時改為從 Extension/pkgA/ 引入。 > [color=#13db88] <br/> ### 請說明 SQL Injection、XSS、CSRF 的攻擊原理,以及防禦的方式。 `*` > **SQL Injection:** > 刻意的在 request 中的可帶參數或輸入值 (ex: querystring, body...) 中植入惡意代碼,使 SQL 語句執行非預期的行為。比如: > **url?productId=1 OR 1=1**, 可能導致取得所有的 product, > **url?productId=1; DROP TABLE XXXX** 可能直接刪除整個 TABKE, > **url?user=XXXX&password=XXXX OR 1=1** 不需經過授權即可登入取得機敏資料... 等。 > > **防禦 SQL Injection:** > 1. 過濾參數和輸入值,去除空白(trim)。 > 2. 檢查字元格式。(ex: int, string, bool) > 3. 使用正規表示式檢查輸入的字元。 > [color=#13db88] > > **XSS:** > 利用 JavaScript 代碼造成直接或間接的在暗地裡執行有害行為。 > 比如說在未檢查字元的輸入欄位中輸入一段 <script>...</script> > > **防禦 XSS:** > 前後端都需要針對輸入值做檢查,方式和上述 防禦 SQL Injection 的方式類似,但特別針對 HTML 中所定義的標籤。 > [color=#13db88] > > **CSRF:** > 有天小明考試不及格,但他需要在考卷上留下父母的簽名隔天跟老師交代,於是把聯絡簿挖了一個洞(方便簽名的大小),把考卷墊在聯絡簿下,使得他爸在簽聯絡簿的時候以為「真的簽在聯絡簿上」,其實他爸是簽在考卷上,隔天交給老師...這就是 CSRF. > CSRF 就是在已登入的合法網站頁面中,用戶在非法 domain (不同於合法網站的 domain) 下呼叫了合法網站的 API. 使得用戶在“不知情”的情況下執行合法行為。 > > **防禦 CSRF:** > 1. 在適當情境下使用圖形驗證或簡訊驗證碼。 > 2. 限定後端僅能接受指定 domain 的 request, 然後再透過後端產生 csrftoken, 使得每一次的 request header 都帶上此 token 和後端加以比對 . > [color=#13db88] <br/> ### (加分題)承上,請列出您所知道,其他針對網頁/網路傳輸的攻擊手法,說明其原理以及防禦方式。 > 暫略. > [color=#13db88] <br/> ### 請說明您曾經碰過最有挑戰性的專案,簡述當時碰到的困難點,以及最後如何解決問題。 `*` > 目前手中的 project. 目標是要做一個 FB Messenger. > **Problem 1:** > 各個服務之間皆透過 http 要求響應。但這樣的響應是同步的,也就是 request 勢必要等待,會拖慢速度。 > > **Solve 1:** > 為了要使得速度夠快,將其中一個服務的 http 溝通機制改為異步,並利用 queue 機制當作緩衝,在累計一定量的資料後(資料包含上一級服務的多個 request),再一次發送 http request 至下一級服務,減少 request 的總次數,另外得確保重試機制運作正常。 > [color=#13db88] <br/>