跳到主要內容

發表文章

目前顯示的是有「http」標籤的文章

如何使用Go語言實作RSETful Server: Creating a RESTful API With Golang

前言 要使用Go建立一個RESTful的Web Server非常地簡單, 只要使用內建的模組net/http就能輕易達成 首先, 匯入相關套件 package main import ( "encoding/json" "net/http" ) 添加兩個路由"/", "/users", 以及實作兩個handler來處理對應的請求 func handler(w http.ResponseWriter, request *http.Request) { w.Write([]byte("Hello world.")) } func usersHandler(w http.ResponseWriter, request *http.Request) { data := make(map[string]interface{}) data["users"] = []interface{}{ map[string]interface{}{ "name": "andy", "pwd": "123456", }, } jsonByte, _ := json.Marshal(data) w.Header().Set("Content-Type", "application/json") w.Write(jsonByte) } func main() { http.HandleFunc("/", handler) http.HandleFunc("/users", usersHandler) ... 給定要聽的port http.ListenAndServe(":3000", nil) 測試 localhost:3000  測試localhost:3000/users...

Cookie與Session的差別 - Difference Between Cookie and Session

前言  HTTP是個Stateless的協議, 意思是說Client端發請求時, 並無法得知上一個請求的結果, 比如說做完登陸後, 網頁跳到了商品頁面時, 系統怎麼知道使用者登錄過了, 所以我們需要一種方式來儲存資料 粗略的講Cookie和Session是一種資料儲存的方式, 用來紀錄使用者在某特定網站下的活動資訊, 讓無狀態的HTTP協議擁有記憶的能力 Cookie  將在資料存在Client Side, 可以被看, 被改(除非用Signed Cookie, Server side拒絕改過的cookie), 屬於較不安全的儲存方式, 所以通常用來存放敏感度低的資料, 像是Remember Me的資訊 若要防止Cookie被竄改的話, 可以用簽章的方式確認資料是否被更動過, 而Server Side發現簽章有問題時再拒絕請求 基本上簽章的數位長度足夠的話,也不太需要擔心被偽造 Session  將資料存在Server Side上, 相較於Cookie來說算是比較安全的儲存作法 通常Server Side會返回一組Session Id 給Client存到Cookie裡面, 接下來的請求會根據Id去把先前存放的資訊給挖出來  儲存 Session 有下列方法:  1. Memory  2. Cookie  3. Cache  存Memory 會有Memory Leak的風險, 存Cookie會使的請求傳輸量變大, 所以通常正式環境主要還是存在Redis Cache中

簡易教學-如何使用burp proxy來攔截封包

Title: How to Use Burp Suite 前言 嗨~ 大家好, 今天要分享如何在Windows 10上使用Burp Suite來攔截封包, 以及進一步地演示如何修改HTTP請求的內容, 希望這篇文章可以幫助到同為網頁開發者的朋友或是正在學習資訊安全的朋友們 首先, 下載 & 安裝 Burp Suit Community https://portswigger.net/burp/communitydownload Step 1. 打開Burp Suit建立暫時用的專案(Temporary Project) 一直下一步 > 最後選擇 Start Burp Step 2. 設定Proxy 在鍵盤上按下Windows鍵 > 輸入Proxy > 按下Enter 進入設定頁面後, 把Proxy Address 和 Port 的資訊填上, 如下 基本上, 環境都設好了 ... 接下來, 要試看看有沒有成功攔截封包 測試 沒有測試環境的朋友, 可以使用以下網站來當練習的對象,  雖然這網站主要目的是讓人學習XSS相關技術用的, 但由於它提供了一個非常簡單的表單功能, 所以很非常適合讓我們用來模擬POST請求 網站:  http://xss-quiz.int21h.jp/ 按下Search後, 可以在 Proxy > Intercept 裡看到剛剛表單送出的參數 lady gaga 修改請求內容 我們當然也可以滑鼠左鍵去修改表單內容 最後按下Forward將請求送出 結果 由於剛剛的請求內容被植入了一段javascript的程式碼, 所以結果會出現一個alert

Azure Logic Apps 如何設定Timeout來限制Action的執行時間: Logic App Timeout

Title: how to set timeout in Azure Logic App 前言 對開發人員來說, Logic Apps是個非常好用的工具, 特別是有DevOps需求, 或是想做自動化的開發者來說, 可以節省許多時間寫一堆Code或是腳本去串接服務 設計Logic Apps 直接在Azure Portal上定義Action的種類, Input是什麼就好了, 底層的事情就交給Azure 來幫我們處理 比如說, 我們可以設一個排程, 每隔一段時間就發個請求去搓一下某個Service是否還活著 Timeout 在某些情況下, 我們可能不希望Action的執行時間過長, 假設我們預期最多不超過10秒, 但因為訪問的端點有可能發生異常, 造成Actionc還傻傻地等待Server的回應 這種情況我們可以設Timeout讓Logic App把超時的Action殺掉 首先, 右鍵 > 選擇Settings Step 2. 找到Timeout的欄位設定Duration 這邊要注意填入的時間要使用ISO 8601 的格式 ISO 8601的規則  P (Period) T(duration) H (Hour) M(Minute) S(Second). 如果Timeout想設20秒的話可以表示成PT20S 設定好之後選擇Done ... 接下來就可以存檔跑看看結果了 ... 結果 如果有成功跑完的話, 會出現綠色小勾勾, 但如過被Timeout的話就沒有

使用Powershell處理Http Reqest

使用Powershell處理Http Request (How to handle HTTP request in powershell ) 前言 在Linux的世界裡我們可以用cURL發請求去取得Web 上的資源, 而在Windows則可以使用Invoke-WebRequest做到相同的事情 語法  Invoke-WebRequest -Uri $AppUrl -Method Get 例如 $request = 'http://andy.lai.org/ws/2/artist/5b11f4ce-a62d-471e-81fc-a69a8278c7da?inc=aliases&fmt=json' $response = Invoke-WebRequest $request 得到的response會長這樣 StatusCode : 200 StatusDescription : OK Content : [{"answer":{"action":{"type":"","uri":""},"image":[],"video":[],"title":"","text":"隨便就可以打開了","speak":""},"intent":"itent_on_computer","slots":[]},{"answer":{ "action":{"type":"","uri":""},"image":[],"v... RawContent : HTTP/1.1 200 OK Access-Control-Allow-Origin: * Connection: keep-alive Content-...

C# WEB API 無法回傳HttpStatusCode NotModified(304)

C# WEB API 無法回傳HttpStatusCode NotModified(304) 實務上在實作WEB API時, 通常會根據結果去回傳合適的HTTP Status Code(狀態碼), 當請求失敗時我們可以從狀態碼清楚地得知原因是什麼 有些狀態碼有其特殊的規範, 如 304 NotModified 如下所示, 這個API 若檢查到POST過來的資料(Activity)早已存在資料庫中時, 會回傳304還有碩誤訊息 "item exist already"         public async Task <IHttpActionResult> Post([FromBody]Activity activity)         {             if(Context.Activities.Any(a=>a.Id == activity.Id))             {                 return ResponseMessage(Request.CreateResponse(HttpStatusCode.NotModified, "item exist already" ));             } 而這是一個錯誤的示範 當使用POSTMAN測試時會報錯 Could not get any response There was an error connecting to   http://localhost:58671/api/history . Why this might have happened: The server couldn't send a response: Ensure that the backend is w...

淺談HTTP的快取機制

Cache for what? 簡單的說是為了節省流量 > 後端不能總是一直回復同樣的內容吧, 非常浪費資源 所以我們可以在Client端把訪問過的內容快取起來, 待下次要用時再直接從這兒拿出來 Expire 目前存在的方法是在HEADER加入Expires日期 Expires: Wed, 21 Oct 2017 07:28:00 GMT 告訴瀏覽器指定期間內, 相同的請求的話, 就去讀快取 Cache Control, max-age 除了指定明確日期之外, 我們也可以指定保存期限 Cache-Control: max-age=30 告訴瀏覽器, 快取的資料只有三十秒的保存期限 除此之外, 我們也可以在HEADER加入檔案的最後修改時間 Last-Modified Cache-Control: max-age=31536000 Last-Modified: 2017-01-01 13:00:00 目的是, 資料過期後, 瀏覽器可以用這個日期去詢問伺服器, 快取內的資料有沒有必要更新 If-Modified-Since: 2017-01-01 13:00:00 如果資料不變, 當然就繼續用嘍 除了用日期外, 另一個方法是使用ETag來判別檔案有沒有被修改 ETag 簡單的說, ETag有點像檔案內容的hash值 當檔案一改變ETag就會不一樣 所以瀏覽器可以根據後端給的ETag, 詢問伺服器使否要更新快取的內容還是繼續沿用原本的資料 Server Response Header ETag: "25749G2"  Browser Request Header if-None-Match: 25749G2