2012-10-08 2 views
0

Когда пользователь нажимает регистрационную страницу в Portal (это может быть Liferay, Jboss Portal ..) JSESSIONID cookie создается container. После ввода учетных данных на странице входа в систему, тот же самый JSESSIONID переносится.Создание нового JSESSIONID после проверки подлинности

Здесь конечный пользователь узнает JSESSIONID, прежде чем он сможет пройти аутентификацию (проверив JSESSIONID на странице входа). Это увеличит уязвимость сайта для взлома, потому что вы можете узнать JSESSIONID, прежде чем получить аутентификацию.

Этот post советует иметь разные JSESSIONID после аутентификации.

Таким образом, создание нового JSESSIOND может быть достигнуто с помощью используемого сервера Portal (я использую Liferay CE 6.0) или он должен обрабатываться разработчиком веб-приложений? Если он должен быть обработан разработчиком веб-приложений, что лучше всего сделать? request.getSession(true) - единственный вариант? Если мне нужно указать Liferay, чтобы создать новый JSESSIONID после аутентификации, как это сделать?

ответ

1

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

Я подозреваю, что не должно быть слишком сложно адаптировать мое старое решение к более новой комбинации Liferay/Tomcat. Вы можете найти необходимую информацию о моем решении в моем старом и в настоящее время неизученном блоге (если у меня было больше времени ...): Fixing session fixation in Liferay

1

Проблема здесь не в том, что пользователь знает идентификатор сеанса (пользователь всегда знает он, он отправляется его браузером). Сценарий атаки заключается в том, что пользователь, выйдя из системы, нажимает на ссылку, которая уже имеет встроенный JSESSIONID, затем выполняет аутентификацию, и этот сеанс становится сеансом входа в систему. Теперь тот, кто изначально создал ссылку, может использовать тот же сеанс, чтобы действовать как пользователь. Подробнее на https://en.wikipedia.org/wiki/Session_fixation

Так что да, используйте веб-сервер или сервер приложений для повторного набора идентификатора сеанса после аутентификации пользователя. Вам не нужно писать это самостоятельно. Для Tomcat 7: http://www.tomcatexpert.com/blog/2011/04/25/session-fixation-protection

+0

Ваш ответ был очень полезен. К сожалению, я не упоминал о своем сервере приложений. Я использую Jboss. Я проверю это в Jboss. Если у вас есть какие-либо полезные ссылки, поделитесь ими. Надеюсь, у Jboss также будет эта функция. –

1

Вы можете исправить эту проблему, установив для этого свойства значение true, как у Liferay.

# 
# Set this to true to invalidate the session when a user logs into the 
# portal. This helps prevents phishing. Set this to false if you need the 
# guest user and the authenticated user to have the same session. 
# 
# Set this to false if the property "company.security.auth.requires.https" 
# is set to true and you want to maintain the same credentials across HTTP 
# and HTTPS sessions. 
# 
session.enable.phishing.protection=true 
0

@Thiago:

session.enable.phishing.protection=true Это по умолчанию в истинном portal.properties. Во всяком случае, я добавил эту запись в portal-ext.properties. Но даже после этого JSESSIONID остается таким же до и после входа в систему.

Я внедрил filter в соответствии с этим link. После внедрения этого фильтра, когда я нажимаю страницу входа в Liferay, создается один JSESSIONID. После ввода учетных данных и логина сохраняется то же самое JSESSIONID.

Я внедрил этот filter в Servlet, а не в любом из моих Portlets или в приложении ROOT Liferay. Мой Servlet развернут в комплекте LR + Jboss AS. Я впервые попал в Servlet, и отсюда у меня есть ссылка, которая будет перенаправляться на страницу входа в Лиферэй.Я внедрил этот filter в свой Servlet, потому что Container добавит JSESSIONID для первого запроса, так как он не знает, включены ли файлы cookie или нет. Поскольку JSESSIONID присоединяется, я не могу получить мои изображения в Servlet (потому что url is myImage.jpg; jsessionid =). Следовательно, я реализовал это filter.

Это filter противоречит конфигурации Liferay? Даже после установки session.enable.phishing.protection=true такой же JSESSIONID сохраняется, что еще может быть проблемой?

+0

@Thiago: Я опубликовал свои наблюдения выше –

0

Вставьте этот код внутри portal-ext.properties.

Будет исправлена ​​ошибка, каждый раз при входе в систему будет создан новый идентификатор сеанса.

session.enable.phishing.protection=true 
com.liferay.util.servlet.SessionParameters=true 
Смежные вопросы