ป้องกันการ back กลับ หลังจาก login, logout ออกไปแล้ว ทำไมยัง back กลับปกติได้ครับ หรือทำผิดพลาด ชี้แนะด้วยครับ
ถ้า logout แล้วกด back กลับมาแต่ยังอยู่ มันอาจจะเป็น cache ที่ค้างของเก่าอยู่
ถ้ากด refresh/reload แล้วไม่อยู่หน้าเดิมแต่แจ้งว่าไม่ได้ login ก็แสดงว่าใช่ เป็นเพราะ cache
ถ้าต้องการไม่ให้ cache ในหน้าที่ต้องตรวจ login เสมอและต้องตรวจแบบสดใหม่ไม่ยอมให้ cache ให้หาโค้ด php no cache มาใช้
ตัวอย่าง
Code (PHP)
header("Cache-Control: no-store, no-cache, must-revalidate, max-age=0");
header("Cache-Control: post-check=0, pre-check=0", false);
header("Pragma: no-cache");
https://stackoverflow.com/questions/13640109/how-to-prevent-browser-cache-for-php-site
Date :
2021-11-11 17:25:40
By :
mr.v
จากที่ไปแก้ไข ป้องกันการ back login, logout ครับ
1. สิ่งที่แก้ไข คือ ใส่ session_destroy();ไว้บนสุดของ login
= ผลที่ตามมา คือ เมื่อ login แจ้งเข้าสู่ระบบสำเร็จ แล้วกลับมายังหน้า login เหมือนเดิมครับ
2.ผมแก้ไขรอบใหม่ คือ จาก session_destroy();ไว้บนสุดของ login
= ผมเปลี่ยน session_destroy(); ไว้บนสุดของ sidebar ครับ
= ผลที่ตามมา 1 คือ เมื่อ login แจ้งเข้าสู่ระบบสำเร็จ redirect ไปยังหน้า pages admin (ถูกต้องครับ)
= ผลที่ตามมา 2 คือ เมื่อ login แจ้งเข้าสู่ระบบสำเร็จ redirect ไปยังหน้า pages admin ถ้ากด back กลับไปจะถูกล้าง session_destroy และให้ login ใหม่ (ถูกต้องครับ)
= ผลที่ตามมา 3 คือ เมื่อ logout ยืนยันการออกจากระบบ redirect มายังหน้า login กด back กลับไปไม่ได้ (ถูกต้องครับ)
3.ผมเจอระหว่าง เมื่อ session_destroy(); ไว้บนสุดของ sidebar ครับ
= ผลที่ตามมา คือ เมื่อคลิกเมนู sidebar ทุกเมนู กลับให้ login ใหม่ครับ ขอคำแนะนำด้วยครับ
ผมสังสัยว่าทำไมต้อง login ใหม่ เวลาคลิกเมนู sidebar ทุกเมนู เพราะทั้งๆ ที login แจ้งเข้าสู่ระบบสำเร็จ redirect ไปยังหน้า pages admin แล้วครับ
(แต่เมื่อปิด session_destroy(); เมนู sidebar ทุกเมนูกลับทำงานได้ปกติครับ แต่เวลากด back สามารถกดกลับไป กลับมาได้ ผลที่ตามมา 2 ที่อธิบายข้อที่ 2 ไม่ทำงานเช่นกันครับ เมื่อปิด session_destroy(); )
Code (sidebar)
require_once('../../../database/connection.php');
session_destroy();
$status = isset($_SESSION['status']) ? $_SESSION['status'] : '';
if($status != "admin")
{
header('location:../../../index.php');
exit();
}
Date :
2021-11-16 12:01:42
By :
TeeTs
ก็คุณเล่นเอา session_destroy() ไปไว้ตรงนั้นมันก็ทำงานน่ะสิครับ
คุณเขียนโดยไม่เข้าใจความหมายของคำสั่งนั้นๆเลย
ควรออกแบบใหม่ ทดลองเขียนกระบวนการทำงานบนกระดาษก็ได้ จะได้เห็นภาพรวม
หน้า login ความจริงแล้วไม่มีใครเขาไปทำอะไรกับมันมากเท่าไหร่หรอก ดูอย่างพวก cms WordPress, Joomla, Drupal ก็ได้ เขาปล่อยเลย จะเปิดก็เปิดไป เพราะผู้ใช้อาจเปลี่ยนใจกลับไป login ใหม่ได้โดยไม่ต้องเสียเวลา logout
แต่ถ้าจะทำให้ redirect เมื่อ login แล้ว การตรวจ session login แล้วต้องมาก่อนอันดับแรก ถ้ามี session login แล้วให้ redirect ไปหน้า admin ถ้าไม่มีก็ปล่อยทำงานหน้า login ไป
หน้า admin ก็ทำไฟล์ include สักอันตรวจการ login
ถ้าไม่มี session login เลยก็ให้ redirect ไปหน้า login ถ้ามีก็ปล่อย
หน้า logout ถึงค่อยทำ session_destroy() หรือล้าง session โดยไม่ต้อง destroy
Date :
2021-11-16 12:32:29
By :
mr.v
sidebar มันคือส่วนที่ควรจะเป็นว่าด้วยการแสดงผล
การประมวลผลมันต้องแยกออกมาและอยู่ก่อน อยู่ด้านบน การแสดงผลอยู่ด้านล่าง ไม่ใช่เอามาเปะปะกันปนกันมั่ว
คุณลองเอาโค้ดนี้ไปรันบน server ที่หลากหลายดูซิ มันจะต้องมีเดี้ยงสัก server หนึ่ง
Code (PHP)
<?php
session_start();
?>
sidebar
<?php
if (!isset($_SESSION['loggedin'])) {
header('Location: /admin/login.php');
}
?>
เพราะตัวอย่างข้างบนนี่มันจะไปเจอตอ output buffer ที่ถูกปิดในบาง server หรือบางกรณี server จริงอาจจะปิดไว้ หรือกรณีถ้ามีปัญหาในงานส่วนอื่นบางอย่าง แล้วมีการต้องปิด output buffer ลงไป
ไม่ว่ากรณีไหน มันจะมีปัญหา redirect ไม่ได้ เพราะออกแบบผิด!
ตัวอย่างที่ผมให้ไปมีเยอะแยะไม่รู้ได้ดูบ้างหรือเปล่าเพราะกระทู้ก่อนๆก็เห็นได้ชัดว่าตอบแล้วก็ไม่ค่อยจะอ่านจะดู. อย่างตัวอย่างก็ให้ในลิ้งค์มีหลากหลาย ของดีๆก็มีเยอะ ก็ยังจะมาขอ example
คุณลองดูตัวอย่างของเขาแล้วเลาะออกมาเป็นกระบวนการ เขียนลงบนกระดาษ ดูว่าในแต่ละหน้าเช่น login, logout กระบวนการทำงานของเขา เขาทำอะไรก่อนหลัง คล้ายอย่างที่ผมบอกหรือเปล่า
Date :
2021-11-16 14:53:30
By :
mr.v
ตัวอย่างหน้า login
--------------------------------------
* ตรวจ session user login ว่ามีหรือไม่
..* ถ้ามีแล้วให้ redirect ไปหน้า admin แล้วสิ้นสุดการทำงาน -|
..* ถ้าไม่มีไม่ต้องทำอะไร ปล่อยให้ข้างล่างทำงานต่อ
* ถ้า form มีการ submit
..* ตรวจ username กับฐานข้อมูล
..* ถ้าไม่มีให้บอก username หรือ password ผิด แล้วสิ้นสุดการทำงาน -|
..* ถ้ามี ตรวจรหัสผ่านต่อ
....* ถ้าไม่ถูก ให้บอก username, password ผิด แล้วสิ้นสุดการทำงาน -|
..* มาถึงตรงนี้คือรหัสผ่านถูก username พบ ให้เขียน session login ที่ต้องการกำหนด
..* เสร็จแล้ว redirect ไปหน้า admin แล้วสิ้นสุดการทำงานของ login -|
----------------------------------------
นี่ตัวอย่างกระบวนการ แค่หน้าเดียว เทียบดูกับของเดิมอันแรกของคุณไปเอาการตรวจ session login ไปยัดไว้ข้างในไหนๆมันเลยไม่ทำงานไง
พอมองออกหรือยัง
หน้าอื่นก็ออกแบบมาอย่างงี้ก่อน ตรวจดูว่าโฟลวมันควรทำงานได้แล้วค่อยโค้ด
ประวัติการแก้ไข 2021-11-16 15:19:29
Date :
2021-11-16 15:19:02
By :
mr.v
$_SESSION['loggedin'] ไม่มีคุณจะใช้อะไรก็แล้วแต่คุณ ให้สมมุติว่ามันคือ session ที่เอาไว้ตรวจ login แล้ว เฉยๆ
Date :
2021-11-16 15:25:54
By :
mr.v
Load balance : Server 04