# Http Method(Http方法)介紹 和 跨來源資源共用(CORS) ###### tags: `資安` 在瀏覽網頁時,其實會用各種Http方法去與Web伺服器取資料或是送資料,最常見的就是Get方法;其次則是Post,用來傳遞資料 兩者最大的差異就是GET會在網址列上顯示參數,Post不會 但Http的方法其實不只Get和Post,以下有更多說明 ## HTTP/1.1 協定 這邊定義了八種方法,以不同方式操作指定的資源: - OPTIONS:這個方法可使伺服器傳回該資源所支援的所有 HTTP 請求方法。 就是詢問這個主機提供哪些 Http 方法讓人使用,但也可以被惡意攻擊者刺探敏感資訊,通常弱點掃描檢測到都會建議關閉此方法。 - HEAD:可以在不必傳輸全部內容的情況下,就可以取得其中「關於該資源的資訊」(元資訊或稱元資料)。 以 html 來說,都有一塊<head>標題或css等資訊</head>,HEAD就是只取這一塊資料。 - GET:向指定的資源發出「顯示」請求。使用 GET 方法應該只用在讀取資料,而不應當被用於產生「副作用」的操作中。 - POST:向指定資源提交資料,請求伺服器進行處理(例如提交表單或者上傳檔案)。資料被包含在請求本文中。 - PUT:向指定資源位置上傳其最新內容。 - DELETE:請求伺服器刪除 Request-URI 所標識的資源。 - TRACE:回顯伺服器收到的請求,主要用於測試或診斷。 - CONNECT:HTTP/1.1 協定中預留給能夠將連線改為管道方式的代理伺服器。通常用於 SSL 加密伺服器的連結(經由非加密的 HTTP 代理伺服器)。 ## 先導請求 Preflighted requests javascript允許向目前的網站或外部網站傳送資料,傳送請求到外部網站時,可能會攜帶使用者資料,所以要先進行 **先導請求 Preflighted requests** 先導請求會先以 HTTP 的 OPTIONS 方法送出請求到另一個網域,確認後續真實請求是否可安全送出。 當符合以下其中一種條件時,會送出先導請求: 1.使用非簡單方法(GET, HEAD, POST)。 2.使用以下類型除外的標頭:Accept, Accept-Language, Content-Language,Content-Type 非為下列 application/x-www-form-urlencoded, multipart/form-data, 或 text/plain 其中一種(上述類型為簡單標頭,且皆不區分大小寫)。例如 POST 請求連帶的資料是 application/xml 或 text/xml 的 XML 類型資料,那麼先導請求就會先送出。 3.請求中有自訂義標頭,例如自訂義一個 X-PINGOTHER 標頭。 ## CORS 跨來源資源共用(CORS) 是有關於資訊安全的議題,我們可以想一個情況 如果javascript可以任意的修改自己的網頁,也可以在背景執行且隨意地從別的網站擷取資料。 那就可以做出以下攻擊 1. 做一個 網頁,用 javascript ,擷取 www.網路銀行.com/輸入帳號密碼的畫面 並且貼到我的網頁上 2. 輸入帳號密碼按下送出後,把密碼傳回自己的資料庫收藏 3. 把網址傳給其他人 4. 如果沒注意到網址不一樣,輸入了正確的帳號密碼,那我就取得正確的帳號密碼了 這樣子用 javascript 輕易地做一個完全相同的假網站,誘使沒注意到網址不同的使用者輸入帳號密碼,幾乎是只要改網址就可以立刻做出多個假網站。為了防止這種情況,網站伺服器需要設定允許 CORS ,才能授權讓跨網站的 javascript 取得資訊。 ### 在 IIS 上設定允許 CORS 跨站請求 * 選擇要開啟的 IIS 站台 * 點 HttpResponseHeader(Http回應標頭) 然後有2類情況,如果希望所有網站都可以跨站請求,要使用這個 **Access-Control-Allow-Origin** 共有2種值: ``` * 所有網站都可以連 uri 指定的網站才能連 (不允許多組) ``` ### X-Frame-Options 如果不要用 javascript,也有另一個 iframe 的方式可以擷取其他網頁,假設不希望自己的網頁被別人用iframe擷取,或是只希望自己的網站可以被 如果要設定同網站才能連,要使用這個 **X-Frame-Options** 共有三種值: - DENY 表示文件無論如何都不能被嵌入到 frame 中,即使是自家網站也不行。 - SAMEORIGIN 唯有當符合同源政策下,才能被嵌入到 frame 中。 - ALLOW-FROM uri 唯有列表許可的 URI 才能嵌入到 frame 中。 ## 參考資料 * CORS Part IV. Web Application Security https://docs.spring.io/spring-security/site/docs/4.2.x/reference/html/cors.html * 跨站 HTTP 請求 HTTP access control (CORS) [*https://developer.mozilla.org/zh-TW/docs/HTTP/Access_control_CORS*](https://developer.mozilla.org/zh-TW/docs/HTTP/Access_control_CORS) * [HTTP]Http GET、POST Method 比較 [*https://dotblogs.com.tw/marcus116/archive/2011/05/29/26428.aspx*](https://dotblogs.com.tw/marcus116/archive/2011/05/29/26428.aspx) * 超文本傳輸協定 [*https://zh.wikipedia.org/wiki/*](https://zh.wikipedia.org/wiki/%E8%B6%85%E6%96%87%E6%9C%AC%E4%BC%A0%E8%B[E%93%E5%8D%8F%E8%AE%AE)*超文本傳輸協定* * 實作 Cross-Origin Resource Sharing (CORS) 解決 Ajax 發送跨網域存取 Request* [*http://blog.toright.com/posts/3205/*](http://blog.toright.com/posts/3205/) * IIS 設定啟用 CORS (Cross-Origin Resource Sharing) - 跨來源資源共用* https://blog.yowko.com/2018/02/iis-enable-cors.html * X-Frame-Options 回應標頭* https://developer.mozilla.org/zh-TW/docs/Web/HTTP/X-Frame-Options * HTTP Headers 的資安議題 (1)* https://devco.re/blog/2014/03/10/security-issues-of-http-headers-1/ * 一篇文章帶你詳解HTTP 協議(網絡協議篇一) https://www.huaweicloud.com/articles/736eef13dc3e4d73b10d155557bb93c5.html