9

ユーザーが戻るボタンを押して前のユーザーの情報を表示できないようにするために、サーブレットを使用して Java Web アプリを開発しています。次のコードがあります。

      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/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;
  }
}

これまでのところ、まだ正しく動作していません。戻るボタンを押すと、データの有効期限が切れていることを知らせる警告ウィンドウが表示され、ユーザーに再投稿するかどうか尋ねられます。はいを選択すると、以前のページの情報が表示されます。私は何を間違っていますか?修正は何ですか?

フランク


はい、公共の場所で PC 用の Web アプリを開発しています。ユーザー B が戻るボタンを押すと、ユーザー A の個人情報が表示される可能性があります。

サーブレットでセッション ID を使用しようとしていましたが、その方法、サンプル コードはありますか?

私も次のことを試しました:

<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でも機能します。

4

13 に答える 13

12

戻るボタンを押すと、ユーザーは別のユーザーのデータをどのように見ることができますか? あなたのユースケースは何ですか?各ユーザーがデータを送信してから離れる公衆端末用に設計されていますか? この場合、各入力を一意のセッション ID に関連付けます。サーバーで有効なセッション ID を追跡します。入力が送信されたら、そのセッション ID を有効な ID から削除します。再度表示される場合は、情報を表示しないでください。

于 2008-10-31T13:24:12.893 に答える
10

あなたの問題は、クライアントが自分のコンピューターにあるものを見ないようにしようとしていることです。彼らがブラウザのキャッシュを見ないようにすることはできません。JavaScript (およびスクリプト コード) を無効にすることはできません。あなたが言及した「再投稿」の慣習に従わないブラウザを使用しないようにすることはできません。

これは、JavaScript やサーバー側のソリューションで解決できる問題ではありません。「戻るボタンを壊す」ことが嫌われている理由のその部分: 実際には何も解決しません.

于 2008-10-31T13:29:22.447 に答える
3

戻るボタンを壊すことは、Web 開発の重大な罪です。

ただし、現在ログインしているセッションに従って詳細を更新する onload で Java スクリプトを少し試すことができます。

于 2008-10-31T13:16:43.907 に答える
2

あなたの本当の問題は、再投稿が機能することです。それはおそらく次の理由によるでしょう。

  1. 現在のセッションではなくブラウザからの資格情報を信頼している、または
  2. 現在のセッションが、ブラウザから送信されたキー/識別子の値によって表されるデータへのアクセスを許可されていることを確認していません

ユーザーがログインした後は、ブラウザーから送信されたユーザー名を決して信用しないことをお勧めします。Spring Securityのようなフレームワークのセキュリティ サービスを使用するのが理想的ですが、それらがない場合はHttpServletRequest.getUserPrincipal()に依存できます。

現在のセッションがデータへのアクセスを許可されていることを確認するには、Spring Security などのフレームワークによって提供されるアクセス制御リスト メカニズムを使用するか、WHERE OWNER=?データベース クエリに句を含めることができます。

于 2008-10-31T13:36:06.537 に答える
1

問題を正しく理解しているかどうかはわかりませんが、再投稿を許可しているようです。

再送信を防ぐ 1 つの方法は、トークンを使用することです。フォームとセッションにランダムなトークンを入れます。送信時に、送信されたトークンがセッションのトークンと一致することを確認します

  • 存在する場合は、セッション内のトークンを新しいものに置き換えて、リクエストを処理します
  • それ以外の場合は、リクエストの処理を停止します)。
于 2008-10-31T15:58:40.883 に答える
1

履歴がキャッシュとそれを制御するために使用できるさまざまなヘッダーにどのように関連するかについては、すべてのブラウザーが異なる動作と癖を持っています。Firefox 3 は Firefox 2 とは動作が異なり、キャッシュ ディレクティブを使用して防止しているにもかかわらず、ユーザーが [戻る] ボタンをクリックすると、潜在的に機密性の高いデータが再表示されます。最善の解決策は、永続化されないセッション Cookie を使用し、ログアウト後にブラウザ ウィンドウを閉じる必要があることをユーザーに通知することです。特に公共のターミナルにいる場合。辛いことは承知していますが、現在のブラウザー製品と HTTP 仕様には、ブラウザーの履歴を処理するためのメカニズムがまったく用意されていません。履歴は、HTTP 仕様に従って、ユーザー エージェントによるキャッシュとは異なる方法で処理される場合があります。13.13 履歴リストを参照してくださいRFC 2616 Hypertext Transfer Protocol -- HTTP/1.1 で定義されている問題とその根拠。

于 2008-10-31T21:04:24.930 に答える
1

あなたの問題を正確に理解しているかどうかはわかりません。ユーザー A がログオフし、ユーザー B が同じ PC とブラウザー インスタンスからログインした後、A が表示していたものをユーザー B が見られないようにしたいと考えていますか?

その場合は、ページが読み込まれるたびにユーザーの資格情報を確認するだけで十分です。現在のユーザーが、要求されているデータを表示する権限を持っていることを確認してください。

于 2008-10-31T13:21:43.803 に答える
0

これが役立つかもしれない場合。これはASPで機能し、他の言語でも同等のソリューションを使用します。

于 2008-12-04T15:58:51.410 に答える
0

別のユーザーのデータを元に戻す方法を完全には理解していないため、これが問題の修正であると 100% 確信しているわけではありません。ただし、私が開発する Web アプリでは、Redirect After Postのみを使用して、戻るボタンを回避し、重複したフォーム送信を更新しようとしていることを知っています。

于 2008-10-31T14:10:48.743 に答える
0

Jeff Atwood は、ここでCSRF および XSRF 攻撃を防ぐ方法を説明しました。

この手法を使用して、「ユーザーが見てはいけないものを見てしまう」という問題を解決できます。

于 2008-10-31T14:33:05.440 に答える
0

前のページのフォームの内容が誰かに見られるのが心配な場合は、「実際の」投稿には非表示のフォームを使用し、ユーザーに表示するためだけのフォームを使用できます。ユーザーが表示フォームを送信すると、すべてのフィールドが非表示のフォームにコピーされ、表示フォームがクリアされてから、非表示のフォームが送信されます。

私は他のすべての人に同意します-戻るボタンをいじることは、情報を保護するための悪い方法です。

于 2008-10-31T13:49:06.497 に答える
0

これは、コーディングの問題と同じくらいユーザー インターフェイスの課題だと思います。使用するアンチキャッシング手法に加えて、完了したら大きくて明白な「ログアウト」ボタン (または同等のボタン) を押す必要があることをユーザーに明確にする必要があります。

于 2008-11-21T15:10:11.217 に答える
-1

.Net でも同様の問題がありました。ログアウト ページに次の JavaScript を追加しました。

document.execCommand("ClearAuthenticationCache","false");

戻るボタンを押すと、もう一度認証する必要があります。

于 2008-10-31T13:31:54.517 に答える