2008-10-31 2 views
8

Я разрабатываю веб-приложение java с помощью сервлета, чтобы пользователь не ударил кнопку «Назад», чтобы увидеть информацию предыдущих пользователей. У меня есть следующий код:Как запретить пользователю просматривать информацию предыдущих пользователей, нажав кнопку «Назад»

 protected void processRequest(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException 
     {   
     HttpSession session=request.getSession(true); 

     response.setContentType("text/html"); 
     response.setHeader("Cache-Control","no-cache,no-store"); 
     response.setDateHeader("Expires",0); 
     response.setHeader("Pragma","no-cache"); 

     ...... 

     // if (!User_Logged_In) 
     session.invalidate(); 
     } 

Кроме того, у меня есть следующий код в файле: веб/WEB-INF/web.xml

<?xml version="1.0" encoding="UTF-8"?> 
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> 
...... 
<filter> 
    <filter-name>ResponseHeaderFilter</filter-name> 
    <filter-class>ResponseHeaderFilter</filter-class> 
    <init-param> 
    <param-name>Cache-Control</param-name> 
    <param-value>private,no-cache,no-store</param-value> 
    </init-param> 
    <init-param> 
    <param-name>Pragma</param-name> 
    <param-value>no-cache</param-value> 
    </init-param> 
    <init-param> 
    <param-name>Expires</param-name> 
    <param-value>0</param-value> 
    </init-param> 
</filter> 

</web-app> 

И ResponseHeaderFilter.java выглядит следующим образом:

import java.io.*; 
import javax.servlet.*; 
import javax.servlet.http.*; 
import java.util.*; 

public class ResponseHeaderFilter implements Filter 
{ 
    FilterConfig fc; 

    public void doFilter(ServletRequest req,ServletResponse res,FilterChain chain) throws IOException,ServletException 
    { 
    HttpServletResponse response=(HttpServletResponse)res; 

    for (Enumeration e=fc.getInitParameterNames();e.hasMoreElements();)  // Set the provided HTTP response parameters 
    { 
     String headerName=(String)e.nextElement(); 
     response.addHeader(headerName,fc.getInitParameter(headerName)); 
    } 
    chain.doFilter(req,response);            // Pass the request/response on 
    } 

    public void init(FilterConfig filterConfig) 
    { 
    this.fc=filterConfig; 
    } 

    public void destroy() 
    { 
    this.fc=null; 
    } 
} 

Пока он все еще работает неправильно. Кнопка «Назад» выведет окно с предупреждением о том, что данные истекли, и спрашивает, хочет ли пользователь перепроверить его. Если вы выберете «Да», он все равно отобразит информацию о предыдущих страницах. Что я делаю не так? В чем проблема?

Frank


Да, я занимаюсь разработкой веб-приложением для ПК в общественном месте, если пользователь B нажимает кнопку назад он мог видеть собственную информацию пользователя А.

Я пытался использовать идентификатор сеанса с сервлетом, но как это сделать, любой пример кода?

Я также попытался следующие:

<Html> 
<Head>...</Head> 
<Body onLoad=document.execCommand("ClearAuthenticationCache","false")> 
...... 
<script type="text/javascript"> 
    // Clear current credentials : Requires IE6 SP1 or later 
    // document.execCommand("ClearAuthenticationCache"); 
    document.execCommand("ClearAuthenticationCache","false"); 
    </script> 
...... 
</Html> 

Он работает для IE, но, но Firefox.

ответ

3

Нарушение обратной кнопки является кардинальным грехом развития сети.

но вы можете попробовать немного скрипта java в onload, который обновил детали в соответствии с текущим сеансом.

+1

Разорвать кнопку назад имеет значение только в пределах одной сессии. Например, я не могу открыть новое окно браузера и нажать кнопку «назад», чтобы перейти на последний веб-сайт, который я посетил. – sep332 2008-10-31 13:20:01

1

Я не уверен, насколько я правильно понимаю вашу проблему. Вы беспокоитесь о том, что Лицо А выходит из системы, Person B входит в систему с одного и того же ПК и экземпляра браузера, а затем вы хотите, чтобы Person B не видел, что просматривал A?

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

12

Как нажать кнопку «Назад», чтобы пользователь мог видеть еще данные пользователя? Каков ваш прецедент? Является ли он предназначен для открытого терминала, где каждый пользователь передает данные и затем уходит? В этом случае свяжите каждый вход с уникальным идентификатором сеанса. Следите за действительными идентификаторами сеанса на вашем сервере. После отправки ввода удалите этот идентификатор сеанса из действительных идентификаторов. Если он снова появится, не отобразите информацию.

+0

Я согласен - похоже, он пытается решить проблему, которая не должна существовать ... запуск сеанса как синглтона или что-то еще? – GalacticCowboy 2008-10-31 13:26:54

10

Ваша проблема заключается в том, что вы пытаетесь заставить клиента видеть, что находится на его или ее собственном компьютере. Вы не можете удержать их от просмотра кеша браузера. Вы не можете запретить им отключать JavaScript (и, следовательно, ваш код сценария). Вы не можете удержать их от использования браузера, который не соблюдает это соглашение «repost», которое вы упомянули.

Это не проблема, которая может быть решена с помощью JavaScript или серверного решения. Эта часть того, почему «сломать кнопку« назад »нахмурилась: она на самом деле ничего не решает.

+0

На самом деле вы можете отключить кеширование. Большинство браузеров уважают это, но это не гарантируется. – sep332 2008-10-31 15:32:48

+0

Как я упоминал в своем сообщении здесь, вы можете отключить кеширование, но с историей могут обрабатываться разные пользовательские агенты. Спецификация HTTP делает различие между ними, но на самом деле не определяет концепцию истории, а также определяет кеширование. – laz 2008-11-03 19:35:35

-1

У меня была аналогичная проблема.Сеть. Я добавил следующий javascript на мою страницу выхода:

document.execCommand («ClearAuthenticationCache», «false»);

Теперь, если вы нажмете кнопку «Назад», вам необходимо пройти аутентификацию снова.

2

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

  1. доверчивы учетные данные из браузера, а не на текущей сессии, или
  2. не проверяя, что текущий сеанс разрешен доступ данные, представленные значения ключ/идентификатор отправленного из браузер

Я рекомендую, чтобы после входа пользователя вы никогда не доверяете имени пользователя, предоставленному браузером. В идеале используйте службы безопасности фрейма, такие как Spring Security, но в их отсутствие вы можете положиться на HttpServletRequest.getUserPrincipal().

Чтобы убедиться, что текущий сеанс разрешен для доступа к данным, вы можете использовать механизм списка контроля доступа, предоставляемый инфраструктурой, такой как Spring Security, или включать в запросы базы данных WHERE OWNER=?.

0

Если вы беспокоитесь о том, что кто-то видит то, что было в форме на предыдущей странице, вы можете использовать скрытую форму для «реального» сообщения и использовать тот, который предназначен только для отображения для пользователя. Когда пользователь отправляет форму отображения, вы копируете все поля в скрытую форму, очищаете форму отображения, а затем отправляете скрытую.

Я согласен со всеми остальными - возиться с обратной кнопкой, это плохой способ обработки защищенной информации.

0

Я не уверен на 100%, это исправление вашей проблемы, так как я не совсем понимаю, как вы получите данные другого пользователя, используя обратную. Тем не менее, я знаю, что для разрабатываемых веб-приложений я стараюсь использовать только Redirect After Post, чтобы избежать кнопки «Назад» и обновления дубликатов.

0

Джефф Этвуд описал способ предотвращения атак CSRF и XSRF here.

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

1

Я не уверен, что правильно понимаю вашу проблему, но похоже, что вы разрешаете репосты.

Один из подходов к предотвращению повторной подачи - использовать токены. Поместите случайный токен в форму и сеанс. При регистрации представления о том, что представленный маркер соответствует маркеру в сессии

  • если это произойдет, замените маркер на сессии с свежей и обработать запрос
  • в противном случае прекратить обработку запроса).
1

Все различные браузеры имеют разные поведения и причуды, когда дело касается истории, связанной с кешем и различными заголовками, доступными для управления им. Firefox 3 работает по-другому от Firefox 2, повторно отображая потенциально конфиденциальные данные, когда пользователь нажимает кнопку «Назад», несмотря на использование директив кэширования, чтобы предотвратить это.Лучшим решением является использование cookie сеанса, который не сохраняется и информирует пользователя о необходимости закрыть окно браузера после выхода из системы. Особенно, если они находятся на публичном терминале. Болезненный, я знаю, но текущие предложения браузера и спецификация HTTP не предоставляют никаких механизмов для работы с историей браузера. История может обрабатываться иначе, чем кеширование пользовательским агентом в соответствии со спецификацией HTTP. См. 13.13 History Lists, как определено в RFC 2616 Протокол передачи гипертекста - HTTP/1.1 для проблемы и обоснования.

0

Я думаю, что это проблема интерфейса пользователя как проблема с кодированием. В дополнение к любым используемым методам анти-кэширования вы должны дать понять пользователю, что они должны нанести большую, очевидную кнопку «Выход» (или эквивалентную), когда они будут выполнены.

0

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

Смежные вопросы