---
# System prepended metadata

title: 問卷問題

---

問卷問題
===
### 實作，並附上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/>