Cegah pengguna melihat halaman aman yang dikunjungi sebelumnya setelah logout

99

Saya memiliki persyaratan bahwa pengguna akhir tidak boleh kembali ke halaman terbatas setelah logout / logout. Tetapi saat ini pengguna akhir dapat melakukannya dengan tombol kembali browser, mengunjungi riwayat browser atau bahkan dengan memasukkan kembali URL di bilah alamat browser.

Pada dasarnya, saya ingin pengguna akhir tidak dapat mengakses halaman terbatas dengan cara apa pun setelah keluar. Bagaimana saya bisa mencapai ini yang terbaik? Bisakah saya menonaktifkan tombol kembali dengan JavaScript?

raaz
sumber
7
Gunakan pola Post-request-get. Google itu.

Jawaban:

137

Anda dapat dan tidak boleh menonaktifkan tombol kembali atau riwayat browser. Itu buruk untuk pengalaman pengguna. Ada peretasan JavaScript, tetapi tidak dapat diandalkan dan juga tidak akan berfungsi jika JS klien dinonaktifkan.

Masalah konkret Anda adalah bahwa halaman yang diminta dimuat dari cache browser, bukan langsung dari server. Ini pada dasarnya tidak berbahaya, tetapi memang membingungkan bagi pengguna akhir, karena ia salah mengira bahwa ini benar-benar berasal dari server.

Anda hanya perlu menginstruksikan browser untuk tidak menyimpan semua halaman JSP yang dibatasi (dan dengan demikian tidak hanya halaman / tindakan logout itu sendiri!). Dengan cara ini browser dipaksa untuk meminta halaman dari server, bukan dari cache dan karenanya semua pemeriksaan login di server akan dijalankan. Anda dapat melakukan ini menggunakan Filter yang menyetel header respons yang diperlukan dalam doFilter()metode:

@WebFilter
public class NoCacheFilter implements Filter {

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

        response.setHeader("Cache-Control", "no-cache, no-store, must-revalidate"); // HTTP 1.1.
        response.setHeader("Pragma", "no-cache"); // HTTP 1.0.
        response.setDateHeader("Expires", 0); // Proxies.

        chain.doFilter(req, res);
    }

    // ...
}

Petakan ini Filterdi tempat yang url-patterndiminati, misalnya *.jsp.

@WebFilter("*.jsp")

Atau jika Anda ingin menempatkan batasan ini pada halaman aman saja, maka Anda harus menentukan pola URL yang mencakup semua halaman aman tersebut. Misalnya, jika semuanya ada di folder /app, maka Anda perlu menentukan pola URL /app/*.

@WebFilter("/app/*")

Terlebih lagi, Anda dapat melakukan pekerjaan ini sama Filterseperti saat Anda memeriksa keberadaan pengguna yang masuk.

Jangan lupa untuk membersihkan cache browser sebelum menguji! ;)

Lihat juga:

BalusC
sumber
2
Terkadang ini tidak cukup, saya ingat pernah mengalami masalah seperti itu. Browser hanya mengingat halaman terakhir. Tapi mungkin IE6, saya tidak ingat :)
Bozho
3
@Bozho: Entah Anda telah memberikan kumpulan tajuk yang tidak lengkap atau browser masih menyimpan laman dalam cache-nya.
BalusC
1
@ Chris: berfungsi untuk saya dengan Firefox dan semua browser lainnya. Masalah Anda disebabkan di tempat lain. Mungkin Anda lupa menghapus beberapa cache? Atau header tersebut disetel pada respons yang salah?
BalusC
@BalusC Saya membuat kelas Filter terpisah untuk mengganti doFilter()metode. Ketika saya menekan tombol logout itu diarahkan ke servlet di mana saya membatalkan sesi. Saya tidak yakin bagaimana doFilter()metode ini berperan di sini. Bisakah Anda memberi tahu saya bagaimana menerapkan ini? Seperti dalam, langkah-langkah yang benar untuk diikuti. Terima kasih.
Anjan Baradwaj
Bekerja dengan baik untuk saya. Diuji setelah sendRedirect(...)dan forward().
Hal50000
5

* .jsp dalam Pola Url tidak akan berfungsi jika Anda meneruskan halaman. Cobalah untuk memasukkan servlet Anda juga .. yang akan membuat aplikasi Anda aman dari masalah tombol kembali ini.

Sathyan
sumber
2

Cara termudah untuk melakukannya tanpa menonaktifkan browser kembali buton adalah dengan menambahkan kode ini ke page_loadacara untuk halaman yang Anda tidak ingin pengguna untuk kembali setelah logout:

if (!IsPostBack)
    {
        if (Session["userId"] == null)
        {
            Response.Redirect("Login.aspx");
        }
        else
        {
        Response.ClearHeaders();
        Response.ClearContent();
        Response.Clear();
        Session.Abandon();
        Session.Remove("\\w+");
        Response.AddHeader("Cache-Control", "no-cache, no-store, max-age = 0, must-revalidate");
        Response.AddHeader("Pragma", "no-cache");
        Response.AddHeader("Expires", "0");
        }
    }
Ashraf Abusada
sumber
6
Meskipun jawaban Anda bermanfaat, mohon kirimkan jawaban yang berhubungan dengan pilihan bahasa pemrograman OP. Solusi C # Anda tidak akan membantu dalam proyek OP Java EE.
Buhake Sindi
0

Anda dapat mencoba memberi tahu browser untuk tidak meng-cache beranda (menggunakan header yang sesuai - Kedaluwarsa, Kontrol-Cache, Pragma). Tapi itu tidak dijamin berhasil. Apa yang dapat Anda lakukan, adalah membuat panggilan ajax ke server saat pemuatan halaman untuk memeriksa apakah pengguna login, dan jika tidak - redirect.

Bozho
sumber
13
Tetapi jika pikiran jahat menonaktifkan JavaScript, ini tidak berfungsi dan dia akan tetap melihat halaman tersebut.
puncak
0

Cara yang benar untuk melakukannya adalah dengan menambahkan

Vary: Cookie

header pada halaman aman. Saat pengguna logout, hapus cookie sesi mereka. Kemudian, saat mereka menavigasi kembali setelah keluar, cache browser akan hilang. Ini juga memiliki keuntungan karena tidak sepenuhnya mengalahkan caching.

Dan
sumber