Cookieを安全にし、httpリクエストのみを行いたい。
this のような多くの投稿を見てきましたが、正常に動作しているようですが、構成ファイルとサーブレット+3を使用しています。
私が基本的にやりたいのは、Cookieをhttpのみ、(可能であれば)SSLのみを設定することです。
これまでのところ、これをweb.xmlに追加しました
<session-config>
<session-timeout>60</session-timeout>
<cookie-config>
<http-only>true</http-only>
</cookie-config>
<tracking-mode>COOKIE</tracking-mode>
</session-config>
私が読んでいた限り、この機能を有効にするためにservlet.xmlも構成する必要がありますが、方法がわかりません...
これを行う方法はありますか?
編集:
私はサーブレット2.5を使用しているので、xml構成はオプションではなく、おそらくフィルターですか?
私はXML構成が嫌いなので、非XMLソリューションを見つけるために時間を費やしています。
Spring Security 1.3以降、使用できます
server.session.cookie.http-only=true
server.session.cookie.secure=true
application.propertiesファイル内。
純粋なJava構成を使用してこれを設定する方法があるかもしれませんが、私はそれらを見つけることができません。
最近、この問題に遭遇しました。ローカルで機能するhttpのみのプロパティ設定を試しましたが、テスト環境にデプロイしたときには機能しませんでした。これらのローカル設定をオーバーライドする環境にいくつかのデフォルト設定があった可能性があります。うまくいったのは、Spring構成ファイルにプロパティを設定することでした。
@Bean
public ServletContextInitializer servletContextInitializer() {
return new ServletContextInitializer() {
@Override
public void onStartup(ServletContext servletContext) throws ServletException {
servletContext.setSessionTrackingModes(Collections.singleton(SessionTrackingMode.COOKIE));
SessionCookieConfig sessionCookieConfig = servletContext.getSessionCookieConfig();
sessionCookieConfig.setHttpOnly(true);
sessionCookieConfig.setSecure(true);
}
};
}
Javagcによって言及されたcontext.xmlの変更は、セッションCookieのみを再構成します。
すべてのCookieを変更するには、次の2つのオプションがあります。
オプション1)より安全な方法を使用してCookieを追加するようにアプリケーションコードを更新します。例: https://stackoverflow.com/a/30488471/95674
オプション2)システムを通過するすべての(その他の)Cookieを変更するようにサーブレットフィルタを設定できます。これらの2つのクラスをWARの適切なパッケージに追加します。次に、以下に詳述するようにweb.xmlを更新します。
OWASPライブラリへの依存関係を追加する場合は、OWASPサイトにリストされているオプション2のより簡単な例があります。それはここにあります: https://www.owasp.org/index.php/HttpOnly#Using_Java_to_Set_HttpOnly
これにより、ラップされた応答のすべてのCookieにhttponlyフラグが追加されます。
public class HttpOnlyResponseWrapper extends HttpServletResponseWrapper {
public HttpOnlyResponseWrapper(HttpServletResponse res) {
super(res);
}
public void addCookie(Cookie cookie) {
StringBuilder header = new StringBuilder();
if ((cookie.getName() != null) && (!cookie.getName().equals(""))) {
header.append(cookie.getName());
}
if (cookie.getValue() != null) {
// Empty values allowed for deleting cookie
header.append("=" + cookie.getValue());
}
if (cookie.getVersion() == 1) {
header.append(";Version=1");
if (cookie.getComment() != null) {
header.append(";Comment=\"" + cookie.getComment() + "\"");
}
if (cookie.getMaxAge() > -1) {
header.append(";Max-Age=" + cookie.getMaxAge());
}
} else {
if (cookie.getMaxAge() > -1) {
Date now = new Date();
now.setTime(now.getTime() + (1000L * cookie.getMaxAge()));
SimpleDateFormat cookieFormat = new SimpleDateFormat("EEE, d MMM yyyy HH:mm:ss zzz");
header.append(";Expires=" + cookieFormat.format(now));
}
}
if (cookie.getDomain() != null) {
header.append(";Domain=" + cookie.getDomain());
}
if (cookie.getPath() != null) {
header.append(";Path=" + cookie.getPath());
}
if (cookie.getSecure()) {
header.append(";Secure");
}
header.append(";httpOnly");
addHeader("Set-Cookie", header.toString());
}
}
このフィルターは、構成された応答を上記のラッパーでラップします。
package yourpackage;
@WebFilter(filterName = "HttpOnlyFilter", urlPatterns = {"/*"})
public class HttpOnlyFilter implements Filter {
private FilterConfig config;
@Override
public void destroy() {
this.config = null;
}
@Override
public void doFilter(ServletRequest req, ServletResponse res,
FilterChain chain) throws IOException, ServletException {
HttpOnlyResponseWrapper hres = new HttpOnlyResponseWrapper((HttpServletResponse)res);
chain.doFilter(req, hres);
}
public FilterConfig getFilterConfig() {
return this.config;
}
@Override
public void init(FilterConfig config) throws ServletException {
this.config = config;
}
}
ソースからの適応(警告:正確なコピーではありません!): http://sylvanvonstuppe.blogspot.com/2007/07/servlet-filter-for-httponly.html
最後にもう1つ、次のようにシステムで注釈スキャンをオフにしている場合のみ:
<web-app xmlns="http://Java.Sun.com/xml/ns/javaee"
version="2.5" ***metadata-complete="true"***>
</web-app>
次に、次のように、web.xmlファイルで上記のフィルターを手動で構成する必要があります。
<filter>
<filter-name>HttpOnlyFilter
<filter-class>yourpackage.HttpOnlyFilter
</filter>
<filter-mapping>
<filter-name>HttpOnlyFilter
<url-pattern>/*
</filter-mapping>
アプリがアノテーション(デフォルト)をスキャンする場合、web.xml部分は必要ありません。
ServletContextListenerの助けを借りて、Tomcatの起動時とシャットダウン時にサーブレットを制御できます。したがって、Tomcatの起動時に、httponlyの構成を設定します。
import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
public final class ContextListener implements ServletContextListener {
private ServletContext context = null;
@Override
public void contextDestroyed(ServletContextEvent event) {
this.context = null;
}
@Override
public void contextInitialized(ServletContextEvent event) {
this.context = event.getServletContext();
this.context.getSessionCookieConfig().setHttpOnly(true);
}
}
Web.xmlのabbbelowwエントリ
<listener>
<description>contextListener</description>
<listener-class>
main.ContextListener
</listener-class>
</listener>