كيف يمكنك تكوين ملفات تعريف الارتباط HttpOnly في هر / java webapps?

StackOverflow https://stackoverflow.com/questions/33412

سؤال

بعد قراءة جيف بلوق وظيفة على حماية الكوكيز الخاص بك:HttpOnly.أود أن تنفيذ HttpOnly ملفات تعريف الارتباط في تطبيق ويب.

كيف يمكنك معرفة هر استخدام http فقط ملفات تعريف الارتباط في جلسات ؟

هل كانت مفيدة؟

المحلول

httpOnly معتمد من هر 6.0.19 و هر 5.5.28.

ترى التغيير دخول علة 44382.

آخر تعليق الشوائب 44382 "هذا وقد تم تطبيق 5.5.x و سيتم تضمينها في 5.5.28 فصاعدا." بيد أنه لا يبدو أن 5.5.28 لقد تم الافراج.

HttpOnly وظائف يمكن تمكين جميع webapps في conf/context.xml:

<Context useHttpOnly="true">
...
</Context>

تفسيري هو أنه يعمل أيضا على الفرد السياق من خلال وضع على المطلوب السياق الدخول في conf/server.xml (بنفس الطريقة على النحو الوارد أعلاه).

نصائح أخرى

تحديث:على JSESSIONID الاشياء هنا فقط لكبار السن من الحاويات.الرجاء استخدام jt حاليا تقبل الإجابة إلا إذا كنت تستخدم < هر 6.0.19 أو <هر 5.5.28 أو حاوية أخرى لا يدعم HttpOnly JSESSIONID ملفات تعريف الارتباط كما config الخيار.

عند وضع الكوكيز في التطبيق الخاص بك, استخدام

response.setHeader( "Set-Cookie", "name=value; HttpOnly");

ومع ذلك ، في كثير من webapps أهم ملف تعريف الارتباط هو معرف جلسة ، والتي يتم تلقائيا تعيين بواسطة الحاويات كما JSESSIONID الكعكة.

إذا كان يمكنك فقط استخدام ملف تعريف الارتباط هذا ، يمكنك كتابة ServletFilter إلى إعادة تعيين ملفات تعريف الارتباط على طريقة للخروج ، مما اضطر JSESSIONID إلى HttpOnly.الصفحة http://keepitlocked.net/archive/2007/11/05/java-and-httponly.aspx http://alexsmolen.com/blog/?p=16 يقترح إضافة ما يلي في التصفية.

if (response.containsHeader( "SET-COOKIE" )) {
  String sessionid = request.getSession().getId();
  response.setHeader( "SET-COOKIE", "JSESSIONID=" + sessionid 
                      + ";Path=/<whatever>; Secure; HttpOnly" );
} 

لكن لاحظ أن هذا سوف الكتابة فوق كافة ملفات تعريف الارتباط فقط تعيين ما كنت هنا في هذا الفلتر.

إذا كنت تستخدم إضافية ملفات تعريف الارتباط إلى JSESSIONID كوكي, ثم سوف تحتاج إلى تمديد هذا القانون إلى ضبط جميع ملفات تعريف الارتباط في عامل التصفية.هذا ليس الحل في حالة متعددة-ملفات تعريف الارتباط ولكن هو ربما مقبولة سريعة-إصلاح JSESSIONID فقط الإعداد.

يرجى ملاحظة أن رمز تتطور مع مرور الوقت ، هناك سيئة علة خفية في انتظاركم عند نسيان هذا الفلتر ومحاولة تعيين كعكة أخرى في مكان آخر في التعليمات البرمجية الخاصة بك.بالطبع لن تحصل على مجموعة.

هذا هو حقا هاك على الرغم من.إذا كنت لا تستخدم هر ويمكن ترجمة ذلك, ثم نلقي نظرة على Shabaz ممتاز اقتراح التصحيح HttpOnly الدعم في هر.

يرجى أن يكون حريصا على عدم الكتابة "؛ آمنة" كوكي العلم في https الدورات.وهذا العلم يمنع المتصفح من إرسال ملف تعريف الارتباط على غير مشفرة اتصال http أساسا التقديم استخدام https شرعي يطلب المجدي.

private void rewriteCookieToHeader(HttpServletRequest request, HttpServletResponse response) {
    if (response.containsHeader("SET-COOKIE")) {
        String sessionid = request.getSession().getId();
        String contextPath = request.getContextPath();
        String secure = "";
        if (request.isSecure()) {
            secure = "; Secure"; 
        }
        response.setHeader("SET-COOKIE", "JSESSIONID=" + sessionid
                         + "; Path=" + contextPath + "; HttpOnly" + secure);
    }
}

عن ملفات تعريف الارتباط لا يبدو أن تكون معتمدة في هر حتى الآن.انظر تقرير الشوائب تحتاج إلى إضافة دعم HTTPOnly ملف تعريف ارتباط جلسة المعلمة.إلى حد ما تشارك العمل في جميع أنحاء الآن يمكن العثور عليها هنا, الذي يتلخص أساسا يدويا الترقيع هر.حقا لا يمكن العثور على طريقة سهلة للقيام بذلك في هذه اللحظة في هذه النقطة أنا خائف.

تلخيص العمل في جميع أنحاء ، فإنه ينطوي على تحميل 5.5 المصدر, ثم قم بتغيير مصدر في الأماكن التالية:

org.apache.catalina.connector.Request.java

//this is what needs to be changed
//response.addCookieInternal(cookie);

//this is whats new
response.addCookieInternal(cookie, true);
}

org.أباتشي.كاتالينا.connectorResponse.addCookieInternal

public void addCookieInternal(final Cookie cookie) {
addCookieInternal(cookie, false);
}

public void addCookieInternal(final Cookie cookie, boolean HTTPOnly) {

if (isCommitted())
return;

final StringBuffer sb = new StringBuffer();
//web application code can receive a IllegalArgumentException
//from the appendCookieValue invokation
if (SecurityUtil.isPackageProtectionEnabled()) {
AccessController.doPrivileged(new PrivilegedAction() {
public Object run(){
ServerCookie.appendCookieValue
(sb, cookie.getVersion(), cookie.getName(),
cookie.getValue(), cookie.getPath(),
cookie.getDomain(), cookie.getComment(),
cookie.getMaxAge(), cookie.getSecure());
return null;
}
});
} else {
ServerCookie.appendCookieValue
(sb, cookie.getVersion(), cookie.getName(), cookie.getValue(),
cookie.getPath(), cookie.getDomain(), cookie.getComment(),
cookie.getMaxAge(), cookie.getSecure());
}
//of course, we really need to modify ServerCookie
//but this is the general idea
if (HTTPOnly) {
sb.append("; HttpOnly");
}

//if we reached here, no exception, cookie is valid
// the header name is Set-Cookie for both "old" and v.1 ( RFC2109 )
// RFC2965 is not supported by browsers and the Servlet spec
// asks for 2109.
addHeader("Set-Cookie", sb.toString());

cookies.add(cookie);
}

إذا كان ملقم ويب يدعم Serlvet 3.0 المواصفات مثل هر 7.0+ ، يمكنك استخدام أدناه في web.xml كما:

<session-config>
  <cookie-config>
     <http-only>true</http-only>        
     <secure>true</secure>        
  </cookie-config>
</session-config>

كما ذكر في المستندات:

HttpOnly:تحديد ما إذا كان أي دورة تتبع ملفات تعريف الارتباط التي تم إنشاؤها من قبل هذا التطبيق على شبكة الإنترنت سوف تكون علامة HttpOnly

آمنة:يحدد إذا كان أي دورة تتبع ملفات تعريف الارتباط التي تم إنشاؤها بواسطة هذا التطبيق على شبكة الإنترنت سوف يتم وضع علامة آمن حتى إذا كان الطلب الذي بدأ المقابلة الدورة هو استخدام عادي HTTP بدلا من HTTPS

يرجى الرجوع إلى كيفية تعيين httponly و الكوكيز جافا تطبيق ويب

كما تجدر الإشارة إلى أن تحول على HttpOnly كسر تطبيقات التي تتطلب جليل الوصول إلى jvm.

برنامج طلبات http لن تستخدم jsessionid كوكي و قد تحصل على تعيين مختلفة هر.

ملفات تعريف الارتباط التي أنا صراحة الإعداد ، لقد تحولت إلى استخدام SimpleCookie التي تقدمها أباتشي شيرو.فإنه لا يرث من javax.بريمج.http.كوكي لذلك يأخذ أكثر قليلا شعوذة الحصول على كل شيء للعمل بشكل صحيح ومع ذلك فهي توفر الملكية مجموعة HttpOnly ويعمل مع بريمج 2.5.

من أجل وضع ملف تعريف الارتباط على الرد بدلا من القيام response.addCookie(cookie) كنت بحاجة إلى القيام به cookie.saveTo(request, response).

في Tomcat6 ، يمكنك مشروط تمكن من HTTP المستمع الدرجة:

public void contextInitialized(ServletContextEvent event) {                 
   if (Boolean.getBoolean("HTTP_ONLY_SESSION")) HttpOnlyConfig.enable(event);
}

باستخدام هذه الفئة

import java.lang.reflect.Field;
import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import org.apache.catalina.core.StandardContext;
public class HttpOnlyConfig
{
    public static void enable(ServletContextEvent event)
    {
        ServletContext servletContext = event.getServletContext();
        Field f;
        try
        { // WARNING TOMCAT6 SPECIFIC!!
            f = servletContext.getClass().getDeclaredField("context");
            f.setAccessible(true);
            org.apache.catalina.core.ApplicationContext ac = (org.apache.catalina.core.ApplicationContext) f.get(servletContext);
            f = ac.getClass().getDeclaredField("context");
            f.setAccessible(true);
            org.apache.catalina.core.StandardContext sc = (StandardContext) f.get(ac);
            sc.setUseHttpOnly(true);
        }
        catch (Exception e)
        {
            System.err.print("HttpOnlyConfig cant enable");
            e.printStackTrace();
        }
    }
}

لقد وجدت في OWASP

<session-config>
  <cookie-config>
    <http-only>true</http-only>
  </cookie-config>
</session-config>

وهذا هو أيضا إصلاح "httponlycookies في التكوين" قضية أمنية

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top