ป้องกันไม่ให้ผู้ใช้เห็นหน้าที่ปลอดภัยที่เยี่ยมชมก่อนหน้านี้หลังจากออกจากระบบ


99

ฉันมีข้อกำหนดว่าผู้ใช้ปลายทางไม่ควรกลับไปที่หน้าที่ถูก จำกัด หลังจากออกจากระบบ / ออกจากระบบ แต่ในปัจจุบันผู้ใช้สามารถทำได้โดยใช้ปุ่มย้อนกลับของเบราว์เซอร์ไปที่ประวัติเบราว์เซอร์หรือแม้กระทั่งป้อน URL ซ้ำในแถบที่อยู่ของเบราว์เซอร์

โดยพื้นฐานแล้วฉันต้องการให้ผู้ใช้ปลายทางไม่สามารถเข้าถึงเพจที่ถูก จำกัด ได้ไม่ว่าจะด้วยวิธีใดก็ตามหลังจากออกจากระบบ ฉันจะทำสิ่งนี้ให้ดีที่สุดได้อย่างไร? ฉันสามารถปิดใช้งานปุ่มย้อนกลับด้วย JavaScript ได้หรือไม่?


7
ใช้รูปแบบ Post-request-get Google it

คำตอบ:


137

คุณสามารถและไม่ควรปิดใช้งานปุ่มย้อนกลับหรือประวัติของเบราว์เซอร์ ไม่ดีต่อประสบการณ์ของผู้ใช้ มีการแฮ็ก JavaScript แต่ไม่น่าเชื่อถือและจะไม่ทำงานเมื่อไคลเอนต์ปิดใช้งาน JS

ปัญหาที่เป็นรูปธรรมของคุณคือหน้าที่ร้องขอถูกโหลดจากแคชของเบราว์เซอร์แทนที่จะส่งตรงจากเซิร์ฟเวอร์ สิ่งนี้ไม่เป็นอันตรายเป็นหลัก แต่สร้างความสับสนให้กับ enduser เพราะเขา / เขาคิดไม่ถูกว่ามันมาจากเซิร์ฟเวอร์จริงๆ

คุณเพียงแค่สั่งให้เบราว์เซอร์ไม่แคชเพจ JSP ที่ถูก จำกัดทั้งหมด (และไม่เพียง แต่หน้าออกจากระบบ / การกระทำเท่านั้น!) วิธีนี้เบราว์เซอร์จะถูกบังคับให้ร้องขอเพจจากเซิร์ฟเวอร์แทนที่จะเรียกใช้จากแคชและด้วยเหตุนี้การตรวจสอบการเข้าสู่ระบบทั้งหมดบนเซิร์ฟเวอร์จะถูกดำเนินการ คุณสามารถทำได้โดยใช้ตัวกรองซึ่งตั้งค่าส่วนหัวการตอบกลับที่จำเป็นในdoFilter()วิธีการ:

@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);
    }

    // ...
}

แผนที่นี้Filterในที่น่าสนใจเช่นurl-pattern*.jsp

@WebFilter("*.jsp")

หรือหากคุณต้องการ จำกัด ข้อ จำกัด นี้ไว้ในหน้าที่มีการรักษาความปลอดภัยเท่านั้นคุณควรระบุรูปแบบ URL ที่ครอบคลุมหน้าที่ปลอดภัยเหล่านั้นทั้งหมด ตัวอย่างเช่นเมื่อทั้งหมดอยู่ในโฟลเดอร์/appคุณจะต้องระบุรูปแบบ URL ของ/app/*.

@WebFilter("/app/*")

ยิ่งไปกว่านั้นคุณสามารถทำงานนี้ได้เช่นเดียวFilterกับที่ที่คุณกำลังตรวจสอบการมีอยู่ของผู้ใช้ที่ลงชื่อเข้าใช้

อย่าลืมล้างแคชของเบราว์เซอร์ก่อนทดสอบ! ;)

ดูสิ่งนี้ด้วย:


2
บางครั้งสิ่งนี้ไม่เพียงพอฉันจำได้ว่ามีปัญหาดังกล่าว เบราว์เซอร์จะจำหน้าสุดท้ายได้ แต่มันอาจจะเป็น IE6 ฉันจำไม่ได้ :)
Bozho

3
@Bozho: ไม่ว่าคุณจะให้ชุดส่วนหัวที่ไม่สมบูรณ์หรือเบราว์เซอร์มีหน้ายังอยู่ในแคช
BalusC

1
@Chris: ใช้ได้กับ Firefox และเบราว์เซอร์อื่น ๆ ทั้งหมด ปัญหาของคุณเกิดจากที่อื่น บางทีคุณอาจลืมล้างแคช? หรือส่วนหัวเหล่านั้นตั้งค่าการตอบสนองที่ไม่ถูกต้อง?
BalusC

@BalusC ฉันสร้างคลาสตัวกรองแยกต่างหากเพื่อแทนที่doFilter()เมธอด เมื่อฉันกดปุ่มออกจากระบบมันจะถูกเปลี่ยนเส้นทางไปยัง servlet โดยที่ในฉันทำให้เซสชันไม่ถูกต้อง ฉันไม่แน่ใจว่าวิธีdoFilter()นี้เข้ามาเล่นได้อย่างไร คุณช่วยบอกวิธีการใช้งานได้ไหม ในขั้นตอนที่ถูกต้องในการปฏิบัติตาม ขอบคุณ.
Anjan Baradwaj

ทำงานได้ดีสำหรับฉัน หลังจากที่ทั้งสองได้รับการทดสอบและsendRedirect(...) forward()
Hal50000

5

* .jsp ในรูปแบบ URL จะใช้ไม่ได้หากคุณส่งต่อเพจ พยายามใส่ servlet ของคุณด้วย .. ที่จะทำให้แอปพลิเคชันของคุณปลอดภัยจากปัญหาปุ่มย้อนกลับ


2

วิธีที่ง่ายที่สุดในการดำเนินการโดยไม่ปิดการใช้งานเบราว์เซอร์ back buton คือการเพิ่มรหัสนี้ในpage_loadเหตุการณ์สำหรับหน้าที่คุณไม่ต้องการให้ผู้ใช้กลับไปหลังจากออกจากระบบ:

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");
        }
    }

6
แม้ว่าคำตอบของคุณจะมีประโยชน์โปรดโพสต์คำตอบที่เกี่ยวข้องกับภาษาการเขียนโปรแกรมของ OP ที่คุณเลือก โซลูชัน C # ของคุณจะไม่ช่วยในโครงการ Java EE ของ OP
Buhake Sindi

0

คุณสามารถลองบอกเบราว์เซอร์ว่าอย่าแคชหน้าแรก (โดยใช้ส่วนหัวที่เหมาะสม - Expires, Cache-Control, Pragma) แต่ไม่รับประกันว่าจะได้ผล สิ่งที่คุณสามารถทำได้คือโทร ajax ไปยังเซิร์ฟเวอร์ในการโหลดหน้าเว็บเพื่อตรวจสอบว่าผู้ใช้เข้าสู่ระบบหรือไม่และถ้าไม่ - เปลี่ยนเส้นทาง


13
แต่ถ้าจิตใจชั่วร้ายปิดการใช้งาน JavaScript สิ่งนี้จะไม่ได้ผลและเขาจะเห็นหน้านั้นอย่างไรก็ตาม
acme

0

วิธีที่ถูกต้องในการทำเช่นนี้คือการเพิ่มไฟล์

Vary: Cookie

ส่วนหัวของหน้าที่ปลอดภัย เมื่อผู้ใช้ออกจากระบบให้ล้างคุกกี้เซสชันของตน จากนั้นเมื่อพวกเขาย้อนกลับไปหลังจากออกจากระบบแคชของเบราว์เซอร์จะพลาด นอกจากนี้ยังมีประโยชน์ของการไม่เอาชนะแคชอย่างสมบูรณ์

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.