517322-Lecture: Session & Cookie

30/01/2013 6:03 PM Study 1,049 views

Maintaining State in PHP
(Cookies & Srssion)

Stateless & Stateful

  • client จะติดต่อกับ server ก่อนเสมอเพื่อเรียกดูหน้าหรือร้องขอหน้าเว็บหลังจาก server ส่งไปยัง client แล้วจะปิดการเชื่อต่อทันที
  • Stateless ไม่มีการจำสถานะก่อนหน้าว่าคืออะไร รับส่งมาจากไหน ไม่มีการเก็บเซสซั่น ถ้ามีการร้องขอซ้ำจะถูกส่งไปยังปลายทางทุกครั้ง เพราะ Stateless ไม่มีการจำว่าเคยส่งไปหรือยัง
  • Stateful จะมีการจำการร้องขอของ client และจดจำสถานะต่างๆ ที่ตั้งค่าไว้และจะไม่ส่งการร้องขอซ้ำที่มาจากเซสชั่นที่เดิม
  • โปรแกรมปัจจุบันมีการจดจำสถานะหรือข้อมูลบางอย่างที่สามารถเรียกกลับมาดูได้ ว่าครั้งสุดท้ายทำงานเมื่อไหร่ ทำงานอะไรและมีการจดจำการตั้งค่าต่างๆ
  • ตัวอย่างของสถานะแบบ Stateful เช่น การ Log in ผ่านหน้าเว็บ เมื่อ Log in เสร็จจะยังเก็บสถานะของผู้ใช้ไม่ว่าจะไปหน้าอื่นๆ ก็ยังคงอยู่ในระบบเหมือนเดิม

 State in PHP

  • ตัวแปรในภาษา PHP จะถูกทำลายเองหลังจากที่ใช้หน่วยความจำเสร็จและคืนค่าว่างให้หน่วยความจำกลับไป
  • PHP เป็นภาษา Script และยังสามารถอ้างอิงตัวแปรจากหน้าเว็บก่อนหน้าได้ เช่น การส่งค่าผ่านฟอร์ม

 Cookie

  • cookie เป็นการระบุตัวตนของผู้ใช้ เช่นจำว่าผู้ใช้ที่เคยเข้ามาเว็บไซต์นี้ชื่ออะไร
  • cookie เป็นไฟล์ขนาดเล็กที่ฝั่งอยู่บนเครื่องคอมพิวเตอร์ของ client เมื่อเราเข้าเว็บไซต์หรือเรียกหน้าเว็บมาแสดงผล server จะส่ง cookie กลับมาด้วย
  • เมื่อ server ส่ง cookie มายังเครื่องของเราและ browser จะเก็บข้อมูลที่เคยกรอกไว้ เช่น username เมื่อเราเข้าเว็บนั้นอีกครั้งก็จะเรียกมาแสดง
  • แต่ละไฟล์ของ cookie จะใช้หน่วยความจำเก็บข้อมูล 4KB
  • คอมพิวเตอร์หนึ่งเครื่องสามารถเก็บ cookie ได้สูงสุด 20 cookie ต่อหนึ่งโดเมน
  • เราสามารถกำหนดระยะเวลาการทำงานของ cookie ได้
  • Syntax ของ cookie
    • setcookie(name[,value[,expire[,path[,domain[,secure]]]]])
  • เฉพาะข้อมูลประเภท string เท่านั้นที่สามารถจัดเก็บใน cookie file
  • การจัดเก็บข้อมูล Array ใน cookie ให้อยู่ในรูปแบบ String จะใช้ฟังก์ชั่น serialize() ใน PHP
  • เมื่อต้องการแปลงข้อมูลที่เป็น String ให้กลับมาอยู่ในรูปแบบ Array เหมือนเดิมจะใช้ฟังชั้น unserialize()
    • $color = array('red','green','blue');
      $string = serialize( $color ); // จะได้ string
      $color = unserialize( $string ); // จะได้ Array เหมือนเดิม
  • หน่วยความจำของ cookie มีจำกัด
  • cookie ถูกจัดเก็บไว้ในเครื่อง client จึงไม่มีความน่าเชื่อถือมากพอเพราะง่ายต่อการแก้ไขหรือเพิ่มเติมข้อมูลโดยผู้อื่น
  • ผู้ใช้สามารถตั้งเปิดหรือปิดการทำงานของ cookie ได้

 Sessions

  • Sessions เป็นการจัดเก็บข้อมูลของผู้ใช้ไวในฝั่ง server
  • เมื่อ client ร้องขอเว็บไซต์ไปยัง server ที่มีการประกาศ sessions PHP จะมีการสร้าง sessions เพื่อเก็บข้อมูลตัวแปร sessions และกำหนด session ID  ขึ้นมาสำหรับผู้ใช้แต่ละคน session ID อยู่ในรูปแบบ MD5 และไม่มีทางที่จะซ้ำกัน
  • Sessions จะถูกทำลายเมื่อผู้ใช้ปิด browser และเมื่อเปิด broswer ใหม่ก็จะได้รับ sessions ID ใหม่
  • เมื่อ Client ได้รับ Session ID แล้วก็จะสามารถนำไปอ้างอิงค่าของ Session ID เพื่อติดต่อไปยังทุกเว็บเพจซึ่งสามารถเก็บไว้ใน cookie หรือส่งผ่าน url ระหว่างหน้าเว็บของผู้ใช้

 Cookie vs Sessions

  • Cookie
    • cookie มีพื้นที่จำกัดในการจัดเก็บ
    • cookie จัดเก็บบนเครื่อง client ทำให้ไม่มีความปลอดภัย
    • ผู้ใช้สามารถควบคุมการเปิดปิดการทำงานของ cookie ได้
  • Sessions
    • sessions จัดเก็บข้อมูลได้เยอะกว่า
    • ข้อมูลของ sessions จัดเก็บในฝั่ง server ซึ่งมีความปลอดภัยกว่า
    • server ควบคุมการทำงานเอง ผู้ใช้ไม่สามารถกำหนดได้

 Session Propagation

  • sessions ใช้ sessions id ในการส่งผ่านค่าหรือถ่ายทอดระหว่างหน้าเว็บซึ่งสามารถทำได้ 2 ทางคือ
    • ผ่านทาง Cookie (Cookie Propagation)
      • Cookie ถูกจัดเก็บไว้ใน PC ของผู้ใช้ภายในประกอบด้วย sessions id
      • เมื่อใดก็ตามที่อ่านเจอคำสั่ง session_start(); หมายถึง session จะเริ่มทำงาน
      • โดยปกติแล้ว cookie จะหมดอายุปิดผู้ใช้ปิด browser
      • หากต้องการแก้ไขคุณสมบัติของ cookie สามารถทำได้โดยใช้คำสั่ง
        session_set-cookie_params
    • ผ่านทาง URL (URL Propagation)
      • ตัวอย่างของการส่ง session id ผ่าน url
        (…some_folder/index.php?sid=25sdfaw3535q23t)

Destroying a Sessions

  • การทำงาน session จะเกิดขั้นเมื่อเราปิดหน้าต่างของ browser
  • สามารถใช้คำสั่ง session_destroy(); ในการทำลาย session
  • สามารถตั้งเวลาให้ session หมดอสยุได้จากนั้นมันจะทำลายค่าตัวแปรเอง
  • unset(); เป็นฟังชั่นที่มีหน้าที่ในการยกเลิกการกำหนดค่าในตัวแปร ซึ่งต่างกับ session_destroy(); 

Session Expiry

  • โดยปกติ session มีจำมีวิธีการทำลายตัวเอง ถ้าไม่ได้ทำงานอะไรในช่วงเวลาหนึ่งๆ เช่น เรา login E-Banking ทิ้งไว้ แต่ไม่ได้ทำอะไร ผ่านไปสัก15 นาที ระบบจะ log out ให้เองอัตโนมัติ
  • หากส่งค่า session โดย cookie โดยปกติจะตั้งค่าให้ทำลาย session เมื่อผู้ใช้ปิด browser
  • หากส่งค่า session โดย url จะทำให้ session id ถูกทำลายเมื่อออกหน้าเว็บไซต์นั้นๆ

 Long-term Sessions

  • Long-term sessions เป็นการตั้งค่าเตือนผู้ใช้ให้เก็บข้อมูลไว้ เช่น มี alert เตือนจดชำชื่อ และสามารถเรียกข้อมูลนั้นจาก cookie มาแสดงเมื่อมีการเข้าเว็บไซต์นั้นอีกครั้ง 

Session Hi-jacking

  • เป็นปัญหาด้านการรักษาความปลอดภัย เมื่อผู้ไม่ประสงค์ดีเข้าใช้งานระบบผ่าน sessions id ของผู้อื่น เช่น
    • นาย ก เข้าเว็บไซต์ (ที่ตั้งค่าการส่งผ่าน cookie แบบ url )
    • จากนั้นนาย ก ล๊อกอินเข้าระบบและเจอหน้าเว็บไซต์ที่สนใจจึงส่งหน้าเว็บให้นาย ข ผ่านอีเมลล์ โดยส่ง Url ที่ copy ส่งไปมี session id ของนาย ก อยู่ด้วย
    • เมื่อนาย ข เข้าดูเว็บไซต์ที่ส่งมาก่อนที่ session id ของนาย ก จะถูกทำลาย ทำให้นาย ข ล๊อกอินหน้าเว็บนั้นเสมือนเป็นนาย ก
  • การทำ session hi-jacking อาจะเป็นอีกรูปแบบหนึ่งในการโจรกรรมข้อมูล เช่น การปลอมหน้าเว็บไซต์ของธนาคารเมื่อผู้ใช้เข้ามาอาจไม่รู้ว่าเป็นหน้าเว็บปลอมจากนั้นจะกรอกข้อมูลโดยไม่รู้ตัว หรือการขัดขวางการทำงานของเว็บไซต์และส่งลิ้งให้ไปหน้าเว็บอื่น

เรียบเรียงจาก slide วิชา Internet Programing

 

, , , , , , , , , , , ,