แสดงบทความที่มีป้ายกำกับ PHP Security แสดงบทความทั้งหมด
แสดงบทความที่มีป้ายกำกับ PHP Security แสดงบทความทั้งหมด

วันอาทิตย์ที่ 16 มีนาคม พ.ศ. 2568

[PHP] วิธีใช้ Session และ Cookie อย่างถูกต้อง

ถ้าเราพูดถึงการเก็บข้อมูลผู้ใช้บนเว็บ Session และ Cookie เป็นสองวิธีหลักที่ใช้กันบ่อยมาก แต่หลายคนอาจสงสัยว่า มันต่างกันยังไง? แล้ว ควรใช้ตอนไหน?

บทความนี้จะพาไปทำความเข้าใจ Session กับ Cookie แบบละเอียดสุด ๆ พร้อมตัวอย่างการใช้งาน ที่ถูกต้องและปลอดภัย

1. Session และ Cookie คืออะไร?

คุณสมบัติ Session Cookie
เก็บข้อมูลไว้ที่ไหน? ฝั่งเซิร์ฟเวอร์ ฝั่งเบราว์เซอร์ (Client-side)
อายุของข้อมูล หมดอายุเมื่อปิดเบราว์เซอร์ (ถ้าไม่กำหนดเวลา) กำหนดเวลาหมดอายุได้
ข้อมูลปลอดภัยแค่ไหน? ปลอดภัยกว่าเพราะไม่อยู่ในเครื่องผู้ใช้ มีโอกาสถูกแก้ไขได้
ใช้สำหรับอะไร? เก็บข้อมูลที่ต้องการให้ปลอดภัย เช่น การล็อกอิน เก็บค่าต่าง ๆ เพื่อให้ผู้ใช้สะดวกขึ้น เช่น จำการตั้งค่าของเว็บ
ส่งข้อมูลไปกับ HTTP Request ไหม? ไม่ ใช่ (Cookie จะถูกส่งไปกับทุก Request)


2. วิธีใช้ Session อย่างถูกต้อง

📌 เริ่มใช้งาน Session

ก่อนจะใช้งาน Session เราต้องเรียก session_start(); เสมอ

session_start(); // ต้องใส่เป็นบรรทัดแรกของไฟล์ PHP

📌 วิธีสร้างตัวแปรใน Session


$_SESSION['username'] = 'john_doe';
$_SESSION['role'] = 'admin';

📌 ดึงค่าจาก Session

session_start();
echo $_SESSION['username']; // john_doe

📌 วิธีลบค่า Session

ถ้าต้องการลบตัวแปร Session บางตัว

unset($_SESSION['username']); // ลบตัวแปร username

ถ้าต้องการลบทุกอย่าง (เช่น ตอน Logout)

session_destroy(); // ลบ Session ทั้งหมด

🔥 ข้อควรระวังในการใช้ Session

  •     ต้องเรียก session_start(); ก่อนเสมอ
  •     อย่าเก็บข้อมูลที่สำคัญเกินไป เช่น รหัสผ่าน ควรเก็บแค่ ID แล้วไปดึงข้อมูลจาก Database
  •     อย่าลืมลบ Session ที่ไม่จำเป็นเมื่อผู้ใช้ Logout


3. วิธีใช้ Cookie อย่างถูกต้อง

📌 การสร้าง Cookie

setcookie("user", "john_doe", time() + 3600, "/"); // หมดอายุใน 1 ชั่วโมง

📢 time() + 3600 หมายถึง 1 ชั่วโมง (60 วินาที x 60 นาที)

📌 การอ่านค่า Cookie

if(isset($_COOKIE['user'])) {
    echo "Welcome " . $_COOKIE['user'];
}

📌 การลบ Cookie

setcookie("user", "", time() - 3600, "/"); // ตั้งเวลาให้เป็นอดีต

🔥 ข้อควรระวังในการใช้ Cookie

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


4. ควรใช้ Session หรือ Cookie ตอนไหน?

สถานการณ์ ควรใช้
ระบบล็อกอิน Session (ปลอดภัยกว่า)
จดจำการตั้งค่าของผู้ใช้ เช่น โหมดมืด Cookie
ติดตามการใช้งานเว็บ (Analytics) Cookie
เก็บข้อมูลชั่วคราวของผู้ใช้ในระหว่าง Session Session


5. เทคนิคเพิ่มความปลอดภัย

🔒 ป้องกัน Session Hijacking

session_regenerate_id(true); // เปลี่ยน Session ID ใหม่ ป้องกันการขโมย

🔒 ตั้งค่า Cookie ให้ปลอดภัย

setcookie("user", "john_doe", time() + 3600, "/", "", true, true);

✅ true, true หมายถึงเปิดใช้งาน Secure (HTTPS เท่านั้น) และ HttpOnly (กัน XSS)

6. สรุป

  •     Session เหมาะสำหรับเก็บข้อมูลชั่วคราวที่ต้องปลอดภัย เช่น การล็อกอิน
  •     Cookie เหมาะสำหรับจดจำข้อมูลระยะยาว เช่น การตั้งค่าเว็บ
  •     ต้อง เข้ารหัสข้อมูล และใช้ HttpOnly / Secure กับ Cookie เพื่อความปลอดภัย
  •     อย่าลืมล้าง Session และ Cookie ที่ไม่จำเป็นเพื่อป้องกันปัญหาความปลอดภัย

วันพฤหัสบดีที่ 13 มีนาคม พ.ศ. 2568

[PHP] วิธีใช้ filter_var() กรองข้อมูล Input อย่างปลอดภัย

ในการเขียนโปรแกรม PHP หนึ่งในเรื่องสำคัญที่เราต้องคำนึงถึงเสมอก็คือ ความปลอดภัยของข้อมูลที่รับเข้ามา (Input Validation) เพราะหากเราปล่อยให้ผู้ใช้ส่งข้อมูลเข้ามาโดยไม่มีการกรอง (Filtering) หรือการตรวจสอบความถูกต้อง (Validation) ก็อาจเปิดช่องให้เกิดช่องโหว่ทางด้านความปลอดภัย เช่น SQL Injection, XSS (Cross-Site Scripting), หรือข้อมูลที่ผิดพลาด ได้

โชคดีที่ PHP มีฟังก์ชันที่ช่วยให้เราสามารถกรองข้อมูล Input ได้ง่าย ๆ และมีประสิทธิภาพ นั่นก็คือ filter_var() วันนี้เราจะมาดูกันว่า filter_var() คืออะไร และใช้งานอย่างไรให้ปลอดภัย!

1. filter_var() คืออะไร?

filter_var() เป็นฟังก์ชันที่ใช้ในการกรองและตรวจสอบข้อมูล Input โดยเราสามารถใช้มันร่วมกับ Filter ที่มีอยู่แล้วใน PHP เพื่อทำให้แน่ใจว่าข้อมูลที่รับมานั้นอยู่ในรูปแบบที่ถูกต้อง

รูปแบบการใช้งาน

filter_var(ค่า, ตัวกรอง [, ตัวเลือกเสริม])

  • ค่า (Value): ข้อมูลที่ต้องการตรวจสอบหรือกรอง
  • ตัวกรอง (Filter): ประเภทของการกรองที่ต้องการใช้ เช่น กรองเป็นอีเมล, URL, ตัวเลข ฯลฯ
  • ตัวเลือกเสริม (Options) [ไม่จำเป็น]: ใช้กำหนดเงื่อนไขเพิ่มเติมในการกรอง


2. ตัวกรองที่ใช้งานบ่อย

PHP มีตัวกรองที่ใช้กับ filter_var() อยู่หลายประเภท ซึ่งตัวที่นิยมใช้ ได้แก่:

2.1 กรองข้อมูลประเภทตัวเลข

ตรวจสอบว่าเป็นตัวเลขหรือไม่ (FILTER_VALIDATE_INT)

$number = "123";
if (filter_var($number, FILTER_VALIDATE_INT) !== false) {
    echo "เป็นตัวเลขที่ถูกต้อง";
} else {
    echo "ไม่ใช่ตัวเลข";
}

ตรวจสอบว่าเป็นตัวเลขทศนิยมหรือไม่ (FILTER_VALIDATE_FLOAT)

$float = "12.34";
if (filter_var($float, FILTER_VALIDATE_FLOAT) !== false) {
    echo "เป็นตัวเลขทศนิยมที่ถูกต้อง";
} else {
    echo "ไม่ใช่ตัวเลขทศนิยม";
}

2.2 กรองข้อมูลประเภทสตริง (String)

ลบอักขระที่ไม่จำเป็นออกจากข้อความ (FILTER_SANITIZE_STRING)

$input = "<h1>Hello, World!</h1>";
$clean = filter_var($input, FILTER_SANITIZE_STRING);
echo $clean; // Output: Hello, World!

หมายเหตุ: ตั้งแต่ PHP 8.1 FILTER_SANITIZE_STRING ถูกถอดออกไปแล้ว แนะนำให้ใช้ strip_tags() แทน

2.3 ตรวจสอบและกรองอีเมล

ตรวจสอบว่าเป็นอีเมลที่ถูกต้อง (FILTER_VALIDATE_EMAIL)

$email = "example@gmail.com";
if (filter_var($email, FILTER_VALIDATE_EMAIL)) {
    echo "อีเมลถูกต้อง";
} else {
    echo "อีเมลไม่ถูกต้อง";
}

กรองอีเมลให้สะอาด (FILTER_SANITIZE_EMAIL)

$dirty_email = "ex@am!ple@@gmail.com";
$clean_email = filter_var($dirty_email, FILTER_SANITIZE_EMAIL);
echo $clean_email; // Output: example@gmail.com

2.4 ตรวจสอบและกรอง URL

ตรวจสอบว่าเป็น URL ที่ถูกต้อง (FILTER_VALIDATE_URL)

$url = "https://www.example.com";
if (filter_var($url, FILTER_VALIDATE_URL)) {
    echo "URL ถูกต้อง";
} else {
    echo "URL ไม่ถูกต้อง";
}

กรอง URL ให้สะอาด (FILTER_SANITIZE_URL)

$dirty_url = "https://www.ex@ampl!!e.com";
$clean_url = filter_var($dirty_url, FILTER_SANITIZE_URL);
echo $clean_url; // Output: https://www.example.com

2.5 ตรวจสอบและกรอง IP Address

ตรวจสอบว่าเป็น IPv4 หรือ IPv6 (FILTER_VALIDATE_IP)

$ip = "192.168.1.1";
if (filter_var($ip, FILTER_VALIDATE_IP)) {
    echo "IP Address ถูกต้อง";
} else {
    echo "IP Address ไม่ถูกต้อง";
}

3. ใช้ filter_var() ร่วมกับตัวเลือกเพิ่มเติม (Options)

บางกรณีเราต้องการกำหนดเงื่อนไขเพิ่มเติมให้กับ filter_var() เช่น กำหนดช่วงค่าของตัวเลข เป็นต้น

ตัวอย่างการกำหนดช่วงค่าด้วย FILTER_VALIDATE_INT

$options = array("options" => array("min_range" => 1, "max_range" => 100));
$number = 50;
if (filter_var($number, FILTER_VALIDATE_INT, $options)) {
    echo "ตัวเลขอยู่ในช่วงที่กำหนด";
} else {
    echo "ตัวเลขอยู่นอกช่วงที่กำหนด";
}

4. ใช้ filter_var() ในการกรองข้อมูล Form Input

$name = filter_var($_POST['name'], FILTER_SANITIZE_STRING);
$email = filter_var($_POST['email'], FILTER_VALIDATE_EMAIL);
$age = filter_var($_POST['age'], FILTER_VALIDATE_INT, array("options" => array("min_range" => 1)));

if ($name && $email && $age) {
    echo "ข้อมูลถูกต้อง!";
} else {
    echo "กรุณากรอกข้อมูลให้ถูกต้อง";
}

สรุป

  • filter_var() เป็นฟังก์ชันที่ใช้ในการกรองและตรวจสอบข้อมูล Input ได้ง่ายและปลอดภัย
  • มีตัวกรอง (Filter) ให้ใช้มากมาย เช่น ตรวจสอบอีเมล, URL, หมายเลข IP, ตัวเลข ฯลฯ
  • ใช้ FILTER_SANITIZE_ เพื่อล้างข้อมูลให้สะอาดก่อนนำไปใช้
  • ใช้ FILTER_VALIDATE_ เพื่อตรวจสอบว่าข้อมูลอยู่ในรูปแบบที่ถูกต้องหรือไม่
  • สามารถใช้ร่วมกับ Options เพื่อกำหนดเงื่อนไขเพิ่มเติม

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