Как предотвратить перехват сеанса кота?

Можно достигнуть этого путем выполнения версии jQuery в [1 110] режим без конфликтов . Режим "No conflict" является стандартным решением для получения jQuery, работающего на странице с другими платформами как [1 111] прототип , и может быть также использоваться здесь в качестве него по существу пространства имен каждая версия jQuery, который Вы загружаете.






Это изменение будет означать, что любой материал jQuery, который Вы хотите использовать, должны будут назвать с помощью jq13, а не $, например,

jq13("#id").hide();

Это не идеальная ситуация, чтобы иметь эти две версии, работающие на той же странице, но если у Вас нет альтернативы, затем вышеупомянутый метод должен позволить Вам использовать две отличающихся версии сразу.

Также из любопытства, что, если мы должны были использовать дополнительное управление, которое должно было сослаться на еще одну версию jQuery?

, Если необходимо было добавить другую версию jQuery, Вы могли бы подробно остановиться на вышеупомянутом:








переменные jq13 и jq131 каждый использовались бы для определенных для версии функций, которых Вы требуете.

важно, чтобы jQuery, используемый исходным разработчиком, был загружен в последний раз - исходный разработчик, вероятно, написал их код под предположением, которое $() будет использовать их версию jQuery. При загрузке другой версии после того, как их, эти $ будет "захвачен" за последнюю версию, Вы загружаетесь, который означал бы код исходного разработчика, работающий на последней версии библиотеки, представляя noConflicts несколько избыточный!

15
задан Marcel 24 September 2009 в 15:17
поделиться

3 ответа

Если это последняя версия Tomcat, у вас может не быть проблем. Однако это зависит от вашей проверки идентификатора SSL, связанного с сеансом. Это доступно с помощью кода, такого как

String sslId = (String) req.getAttribute("javax.servlet.request.ssl_session");

(обратите внимание, что ключ атрибута может измениться в будущем на javax.servlet.request.ssl_session _id - как часть спецификации сервлета 3.0).

Я настроил сервлет с помощью следующего метода doGet :

protected void doGet(HttpServletRequest request, HttpServletResponse response)
                    throws ServletException, IOException {
    HttpSession session = request.getSession(true);
    String sid = session.getId();
    String sslId = (String) request.getAttribute(
                "javax.servlet.request.ssl_session");
    String uri = request.getRequestURI();
    OutputStream out = response.getOutputStream();
    PrintWriter pw = new PrintWriter(out);
    HashMap<String, Object> secrets;
    Object secret = null;
    Object notSecret;
    Date d = new Date();

    notSecret = session.getAttribute("unprotected");
    if (notSecret == null) {
        notSecret = "unprotected: " + d.getTime();
        session.setAttribute("unprotected", notSecret);
    }
    secrets = (HashMap<String, Object>) session.getAttribute("protected");
    if (secrets == null) {
        secrets = new HashMap<String, Object>();
        session.setAttribute("protected", secrets);
    }
    if (sslId != null) {
        if (secrets.containsKey(sslId))
            secret = secrets.get(sslId);
        else {
            secret = "protected: " + d.getTime();
            secrets.put(sslId, secret);
        }
    }
    response.setContentType("text/plain");
    pw.println(MessageFormat.format("URI: {0}", new Object[] { uri }));
    pw.println(MessageFormat.format("SID: {0}", new Object[] { sid }));
    pw.println(MessageFormat.format("SSLID: {0}", new Object[] { sslId }));
    pw.println(MessageFormat.format("Info: {0}", new Object[] { notSecret }));
    pw.println(MessageFormat.format("Secret: {0}", new Object[] { secret }));
    pw.println(MessageFormat.format("Date: {0}", new Object[] { d }));
    pw.close();
}

Затем я вызвал подходящий незащищенный URL-адрес с помощью Firefox и расширения Live HTTP Headers, чтобы получить файл cookie сеанса. Это был ответ, отправленный, когда я перешел на

http://localhost:8080/EchoWeb/unprotected

(мой web.xml, как и ваш, защищает только / user / * и / personal / *):

URI: /EchoWeb/unprotected
SID: 9ACCD06B69CA365EFD8C10816ADD8D71
SSLID: null
Info: unprotected: 1254034761932
Secret: null
Date: 27/09/09 07:59

Затем я попытался получить доступ к защищенному URL-адресу

http://localhost:8080/EchoWeb/personal/protected

и , как и ожидалось, Я был перенаправлен на

https://localhost:8443/EchoWeb/personal/protected

и получил ответ

URI: /EchoWeb/personal/protected
SID: 9ACCD06B69CA365EFD8C10816ADD8D71
SSLID: 4abf0d67549489648e7a3cd9292b671ddb9dd844b9dba682ab3f381b462d1ad1
Info: unprotected: 1254034761932
Secret: protected: 1254034791333
Date: 27/09/09 07:59

. Обратите внимание, что идентификатор файла cookie / сеанса такой же, но теперь у нас есть новый SSLID. Теперь давайте попробуем подделать сервер с помощью файла cookie сеанса.

Я установил сценарий Python, spoof.py :

import urllib2

url = "https://localhost:8443/EchoWeb/personal/protected"
headers = {
    'Host': 'localhost:8080',
    'User-Agent': 'Mozilla/5.0 (Windows; U; Windows NT 6.1; en-GB; rv:1.9.1.3) Gecko/20090824 Firefox/3.5.3',
    'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
    'Accept-Language': 'en-gb,en;q=0.5',
    'Accept-Charset': 'ISO-8859-1,utf-8;q=0.7,*;q=0.7',
    'Cookie' : 'JSESSIONID=9ACCD06B69CA365EFD8C10816ADD8D71'
}
req = urllib2.Request(url, None, headers)
response = urllib2.urlopen(req)
print response.read()

Теперь вам не нужно знать Python, особенно - я Я просто пытаюсь отправить HTTP-запрос на (другой) защищенный ресурс с тем же идентификатором сеанса в Cookie. Вот ответ, когда я дважды запускал свой сценарий обмана:

C:\temp>spoof
URI: /EchoWeb/personal/protected
SID: 9ACCD06B69CA365EFD8C10816ADD8D71
SSLID: 4abf0eafb4ffa30b6579cf189c402a8411294201e2df94b33a48ae7484f22854
Info: unprotected: 1254034761932
Secret: protected: 1254035119303
Date: 27/09/09 08:05


C:\temp>spoof
URI: /EchoWeb/personal/protected
SID: 9ACCD06B69CA365EFD8C10816ADD8D71
SSLID: 4abf0eb184cb380ce69cce28beb01665724c016903650539d095c671d98f1de3
Info: unprotected: 1254034761932
Secret: protected: 1254035122004
Date: 27/09/09 08:05

Обратите внимание в приведенных выше ответах, что данные сеанса (значение с отметкой времени 1254034761932 ), которые были установлены в первом незащищенном запросе, были отправлено повсюду, потому что Tomcat использует один и тот же сеанс, потому что идентификатор сеанса тот же. Конечно, это небезопасно . Однако, обратите внимание, что идентификаторы SSL каждый раз были разными , и если вы используете те для ввода данных сеанса (например, как показано), вы должны быть в безопасности. Если я обновлю свою вкладку Firefox, вот ответ:

URI: /EchoWeb/personal/protected
SID: 9ACCD06B69CA365EFD8C10816ADD8D71
SSLID: 4abf0d67549489648e7a3cd9292b671ddb9dd844b9dba682ab3f381b462d1ad1
Info: unprotected: 1254034761932
Secret: protected: 1254034791333
Date: 27/09/09 08:05

Обратите внимание, что SSLID тот же , что и для более раннего запроса Firefox. Таким образом, сервер может различать сеансы, используя значение SSL ID. Обратите особое внимание на то, что «защищенные данные» одинаковы для каждого запроса, сделанного из сеанса Firefox, но разные для каждого из поддельных сеансов, а также отличаются от сеанса Firefox.

URI: /EchoWeb/personal/protected
SID: 9ACCD06B69CA365EFD8C10816ADD8D71
SSLID: 4abf0d67549489648e7a3cd9292b671ddb9dd844b9dba682ab3f381b462d1ad1
Info: unprotected: 1254034761932
Secret: protected: 1254034791333
Date: 27/09/09 08:05

Обратите внимание, что SSLID тот же , что и для более раннего запроса Firefox. Таким образом, сервер может различать сеансы, используя значение SSL ID. Обратите особое внимание на то, что «защищенные данные» одинаковы для каждого запроса, сделанного из сеанса Firefox, но разные для каждого из поддельных сеансов, а также отличаются от сеанса Firefox.

URI: /EchoWeb/personal/protected
SID: 9ACCD06B69CA365EFD8C10816ADD8D71
SSLID: 4abf0d67549489648e7a3cd9292b671ddb9dd844b9dba682ab3f381b462d1ad1
Info: unprotected: 1254034761932
Secret: protected: 1254034791333
Date: 27/09/09 08:05

Обратите внимание, что SSLID тот же , что и для более раннего запроса Firefox. Таким образом, сервер может различать сеансы, используя значение SSL ID. Обратите особое внимание на то, что «защищенные данные» одинаковы для каждого запроса, сделанного из сеанса Firefox, но разные для каждого из поддельных сеансов, а также отличаются от сеанса Firefox.

12
ответ дан 1 December 2019 в 04:18
поделиться

Думаю, это так задумано. Вы не можете основывать управление доступом на сеансе. Вам нужно использовать другие параметры. Вам нужно добавить аутентификацию и использовать управление на основе ролей.

В Tomcat есть защита, но с точностью до наоборот. Если вы получаете сеанс в безопасной зоне, этот сеанс не переносится в незащищенную зону. Tomcat достигает этого, устанавливая для файла cookie флаг "secure", чтобы файл cookie не отправлялся в HTTP-соединения.

2
ответ дан 1 December 2019 в 04:18
поделиться

Если вы собираетесь сделать несколько вызовов этого для каждого класса, вы можете создать дескриптор типа класса, который делает не что иное, как кэшировать этот тип информации. Тогда, когда вы хотите получить информацию, вы просто посмотрите на это дескриптор.

Чтобы ответить на ваш вопрос:

Class<?> _class = Whatever.class;
Annotation[] annos = _class.getAnnotations();

вернет все аннотации класса. То, что вы сделали, вернет только самую первую аннотацию метода. Как и мудрый:

Annotion[] annos = myMethod.getAnnotations();

возвращает все аннотации данного метода.

-121--2980866-

Если это легко сделать со связанным списком на языке C, то я бы предположил, что класс LinkedList обеспечивает такую же производительность

Все операции выполняются так, как можно было ожидать для списка с двумя связями. Операции с индексом в списке будут проходить список с начала или с конца, в зависимости от того, что ближе к указанному индексу.

List list1 = new LinkedList();
list1.add(...);
List list2 = new LinkedList();
list2.add(...);

list1.addAll(list2);

редактирование: Nevermind. Похоже, LinkedList.addAll (Коллекция) вызывает LinkedList.addAll (int, Коллекция), который выполняет итерацию через новую коллекцию.

-121--2835562-

При проверке подлинности сеанса рекомендуется изменить идентификатор сеанса.
Таким образом, старый sessionId становится бесполезным, и захват сеанса невозможен.
Чтобы изменить идентификатор сеанса в контейнере сервлета:

  • скопируйте все атрибуты текущего сеанса во временную коллекцию
  • session.invalidate ()
  • session = req.getSession (true)
  • заполните новый сеанс атрибутами из временной коллекции

О идентификаторе SSLID, обратите внимание, что клиент и сервер могут закрыть сеанс При закрытии произойдет новое подтверждение SSL и будет создан новый SSID. Таким образом, IMO SSLID не является надежным способом отслеживания (или помощи в отслеживании) сессий.

2
ответ дан 1 December 2019 в 04:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: