Skip to main content

เนื้อหาภาษาไทย / Thai content

System guide Content reviewed

Security Best Practices: Input Validation

บทความนี้เน้นย้ำถึงความสำคัญของการตรวจสอบข้อมูลนำเข้า (Input Validation) ในการพัฒนาเว็บแอปพลิเคชัน เพื่อป้องกันช่องโหว่ด้านความปลอดภัยต่างๆ เช่น SQL Injection แ...

Security Best Practices: Input Validation

ในโลกของการพัฒนาเว็บแอปพลิเคชัน การรักษาความปลอดภัยเป็นสิ่งสำคัญอย่างยิ่งยวด และหนึ่งในขั้นตอนพื้นฐานแต่สำคัญที่สุดในการรักษาความปลอดภัยคือ Input Validation หรือการตรวจสอบความถูกต้องของข้อมูลนำเข้า

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

Input Validation ไม่ได้หมายถึงแค่การตรวจสอบว่าข้อมูลนั้นมีอยู่จริงหรือไม่ แต่ยังรวมถึงการตรวจสอบว่าข้อมูลนั้นอยู่ในรูปแบบที่ถูกต้อง และเป็นไปตามที่เราคาดหวังหรือไม่

ทำไมต้อง Input Validation?

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

Input Validation ช่วยป้องกันสถานการณ์เช่นนี้ได้ โดยการตรวจสอบว่าข้อมูลที่ผู้ใช้ป้อนเข้ามานั้นปลอดภัย และเป็นไปตามข้อกำหนดที่เรากำหนดไว้

Trade-off: การทำ Input Validation ที่เข้มงวดเกินไปอาจทำให้ผู้ใช้รู้สึกหงุดหงิดได้ หากระบบปฏิเสธข้อมูลที่ถูกต้อง แต่ไม่เป็นไปตามรูปแบบที่กำหนดไว้ ดังนั้นจึงต้องหาสมดุลระหว่างความปลอดภัยและความสะดวกสบายของผู้ใช้

หลักการพื้นฐานของ Input Validation

Input Validation สามารถแบ่งออกเป็น 3 ขั้นตอนหลักๆ ได้แก่:

  • Sanitization: การทำความสะอาดข้อมูล โดยการลบหรือแปลงอักขระที่ไม่ปลอดภัย หรือไม่จำเป็นออกไป
  • Validation: การตรวจสอบว่าข้อมูลนั้นถูกต้องตามรูปแบบที่เราคาดหวังหรือไม่
  • Escaping: การแปลงอักขระพิเศษให้เป็นรูปแบบที่ปลอดภัย ก่อนที่จะนำไปใช้ในบริบทต่างๆ เช่น HTML หรือ SQL

เราจะมาดูแต่ละขั้นตอนอย่างละเอียด พร้อมตัวอย่างโค้ด PHP:

Sanitization

Sanitization คือการ "ทำความสะอาด" ข้อมูลนำเข้า โดยการลบ หรือแปลงอักขระที่ไม่พึงประสงค์ออกไป เพื่อให้ข้อมูลนั้นปลอดภัยมากขึ้น ตัวอย่างเช่น:

<?php

$input = "<script>alert('XSS');</script>This is some text.";

// Remove HTML tags
$sanitized_input = strip_tags($input);

echo "Original Input: " . htmlspecialchars($input) . "<br>"; // ใช้ htmlspecialchars เพื่อแสดง HTML tags อย่างปลอดภัย
echo "Sanitized Input: " . htmlspecialchars($sanitized_input) . "<br>";

?>

ในตัวอย่างนี้ ฟังก์ชัน `strip_tags()` จะทำการลบ HTML tags ทั้งหมดออกจากข้อมูลนำเข้า ทำให้โค้ด JavaScript ที่เป็นอันตรายถูกกำจัดออกไป

คำเตือน: การใช้ `strip_tags()` เพียงอย่างเดียวอาจไม่เพียงพอที่จะป้องกัน XSS ได้ทั้งหมด ควรใช้ร่วมกับ Escaping (จะกล่าวถึงในภายหลัง)

Validation

Validation คือการตรวจสอบว่าข้อมูลนั้นถูกต้องตามรูปแบบที่เราต้องการ ตัวอย่างเช่น:

<?php

$email = "test@example.com";
$age = "30";

// Validate email address
if (filter_var($email, FILTER_VALIDATE_EMAIL)) {
    echo "$email is a valid email address.<br>";
} else {
    echo "$email is not a valid email address.<br>";
}

// Validate age (must be a number between 18 and 65)
if (filter_var($age, FILTER_VALIDATE_INT, array("options" => array("min_range"=>18, "max_range"=>65)))) {
    echo "$age is a valid age.<br>";
} else {
    echo "$age is not a valid age.<br>";
}

?>

ในตัวอย่างนี้ ฟังก์ชัน `filter_var()` ถูกใช้เพื่อตรวจสอบว่า `$email` เป็นอีเมลที่ถูกต้อง และ `$age` เป็นตัวเลขที่อยู่ในช่วง 18 ถึง 65

PHP มี Filter Functions มากมายที่สามารถใช้ในการ Validate ข้อมูลได้หลายประเภท เช่น อีเมล, URL, IP Address, ตัวเลข และอื่นๆ

Escaping

Escaping คือการแปลงอักขระพิเศษให้เป็นรูปแบบที่ปลอดภัย ก่อนที่จะนำไปใช้ในบริบทต่างๆ เช่น HTML หรือ SQL ตัวอย่างเช่น:

<?php

$name = "O'Reilly";
$comment = "<script>alert('XSS');</script>";

// Escape for HTML
$escaped_name = htmlspecialchars($name, ENT_QUOTES, 'UTF-8');
$escaped_comment = htmlspecialchars($comment, ENT_QUOTES, 'UTF-8');

echo "Name: " . $escaped_name . "<br>";
echo "Comment: " . $escaped_comment . "<br>";

// Escape for SQL (assuming MySQLi)
$mysqli = new mysqli("localhost", "user", "password", "database"); // แทนค่าด้วยข้อมูลจริง
$escaped_name_sql = $mysqli->real_escape_string($name);

$sql = "INSERT INTO users (name) VALUES ('" . $escaped_name_sql . "')";
//echo $sql; // เอาไว้ดู SQL ที่สร้างขึ้น

// IMPORTANT: Always use prepared statements instead of escaping for SQL.  This is just for demonstration purposes.

$mysqli->close();

?>

ในตัวอย่างนี้ ฟังก์ชัน `htmlspecialchars()` ถูกใช้เพื่อแปลงอักขระพิเศษใน `$name` และ `$comment` ให้เป็น HTML Entities เช่น `<` แทน `<` และ `>` แทน `>` ซึ่งจะป้องกันไม่ให้โค้ด JavaScript ถูกรันในเบราว์เซอร์

สำหรับ SQL นั้น ฟังก์ชัน `mysqli_real_escape_string()` ถูกใช้เพื่อแปลงอักขระพิเศษให้เป็นรูปแบบที่ปลอดภัยสำหรับ SQL Query ซึ่งจะช่วยป้องกัน SQL Injection

ข้อควรจำ: การ Escaping ควรทำในขั้นตอนสุดท้าย ก่อนที่จะนำข้อมูลไปใช้ในบริบทต่างๆ และควรใช้ฟังก์ชัน Escaping ที่เหมาะสมกับบริบทนั้นๆ

คำแนะนำ: สำหรับการป้องกัน SQL Injection ที่ดีที่สุดคือการใช้ Prepared Statements แทนการ Escaping ข้อมูลด้วยตนเอง Prepared Statements จะช่วยให้ฐานข้อมูลสามารถแยกแยะระหว่างโค้ดและข้อมูลได้อย่างชัดเจน ทำให้ SQL Injection เป็นไปได้ยากขึ้นมาก

สรุป

Input Validation เป็นขั้นตอนสำคัญในการรักษาความปลอดภัยของเว็บแอปพลิเคชัน การ Sanitization, Validation และ Escaping เป็นเครื่องมือที่มีประสิทธิภาพในการป้องกันช่องโหว่ต่างๆ ที่อาจเกิดขึ้นจากการจัดการข้อมูลนำเข้าที่ไม่ถูกต้อง

ในบทความถัดไป เราจะพูดถึง Security Best Practices อื่นๆ ที่สำคัญ เช่น การป้องกัน SQL Injection และ Cross-Site Scripting (XSS) อย่างละเอียด

Office.in.th Custom Service

Want to build or adapt a system from this structure?

Office.in.th designs and develops enterprise web applications, API integrations, and public- and private-sector management systems, with long-term support.

See our software development service