ออกจากระบบการตรวจสอบ HTTP ผ่าน PHP


151

เป็นสิ่งที่ถูกต้องวิธีที่จะออกจากระบบ HTTP โฟลเดอร์ที่มีการป้องกันการตรวจสอบ?

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


โปรดระบุวัตถุประสงค์สำหรับการออกจากระบบของคุณ นี่ควรเป็นการออกจากระบบบังคับ (การเลิกใช้งานของผู้ใช้) หรือไม่ ฟังก์ชั่นออกจากระบบที่เรียบง่ายสำหรับผู้ใช้? มีอะไรอีกไหม
Karsten

6
ฉันไม่เข้าใจว่าทำไมเรื่องนี้ถึงเกิดขึ้น แต่เป็นทั้งสองกรณี: การปิดใช้งานขึ้นอยู่กับเงื่อนไขภายในในแอปพลิเคชันรวมถึงปุ่มล็อกเอาต์ทั่วไป โปรดอธิบายว่าทำไมมันถึงมีความสำคัญฉันจะแก้ไขมันโดยตรงในคำถาม
Josef Sbl

2
"โซลูชันที่ถูกต้องและสะอาด" จะเป็นเบราว์เซอร์ที่มีปุ่มล็อกเอาต์ของตัวเองซึ่งเมื่อคลิกจะทำให้เบราว์เซอร์หยุดส่งส่วนหัวรับรองความถูกต้อง ... ใคร ๆ ก็ฝันได้ใช่ไหม
DanMan

1
แถบเครื่องมือสำหรับนักพัฒนาเว็บมี "ปุ่ม" ดังกล่าว
Josef Sábl

สิ่งที่ Josef กล่าว: แถบเครื่องมือผู้พัฒนาเว็บสำหรับ Firefox ->Miscellaneous -> Clear Private Data -> HTTP Authentication
Yarin

คำตอบ:


103

หมู่ ไม่มีวิธีที่ถูกต้องไม่มีแม้แต่วิธีที่สอดคล้องกันในเบราว์เซอร์

นี่เป็นปัญหาที่มาจากข้อมูลจำเพาะ HTTP (ส่วนที่ 15.6):

ไคลเอ็นต์ HTTP และเอเจนต์ผู้ใช้ที่มีอยู่โดยทั่วไปจะเก็บข้อมูลการพิสูจน์ตัวตนไว้โดยไม่มีกำหนด HTTP / 1.1 ไม่ได้ให้วิธีการสำหรับเซิร์ฟเวอร์ที่จะนำลูกค้าไปทิ้งข้อมูลประจำตัวที่แคชเหล่านี้

ในทางกลับกันมาตรา10.4.2พูดว่า:

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

กล่าวอีกนัยหนึ่งคุณอาจแสดงกล่องเข้าสู่ระบบอีกครั้ง (ตามที่@Karstenพูด) แต่เบราว์เซอร์ไม่จำเป็นต้องทำตามคำขอของคุณ - ดังนั้นอย่าพึ่งพาคุณลักษณะนี้ (mis) มากเกินไป


9
นี่เป็นข้อผิดพลาดใน RFC W3C ขี้เกียจเกินไปที่จะแก้ไข เศร้ามาก.
Erik Aronesty

ตามที่ @Jonathan Hanson แนะนำไว้ด้านล่างคุณสามารถใช้คุกกี้ติดตามพร้อมกับการตรวจสอบสิทธิ์ HTTP นี่เป็นวิธีที่ดีที่สุดสำหรับฉัน
machineaddict

61

วิธีการที่ทำงานได้ดีใน Safari ยังทำงานได้ใน Firefox และ Opera แต่มีคำเตือน

Location: http://logout@yourserver.example.com/

สิ่งนี้บอกให้เบราว์เซอร์เปิด URL ด้วยชื่อผู้ใช้ใหม่แทนที่ชื่อก่อนหน้า


14
ตาม RFC 3986 (URI: ไวยากรณ์ทั่วไป) ส่วน 3.2.1 (ข้อมูลผู้ใช้) การใช้งานuser:password@hostถูกคัดค้าน การใช้อย่างเดียวhttp://logout@yourserver.example.com/ไม่ได้และควรทำงานในกรณีส่วนใหญ่
aef

1
@andho: ใช่มันคือการเปลี่ยนเส้นทาง คุณควรใช้กับสถานะ 302
Kornel

1
เห็นได้ชัดว่าลิงค์ง่าย ๆ ในการlogout@yourserver.example.comยังสามารถใช้งานได้ (ลิงก์ "ตัดการเชื่อมต่อ" ไปยัง URL นี้) แทนการเปลี่ยนเส้นทาง http ใน PHP ... ข้อเสียคืออะไร
moala

4
ระวัง: การส่งแบบฟอร์มโดยใช้พา ธ สัมพัทธ์อาจล้มเหลวเมื่อดำเนินการหลังจากลงชื่อเข้าใช้อีกครั้ง (ลงชื่อเข้าใช้ด้วยพรอมต์ล็อกเอาต์) เนื่องจากที่อยู่จะยังคงเป็นlogout@yourserver.example.com/pathและไม่ใช่yourserver.example.com/path /
เจสัน

1
logout@yourserver.example.comทำงานได้ใน whitout ใน Chrome แต่มีข้อความแจ้งเตือนเรื่องความปลอดภัยใน Firefox ออกจากระบบ: true@yourserver.example.comปริมาณไม่ทำให้ Firefox เป็นเงื่อนไขด้านความปลอดภัย ทั้งสอง URL ไม่ทำงานใน IE8: /
Thor A. Pedersen

46

คำตอบง่ายๆคือคุณไม่สามารถออกจากระบบ http-authentication ได้อย่างน่าเชื่อถือ

คำตอบที่ยาวนาน:
Http-auth (เช่นส่วนที่เหลือของสเปค HTTP) หมายถึงไร้สัญชาติ ดังนั้นการ "เข้าสู่ระบบ" หรือ "ออกจากระบบ" ไม่ใช่แนวคิดที่เหมาะสม วิธีที่ดีกว่าในการดูคือการถามสำหรับคำขอ HTTP แต่ละครั้ง (และโปรดจำไว้ว่าการโหลดหน้าเว็บมักจะมีหลายคำขอ) "คุณได้รับอนุญาตให้ทำสิ่งที่คุณขอหรือไม่" เซิร์ฟเวอร์จะเห็นคำขอแต่ละคำขอใหม่และไม่เกี่ยวข้องกับคำขอก่อนหน้านี้

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

ดังนั้น "การออกจากระบบ" ในบริบทของ http-auth จึงเป็นการจำลองโดยเบราว์เซอร์และอยู่นอกเหนืออำนาจของเซิร์ฟเวอร์

ใช่มีกากบาด แต่พวกเขาจะทำลายความสงบ (ถ้านั่นคือสิ่งที่มีค่าสำหรับคุณ) และพวกเขาจะไม่น่าเชื่อถือ

หากคุณต้องการรูปแบบการเข้าสู่ระบบ / ออกจากระบบอย่างแท้จริงสำหรับการตรวจสอบเว็บไซต์ของคุณทางออกที่ดีที่สุดคือคุกกี้การติดตามด้วยความคงอยู่ของรัฐที่เก็บไว้บนเซิร์ฟเวอร์ในบางลักษณะ (mysql, sqlite, flatfile ฯลฯ ) สิ่งนี้จะต้องมีการประเมินคำขอทั้งหมดเช่นกับ PHP


26

วิธีแก้ปัญหา

คุณสามารถทำได้โดยใช้ Javascript:

<html><head>
<script type="text/javascript">
function logout() {
    var xmlhttp;
    if (window.XMLHttpRequest) {
          xmlhttp = new XMLHttpRequest();
    }
    // code for IE
    else if (window.ActiveXObject) {
      xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
    }
    if (window.ActiveXObject) {
      // IE clear HTTP Authentication
      document.execCommand("ClearAuthenticationCache");
      window.location.href='/where/to/redirect';
    } else {
        xmlhttp.open("GET", '/path/that/will/return/200/OK', true, "logout", "logout");
        xmlhttp.send("");
        xmlhttp.onreadystatechange = function() {
            if (xmlhttp.readyState == 4) {window.location.href='/where/to/redirect';}
        }


    }


    return false;
}
</script>
</head>
<body>
<a href="#" onclick="logout();">Log out</a>
</body>
</html>

สิ่งที่ทำข้างต้นคือ:

  • สำหรับ IE - เพียงแค่ล้างแคชรับรองความถูกต้องและเปลี่ยนเส้นทางที่อื่น

  • สำหรับเบราว์เซอร์อื่น - ส่ง XMLHttpRequest ที่อยู่เบื้องหลังด้วยชื่อล็อกอินและรหัสผ่าน 'ล็อกเอาต์' เราจำเป็นต้องส่งไปยังพา ธ ที่จะส่งคืน 200 OK ไปยังคำขอนั้น (เช่นไม่ควรใช้การตรวจสอบสิทธิ์ HTTP)

แทนที่'/where/to/redirect'ด้วยบางเส้นทางเพื่อเปลี่ยนเส้นทางไปหลังจากออกจากระบบและแทนที่'/path/that/will/return/200/OK'ด้วยบางเส้นทางบนไซต์ของคุณที่จะคืนค่า 200 OK


5
เป็นวิธีแก้ปัญหาเล็กน้อยในการเข้าสู่ระบบในฐานะผู้ใช้รายอื่น แต่ใช้งานได้จริงและสมควรได้รับเครดิตมากขึ้น
Charlie Rudenstål

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

2
นี่คือสิ่งที่ฉันต้องการ - ทำงานในเบราว์เซอร์ทั้งหมดโดยไม่มีปัญหา เก็บหน้า "ล็อกเอาต์" ที่ฉันได้รับเหมือนเดิม ฉันไม่ต้องการใช้ JS (อาจไร้เหตุผล) แต่คำตอบอื่น ๆ ทั้งหมดมีปัญหาข้ามเบราว์เซอร์และสิ่งนี้ทำงานได้สมบูรณ์
dgig

ฉันไม่สามารถอธิบายวิธีนี้ได้ เมื่อฉันกลับไปที่พื้นที่ปลอดภัยเบราว์เซอร์จะตรวจสอบตัวเองอีกครั้งด้วยการส่งข้อมูลรับรองที่ถูกต้องที่ใช้ล่าสุดในหัวข้อ อย่างไรก็ตามมีการเปลี่ยนแปลงเล็กน้อยสำหรับฉัน ฉันเปลี่ยนการตอบสนอง 200 OK ด้วยส่วนหัวที่มีขอบเขตเหมือนกันของพื้นที่ที่ปลอดภัย แต่ยอมรับเฉพาะผู้ใช้ "ล็อกเอาต์: ล็อกเอาต์" เท่านั้น ด้วยวิธีนี้ผู้ใช้เข้าสู่ระบบด้วยผู้ใช้ "ออกจากระบบ" นี้และนี่คือผู้ใช้ที่ลองใหม่เมื่อเขากลับไปที่พื้นที่ปลอดภัย พื้นที่ที่ปลอดภัยปฏิเสธผู้ใช้ / รหัสผ่านนี้เพื่อให้ผู้ใช้สามารถเปลี่ยนข้อมูลประจำตัว
jonaguera

2
สิ่งนี้ไม่ทำงานตามที่อธิบายไว้ ทดสอบใน Chrome 40 และ Firefox 35 แล้ว
funforums

13

วิธีแก้ปัญหา (ไม่ใช่วิธีแก้ปัญหาที่สะอาดดี (หรือแม้กระทั่งทำงาน! ดูความคิดเห็น)):

ปิดใช้งานข้อมูลรับรองของเขาหนึ่งครั้ง

คุณสามารถย้ายตรรกะการตรวจสอบ HTTP ของคุณไปที่ PHP ได้โดยส่งส่วนหัวที่เหมาะสม (หากไม่ได้เข้าสู่ระบบ):

Header('WWW-Authenticate: Basic realm="protected area"');
Header('HTTP/1.0 401 Unauthorized');

และแยกวิเคราะห์อินพุตด้วย:

$_SERVER['PHP_AUTH_USER'] // httpauth-user
$_SERVER['PHP_AUTH_PW']   // httpauth-password

ดังนั้นการปิดใช้งานข้อมูลประจำตัวของเขาในครั้งเดียวน่าจะเป็นเรื่องเล็กน้อย


18
ปัญหาเกี่ยวกับวิธีแก้ไขปัญหานี้คือ: คุณแจ้งให้ IE ทราบว่าข้อมูลรับรองไม่ถูกต้อง จะแสดงกล่องโต้ตอบเข้าสู่ระบบด้วยช่องว่าง (ไม่แสดงค่าที่เก็บไว้ในเครื่องมือจัดการรหัสผ่าน) แต่เมื่อคุณคลิกยกเลิกและรีเฟรชหน้าเว็บมันจะส่งข้อมูลรับรองที่เก็บไว้ดังนั้นจึงเข้าสู่ระบบอีกครั้ง
Josef Sábl

downvoted; เช่นเดียวกับ Josef Sable แสดงความคิดเห็นนี่ไม่ได้แก้ปัญหาในมือ
คริส Wesseling

7

ออกจากระบบ HTTP Basic Auth ในสองขั้นตอน

สมมติว่าฉันมีขอบเขตการตรวจสอบสิทธิ์ HTTP พื้นฐานชื่อ“ ป้องกันด้วยรหัสผ่าน” และ Bob เข้าสู่ระบบในการออกจากระบบฉันขอ AJAX 2 คำขอ:

  1. เข้าถึงสคริปต์ / logout_step1 เพิ่มผู้ใช้ชั่วคราวแบบสุ่มให้กับ. htusers และตอบกลับด้วยการเข้าสู่ระบบและรหัสผ่าน
  2. สคริปต์การเข้าถึง / logout_step2 รับรองความถูกต้องกับการเข้าสู่ระบบการใช้งานชั่วคราวและรหัสผ่าน สคริปต์ลบผู้ใช้ชั่วคราวและเพิ่มส่วนหัวนี้ในการตอบสนอง:WWW-Authenticate: Basic realm="Password protected"

ณ จุดนี้เบราว์เซอร์ลืมข้อมูลประจำตัวของ Bob


1
ว้าว! สิ่งนี้สมควรได้รับ +1 สำหรับความคิดสร้างสรรค์ที่แท้จริงแม้ว่ามันจะเป็นสิ่งที่ต้องทำ
Andy Triggs

7

วิธีแก้ไขปัญหาของฉันมีดังต่อไปนี้ คุณสามารถหาฟังก์ชั่นhttp_digest_parse, $realmและ$usersในตัวอย่างที่สองของหน้านี้: http://php.net/manual/en/features.http-auth.php

session_start();

function LogOut() {
  session_destroy();
  session_unset($_SESSION['session_id']);
  session_unset($_SESSION['logged']);

  header("Location: /", TRUE, 301);   
}

function Login(){

  global $realm;

  if (empty($_SESSION['session_id'])) {
    session_regenerate_id();
    $_SESSION['session_id'] = session_id();
  }

  if (!IsAuthenticated()) {  
    header('HTTP/1.1 401 Unauthorized');
    header('WWW-Authenticate: Digest realm="'.$realm.
   '",qop="auth",nonce="'.$_SESSION['session_id'].'",opaque="'.md5($realm).'"');
    $_SESSION['logged'] = False;
    die('Access denied.');
  }
  $_SESSION['logged'] = True;  
}

function IsAuthenticated(){
  global $realm;
  global $users;


  if  (empty($_SERVER['PHP_AUTH_DIGEST']))
      return False;

  // check PHP_AUTH_DIGEST
  if (!($data = http_digest_parse($_SERVER['PHP_AUTH_DIGEST'])) ||
     !isset($users[$data['username']]))
     return False;// invalid username


  $A1 = md5($data['username'] . ':' . $realm . ':' . $users[$data['username']]);
  $A2 = md5($_SERVER['REQUEST_METHOD'].':'.$data['uri']);

  // Give session id instead of data['nonce']
  $valid_response =   md5($A1.':'.$_SESSION['session_id'].':'.$data['nc'].':'.$data['cnonce'].':'.$data['qop'].':'.$A2);

  if ($data['response'] != $valid_response)
    return False;

  return True;
}

4

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


ฉันเชื่อว่ามีตัวเลือกในการลบเซสชันรับรองความถูกต้องเมื่อคุณเลือก "ลบข้อมูลส่วนตัว" ใน Firefox
Kristian J.

1
นอกจากนี้ส่วนขยายแถบเครื่องมือนักพัฒนาเว็บสำหรับ Firefox มีคุณสมบัติในการลบ HTTP Authentication แต่นี่เป็นปัญหาเพราะเราไม่สามารถขอให้ผู้ใช้ของเราดาวน์โหลดส่วนขยาย FF หรือเรียกใช้คำสั่งเบราว์เซอร์ที่เป็นความลับ :-)
Josef Sábl

2
วิธีการเริ่มต้นของ Firefox ในการออกจากระบบ HTTP auth นั้นมีอยู่ใน "เครื่องมือ"> "ล้างประวัติล่าสุด ... " ในฐานะช่องทำเครื่องหมาย "Active Logins" นี่ไม่ใช่การหยั่งรู้และไม่อนุญาตให้คุณออกจากระบบหนึ่งโดเมนเท่านั้นคุณจะออกจากระบบทุกหน้า
aef

2

Trac - โดยค่าเริ่มต้น - ใช้การตรวจสอบสิทธิ์ HTTP เช่นกัน การออกจากระบบไม่ทำงานและไม่สามารถแก้ไขได้:

  • นี่เป็นปัญหาของชุดรูปแบบการตรวจสอบความถูกต้อง HTTP และไม่มีสิ่งใดที่เราสามารถทำได้ใน Trac เพื่อแก้ไขอย่างถูกต้อง
  • ขณะนี้ไม่มีวิธีแก้ไข (JavaScript หรืออื่น ๆ ) ที่ใช้งานได้กับเบราว์เซอร์หลักทั้งหมด

จาก: http://trac.edgewall.org/ticket/791#comment:103

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


2

ฉันต้องการรีเซ็ตการอนุญาต. htaccess ดังนั้นฉันจึงใช้สิ่งนี้:

<?php
if (!isset($_SERVER['PHP_AUTH_USER'])) {
    header('WWW-Authenticate: Basic realm="My Realm"');
    header('HTTP/1.0 401 Unauthorized');
    echo 'Text to send if user hits Cancel button';
    exit;
}
?>

พบได้ที่นี่: http://php.net/manual/en/features.http-auth.php

ไปคิด

มีโซลูชันจำนวนหนึ่งตั้งอยู่บนหน้านั้นและแม้จะมีการบันทึกไว้ที่ด้านล่าง: คมไม่ล้างการรับรองความถูกต้องเหมือนเบราว์เซอร์อื่น ๆ )

ฉันทดสอบมันบนเบราว์เซอร์ที่ติดตั้งของฉันและเมื่อปิดแล้วเบราว์เซอร์แต่ละตัวก็ดูเหมือนว่าจะต้องมีการใช้ซ้ำอีกครั้ง


ดูเหมือนจะไม่ทำงานฉันได้รับข้อความยกเลิกโดยไม่มีกล่องเข้าสู่ระบบแบบผุดขึ้น
ไมเคิล

ปรากฎการส่งสิ่งที่WWW-Authenticateทำให้เกิดปัญหาการกำจัดออกจากระบบฉันออกโดยอัตโนมัติ
Michael

และในทางกลับกันดูเหมือนว่าการไม่ส่งWWW-Authenticateขณะแก้ไขปัญหาในเบราว์เซอร์เดียว (Chrome) ทำให้เบราว์เซอร์อื่น (Firefox) จดจำข้อมูลประจำตัวและส่งพวกเขาในคำขอถัดไปทำให้เกิดการลงชื่อเข้าใช้อัตโนมัติอีกครั้ง! โอ๊ะ!
Michael

จากนั้นดูที่ UA และทำอย่างใดอย่างหนึ่งดูเหมือนว่าวิธีการแก้ปัญหา
Lennart Rolland

2

นี่อาจไม่ใช่ทางออกที่ถูกมองหา แต่ฉันแก้ไขได้เช่นนี้ ฉันมี 2 สคริปต์สำหรับกระบวนการออกจากระบบ

logout.php

<?php
header("Location: http://.@domain.com/log.php");
?>

log.php

<?php
header("location: https://google.com");
?>

วิธีนี้ฉันจะไม่ได้รับคำเตือนและเซสชันของฉันจะสิ้นสุดลง


1
นี่เป็นทางออกเดียวสำหรับฉันจริงๆ! ทดสอบกับ Firefox 37 และ Chromium 41
zesaver

1

AFAIK ไม่มีวิธีใหม่ ๆ ในการใช้ฟังก์ชั่น "logout" เมื่อใช้การพิสูจน์ตัวตน htaccess (เช่นใช้ HTTP)

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


1

ทางออกที่ดีที่สุดที่ฉันพบคือ (มันเป็นรหัสหลอกรหัส$isLoggedInตัวแปรหลอกสำหรับ http auth):

ในช่วงเวลาของการ "ออกจากระบบ" เพียงแค่เก็บข้อมูลบางอย่างไว้ในเซสชั่นบอกว่าผู้ใช้ออกจากระบบจริง

function logout()
{
  //$isLoggedIn = false; //This does not work (point of this question)
  $_SESSION['logout'] = true;
}

ในสถานที่ที่ฉันตรวจสอบความถูกต้องฉันจะขยายเงื่อนไข:

function isLoggedIn()
{
  return $isLoggedIn && !$_SESSION['logout'];
}

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


4
ในขณะที่การรับรองความถูกต้องพื้นฐาน http เป็นที่สงบเซสชันไม่ได้
deamon

1

บางทีฉันอาจจะพลาดจุดนี้

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


fyi เบราว์เซอร์บางตัวจะไม่ปิดหน้าต่างถ้าเปิดเฉพาะแท็บดังนั้นจุดที่สงสัยก็
จริงอยู่

หลายปีที่ผ่านมาฉันมีงานที่จะใช้ปุ่มล็อกเอาต์โดยไม่ต้องปิดหน้าต่าง :-) แต่บางทีพวกเขาอาจไม่ได้อยู่ที่ "ไม่ได้ปิดหน้าต่าง" แต่เดี๋ยวก่อนนี่เป็นวิธีง่ายๆที่อาจใช้ได้ผลกับใครบางคนและฉันก็พลาดไปแล้ว
Josef Sábl

1

วิธีที่มีประสิทธิภาพเดียวที่ฉันได้พบว่าเช็ดออกPHP_AUTH_DIGESTหรือPHP_AUTH_USERและข้อมูลประจำตัวคือการเรียกส่วนหัวPHP_AUTH_PWHTTP/1.1 401 Unauthorized

function clear_admin_access(){
    header('HTTP/1.1 401 Unauthorized');
    die('Admin access turned off');
}

0

ในขณะที่คนอื่น ๆ ถูกต้องในการบอกว่ามันเป็นไปไม่ได้ที่จะออกจากระบบการตรวจสอบ http พื้นฐานมีวิธีการใช้การรับรองความถูกต้องซึ่งมีพฤติกรรมคล้ายกัน หนึ่ง appeoach ที่เห็นได้ชัดคือการใช้auth_memcookie หากคุณต้องการใช้การรับรองความถูกต้อง HTTP พื้นฐาน (เช่นใช้กล่องโต้ตอบของเบราว์เซอร์สำหรับการเข้าสู่ระบบแทนที่จะเป็นรูปแบบ HTTP) โดยใช้สิ่งนี้ - เพียงแค่ตั้งค่าการรับรองความถูกต้องเป็นไดเรกทอรีที่ได้รับการป้องกันแยก. htaccess สร้างเซสชัน memcache


0

คำตอบที่นี่ซับซ้อนมากมาย ในกรณีของฉันโดยเฉพาะฉันพบการแก้ไขที่สะอาดและง่ายสำหรับการออกจากระบบ ฉันยังไม่ได้ทดสอบใน Edge ในหน้าของฉันที่ฉันเข้าสู่ระบบฉันได้วางลิงค์ล็อกเอาต์ที่คล้ายกับสิ่งนี้:

<a href="https://MyDomainHere.net/logout.html">logout</a>

และในส่วนหัวของหน้า logout.html นั้น (ซึ่งได้รับการป้องกันโดย. htaccess ด้วย) ฉันมีหน้ารีเฟรชที่คล้ายกับสิ่งนี้:

<meta http-equiv="Refresh" content="0; url=https://logout:logout@MyDomainHere.net/" />

ที่ซึ่งคุณจะปล่อยให้คำว่า "ออกจากระบบ" ในสถานที่เพื่อล้างชื่อผู้ใช้และรหัสผ่านที่แคชไว้สำหรับเว็บไซต์

ฉันจะยอมรับว่าหากจำเป็นต้องลงชื่อเข้าใช้หลายหน้าโดยตรงจากจุดเริ่มต้นจุดเริ่มต้นแต่ละจุดจะต้องมีหน้า logout.html ที่เกี่ยวข้อง มิฉะนั้นคุณสามารถรวมศูนย์กลางการออกจากระบบได้โดยการแนะนำขั้นตอนผู้รักษาประตูเข้าสู่กระบวนการก่อนที่จะมีพรอมต์การเข้าสู่ระบบที่แท้จริง


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