-
Notifications
You must be signed in to change notification settings - Fork 738
Fix/update the content of HttpOnly Page #1038
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: master
Are you sure you want to change the base?
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -29,7 +29,7 @@ header. Using the HttpOnly flag when generating a cookie helps mitigate | |
the risk of client side script accessing the protected cookie (if the | ||
browser supports it). | ||
|
||
- The example below shows the syntax used within the **HTTP response | ||
* The example below shows the syntax used within the **HTTP response | ||
header**: | ||
|
||
``` | ||
|
@@ -67,43 +67,48 @@ the browser *returns an empty string* as the result. This causes the | |
attack to fail by preventing the malicious (usually XSS) code from | ||
sending the data to an attacker's website. | ||
|
||
##### Using Java to Set HttpOnly | ||
### Using Jakarta EE or Java EE to Set HttpOnly | ||
|
||
Since Java Enterprise Edition 6 (JEE 6), which adopted Java Servlet 3.0 | ||
technology, it's programmatically easy to set the HttpOnly flag on a | ||
cookie. | ||
for more information , plwase check [Java EE to Jakarta EE Transition](https://jakarta.ee/about/faq/#what-is-the-java-ee-to-jakarta-ee-transition). | ||
|
||
In fact `setHttpOnly` and `isHttpOnly` methods are available in the | ||
`Cookie` interface | ||
[JEE 6](http://java.sun.com/javaee/6/docs/api/javax/servlet/http/Cookie.html#setHttpOnly%28boolean%29), | ||
[JEE 7](https://docs.oracle.com/javaee/7/api/javax/servlet/http/Cookie.html#setHttpOnly-boolean-) | ||
and also for session cookies (JSESSIONID) | ||
[JEE 6](http://java.sun.com/javaee/6/docs/api/javax/servlet/SessionCookieConfig.html#setHttpOnly%28boolean%29), | ||
[JEE 7](https://docs.oracle.com/javaee/7/api/javax/servlet/SessionCookieConfig.html#setHttpOnly-boolean-) | ||
`cookie.setHttpOnly(true);` | ||
Since **Jakarta EE 9**, which adopted **Jakarta Servlet 5.0** technology, it's programmatically easy to set the `HttpOnly` flag on a cookie. | ||
|
||
Moreover, since JEE 6 it's also declaratively easy setting `HttpOnly` | ||
flag in a session cookie by applying the following configuration in the | ||
deployment descriptor `WEB-INF/web.xml`: | ||
In fact, the `setHttpOnly` and `isHttpOnly` methods are available in the [`jakarta.servlet.http.Cookie`](https://jakarta.ee/specifications/servlet/5.0/apidocs/jakarta/servlet/http/Cookie.html) interface, as well as for session cookies (`JSESSIONID`) using [`jakarta.servlet.SessionCookieConfig`](https://jakarta.ee/specifications/servlet/5.0/apidocs/jakarta/servlet/SessionCookieConfig.html): | ||
|
||
```java | ||
Cookie cookie = new Cookie("sessionId", "abc123"); | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. This doesn't seem like a practical example for a security community |
||
cookie.setHttpOnly(true); // Mark the cookie as HttpOnly | ||
response.addCookie(cookie); | ||
``` | ||
Moreover, since Jakarta EE 9, it's also declaratively easy to set the `HttpOnly` flag for session cookies by applying the following configuration in the deployment descriptor `WEB-INF/web.xml`: | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. The example seems the same as the v6 example, so saying since v9 is misleading |
||
|
||
```xml | ||
<session-config> | ||
<cookie-config> | ||
<http-only>true</http-only> | ||
</cookie-config> | ||
</session-config> | ||
<web-app xmlns="https://jakarta.ee/xml/ns/jakartaee" | ||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" | ||
xsi:schemaLocation="https://jakarta.ee/xml/ns/jakartaee | ||
https://jakarta.ee/xml/ns/jakartaee/web-app_6_0.xsd" | ||
version="6.0"> | ||
<session-config> | ||
<cookie-config> | ||
<http-only>true</http-only> | ||
</cookie-config> | ||
</session-config> | ||
</web-app> | ||
``` | ||
For environments using **Java EE 8**, which support **Servlet 4.0**, you can easily set the `HttpOnly` attribute : | ||
|
||
For Java Enterprise Edition versions *prior* to JEE 6 a common | ||
**workaround** is to overwrite the `SET-COOKIE` HTTP response header | ||
with a session cookie value that explicitly appends the `HttpOnly` flag: | ||
The`HttpOnly` flag can be set using the `jakarta.servlet.http.Cookie` (or `javax.servlet.http.Cookie` in Java EE 8) API: | ||
|
||
```java | ||
String sessionid = request.getSession().getId(); | ||
// be careful overwriting: JSESSIONID may have been set with other flags | ||
response.setHeader("SET-COOKIE", "JSESSIONID=" + sessionid + "; HttpOnly"); | ||
|
||
import jakarta.servlet.http.Cookie; | ||
Cookie cookie = new Cookie("sessionId", "abc123"); | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. This doesn't seem like a practical example for a security community There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Additionally the code seems exactly the same as above so why bother?? Why not make the other "since 8" and skip the 9 example? |
||
cookie.setHttpOnly(true); // Set the HttpOnly flag | ||
response.addCookie(cookie); | ||
|
||
``` | ||
|
||
|
||
In this context, overwriting, despite appropriate for the `HttpOnly` | ||
flag, is discouraged because the JSESSIONID may have been set with other | ||
flags. A better workaround is taking care of the previously set flags or | ||
|
@@ -139,7 +144,7 @@ Some web application servers, that implement JEE 5, and servlet | |
containers that implement Java Servlet 2.5 (part of JEE 5), also allow | ||
creating HttpOnly session cookies: | ||
|
||
- **Tomcat 6** In `context.xml` set the `context` tag's attribute `useHttpOnly` | ||
* **Tomcat 6** In `context.xml` set the `context` tag's attribute `useHttpOnly` | ||
[4](http://tomcat.apache.org/tomcat-6.0-doc/config/context.html#Common_Attributes) | ||
as follow: | ||
|
||
|
@@ -148,7 +153,7 @@ as follow: | |
<Context path="/myWebApplicationPath" useHttpOnly="true"> | ||
``` | ||
|
||
- **JBoss 5.0.1** and **JBOSS EAP 5.0.1** In | ||
* **JBoss 5.0.1** and **JBOSS EAP 5.0.1** In | ||
`server <myJBossServerInstance> \deploy\jbossweb.sar\context.xml` | ||
set the `SessionCookie` tag | ||
[5](https://community.jboss.org/message/598558#598558) as follow: | ||
|
@@ -158,21 +163,21 @@ set the `SessionCookie` tag | |
<SessionCookie secure="true" httpOnly="true" /> | ||
``` | ||
|
||
- **IBM Websphere** offer HTTPOnly for session cookies as a [configuration option](http://pic.dhe.ibm.com/infocenter/tivihelp/v33r1/topic/com.ibm.mam.inswas.doc/install/t_configuringthehttponlyattribute.html) | ||
* **IBM Websphere** offer HTTPOnly for session cookies as a [configuration option](http://pic.dhe.ibm.com/infocenter/tivihelp/v33r1/topic/com.ibm.mam.inswas.doc/install/t_configuringthehttponlyattribute.html) | ||
|
||
##### Using .NET to Set HttpOnly | ||
|
||
- By *default*, **.NET 2.0** sets the HttpOnly attribute for | ||
* By *default*, **.NET 2.0** sets the HttpOnly attribute for | ||
1. Session ID | ||
2. Forms Authentication cookie | ||
|
||
In .NET 2.0, HttpOnly can also be set via the HttpCookie object for all custom application cookies | ||
|
||
- Via **web.config** in the system.web/httpCookies element | ||
* Via **web.config** in the system.web/httpCookies element | ||
|
||
`<httpCookies httpOnlyCookies="true" …> ` | ||
|
||
- Or **programmatically** | ||
* Or **programmatically** | ||
|
||
C# Code: | ||
|
||
|
@@ -190,7 +195,7 @@ myCookie.HttpOnly = True | |
Response.AppendCookie(myCookie) | ||
``` | ||
|
||
- However, in **.NET 1.1**, you would have to do this *manually*, | ||
* However, in **.NET 1.1**, you would have to do this *manually*, | ||
e.g., | ||
|
||
`Response.Cookies[cookie].Path += ";HttpOnly";` | ||
|
@@ -238,9 +243,9 @@ bool setcookie ( string $name [, string $value [, int $expire= 0 [, string $ | |
If code changes are infeasible, web application firewalls can be used to | ||
add HttpOnly to session cookies: | ||
|
||
- Mod_security - using SecRule and Header | ||
* Mod_security - using SecRule and Header | ||
directives[8](http://blog.modsecurity.org/2008/12/fixing-both-missing-httponly-and-secure-cookie-flags.html) | ||
- ESAPI | ||
* ESAPI | ||
WAF[9](http://code.google.com/p/owasp-esapi-java/downloads/list) | ||
using *add-http-only-flag* | ||
directive[10](http://www.slideshare.net/llamakong/owasp-esapi-waf-appsec-dc-2009) | ||
|
@@ -342,22 +347,22 @@ flag. | |
|
||
2) After turning HttpOnly off, select the **“Read Cookie”** button. | ||
|
||
- An alert dialog box will display on the screen notifying you that | ||
* An alert dialog box will display on the screen notifying you that | ||
*since HttpOnly was not enabled*, the **‘unique2u’ cookie** was | ||
successfully read as shown below in **figure 3**. | ||
|
||
 | ||
|
||
3) With HttpOnly remaining disabled, select the **“Write Cookie”** button. | ||
|
||
- An alert dialog box will display on the screen notifying you that | ||
* An alert dialog box will display on the screen notifying you that | ||
*since HttpOnly was not enabled*, the **‘unique2u’ cookie** was | ||
successfully modified on the client side as shown below in **figure | ||
4**. | ||
|
||
 | ||
|
||
- As you have seen thus far, **browsing without HttpOnly** on is a | ||
* As you have seen thus far, **browsing without HttpOnly** on is a | ||
potential ***threat***. Next, we will **enable HttpOnly** to | ||
demonstrate how this flag protects the cookie. | ||
|
||
|
@@ -369,31 +374,31 @@ demonstrate how this flag protects the cookie. | |
|
||
5) After enabling HttpOnly, select the **"Read Cookie"** button. | ||
|
||
- If the browser enforces the HttpOnly flag properly, an alert dialog | ||
* If the browser enforces the HttpOnly flag properly, an alert dialog | ||
box will display only the session ID rather than the contents of the | ||
**‘unique2u’ cookie** as shown below in **figure 6**. | ||
|
||
 | ||
|
||
- However, if the browser does not enforce the HttpOnly flag properly, | ||
* However, if the browser does not enforce the HttpOnly flag properly, | ||
an alert dialog box will display both the **‘unique2u’ cookie** and | ||
session ID as shown below in **figure 7**. | ||
|
||
 | ||
|
||
- Finally, we will test if the browser allows **write access** to the | ||
* Finally, we will test if the browser allows **write access** to the | ||
cookie with HttpOnly enabled. | ||
|
||
6) Select the **"Write Cookie"** button. | ||
|
||
- If the browser enforces the HttpOnly flag properly, client side | ||
* If the browser enforces the HttpOnly flag properly, client side | ||
modification will be unsuccessful in writing to the **‘unique2u’ | ||
cookie** and an alert dialog box will display only containing the | ||
session ID as shown below in **figure 8**. | ||
|
||
 | ||
|
||
- However, if the browser does not enforce the write protection | ||
* However, if the browser does not enforce the write protection | ||
property of HttpOnly flag for the **‘unique2u’ cookie**, the cookie | ||
will be successfully modified to *HACKED* on the client side as | ||
shown below in **figure 9**. | ||
|
@@ -409,4 +414,4 @@ shown below in **figure 9**. | |
5. MSDN. [Setting the HttpOnly property in .NET](http://msdn.microsoft.com/en-us/library/system.web.httpcookie.httponly.aspx) | ||
6. [XSS: Gaining access to HttpOnly Cookie in 2012](http://seckb.yehg.net/2012/06/xss-gaining-access-to-httponly-cookie.html) | ||
7. [Setting HttpOnly in Java](http://stackoverflow.com/questions/13147113/setting-an-httponly-cookie-with-javax-servlet-2-5) | ||
8. [Misunderstandings on HttpOnly Cookie](https://web.archive.org/web/20130701055119/http://blog.fortify.com:80/blog/2011/11/02/Misunderstandings-on-HttpOnly-Cookie) | ||
8. [Misunderstandings on HttpOnly Cookie](https://web.archive.org/web/20130701055119/http://blog.fortify.com:80/blog/2011/11/02/Misunderstandings-on-HttpOnly-Cookie) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
please