﻿# 設定 Cookie 時可善用 HttpOnly 特性減低網站安全風險(XSS)

[Cookie hijacking](http://en.wikipedia.org/wiki/HTTP_cookie#Cookie_hijacking) 是個很常見的 XSS 攻擊手法，大多是利用網站既有的 XSS 漏洞並透過 JavaScript 取得 documnet.cookie 資料，而 documnet.cookie 就包含所有你在該網頁所有可用的 Cookie 資料，但若你的網站程式在設定 Cookie 的時候有特別加上 HttpOnly 屬性，就可以進一步避免該頁的 Cookie 被 JavaScript 存取，也可保護使用者的 Cookie 不會偷走。

以下是 ASP.NET 的程式範例：

```csharp
// Create an HttpOnly cookie.
HttpCookie myHttpOnlyCookie = new HttpCookie("LastVisit", DateTime.Now.ToString());

// Setting the HttpOnly value to true, makes
// this cookie accessible only to ASP.NET.

myHttpOnlyCookie.HttpOnly = true;
myHttpOnlyCookie.Name = "MyHttpOnlyCookie";
Response.AppendCookie(myHttpOnlyCookie);
```

由於 HttpOnly 是 W3C 的標準配備，所以不止 ASP.NET 可以運用這個技巧，其他程式語言要利用 HttpOnly 時只要在 Set-Cookie 的 Header 最後面加上 **; HttpOnly** 即可套用完成，如下圖示：

![image](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/428ffe2c5403edddab06-image.png "image")

所以你的網站在使用 Cookie 時如果確定該 Cookie 不會或不需要被 Browser 端的 JavaScript 使用，建議都加上 HttpOnly 屬性，以免當真的有一天你的網站不小心出現了 XSS 弱點時不會傷及無辜用戶。

雖然套用 HttpOnly 屬性可以有效防堵 Cookie 被劫走(Hijacking)，但這並不代表使用 HttpOnly 就是安全的！因為如果你的網站還是有 XSS 風險，還是很有機會讓駭客利用 [XHR](http://en.wikipedia.org/wiki/XMLHttpRequest) **代客操作**，所以就算駭客不取得 Cookie 也可以達成攻擊的手段。

另外，由於 Cookie 一樣會透過 HTTP 在網路上傳輸，被半路攔截的機會還是有的，建議使用 SSL 保護網路封包的傳輸，避免資料遭攔截。

我的 [解釋 Cookie 的特性](/post/2008/02/22/Explain-HTTP-Cookie-in-Detail) 文章有解釋 Cookie 的特性，不甚了解的人建議可閱讀一番，Cookie 基本上有兩種類型：Persistent Cookie 與 Session Cookie，而 [HttpOnly](https://owasp.org/www-community/HttpOnly) 可套用在任何 Cookie 類型上，唯一的差別僅在於可不可以由 JavaScript, Silverlight 或 Flash 等前端程式存取而已！

**相關連結**

-   [HTTPOnly - OWASP](https://owasp.org/www-community/HttpOnly)
-   [HttpCookie.HttpOnly 屬性](http://msdn.microsoft.com/zh-tw/library/system.web.httpcookie.httponly.aspx)
-   [Mitigating Cross-site Scripting With HTTP-only Cookies](http://msdn.microsoft.com/zh-tw/library/ms533046\(en-us,VS.85\).aspx)
-   [HTTP cookie - Wikipedia, the free encyclopedia](http://en.wikipedia.org/wiki/HTTP_cookie)
-   [XMLHttpRequest - Wikipedia, the free encyclopedia](http://en.wikipedia.org/wiki/XMLHttpRequest)
-   [Protecting Your Cookies: HttpOnly](https://blog.codinghorror.com/protecting-your-cookies-httponly/)
-   [Why HttpOnly won't protect you](http://www.gnucitizen.org/blog/why-httponly-wont-protect-you/)
