JSESSIONIDCookieにhttponlyフラグを設定しようとしています。 Java EE 5で作業していますが、setHttpOnly()
を使用できません。最初に、サーブレットのdoPost()
response.setHeader()
を使用します。
それがうまくいかなかったとき、私はresponse.addHeader()
を試しました。それもうまくいきませんでした。次に、サーブレットがセッションをJSESSIONID cookieに変換し、それをhttpヘッダーに挿入する処理を行っていることを知りました。そのため、そのcookieを操作する場合は、フィルターを作成する必要があります。私はフィルターを作成し、そこでsetHeader()
/addHeader()
で遊んでいましたが、やはり役に立ちませんでした。
次に、応答オブジェクトがフィルターに到達する前にフラッシュ/クローズアクションが実行されていることを知りました。そのため、データを操作する場合は、HttpServletResponseWrapper
を拡張して、それをfilterChain.doFilter()
。これは実行されましたが、まだ結果が得られていません。明らかに私は何か間違ったことをしているのですが、何が起こっているのかわかりません。
これが当面の質問にまったく関連しているかどうかはわかりませんが、サーブレットからブラウザにHTMLドキュメントが返されていません。実際に起こっているのは、一部のオブジェクトが入力されてJSPドキュメントに返されることだけです。 SessionオブジェクトがJSESSIONIDCookieに変換され、ブラウザーに送信される前に、リクエストに追加されたオブジェクトとともにhttpヘッダーにラップされていると仮定しました。
私はいくつかのコードを投稿したいと思いますが、私の困難が最初に理論の誤解から生じる可能性を排除したいと思います。
JSESSIONID
Cookieはservletcontainerによって管理されるため、この設定はservletcontainer固有です。どちらを使用しているかが不明なため、ここに Apache Tomcat 6. ターゲットを絞った回答があります。これにより、servletcontainerを探す必要がある方向がわかります。useHttpOnly
Webアプリケーションの<Context>
要素のtrue
への属性。
<Context useHttpOnly="true">
...
</Context>
<Context>
要素については、これも参照してください Tomcatドキュメント 。
これはJava EE 5:
Java EnterpriseEditionバージョンJava EE 6より前のバージョンの場合、一般的な回避策は、SET-COOKIEhttp応答ヘッダーを明示的に追加するセッションCookie値で上書きすることです。 HttpOnlyフラグ:
String sessionid = request.getSession().getId();
// be careful overwriting: JSESSIONID may have been set with other flags
response.setHeader("SET-COOKIE", "JSESSIONID=" + sessionid + "; HttpOnly");
ソース: https://www.owasp.org/index.php/HttpOnly
私はそれをフィルターにテストします