ตรวจสอบสตริง base64

ผู้เขียน PHP ที่ใช้งานคำสั่งแปลงข้อมูลสตริงประเภท base64 กลับไปเป็นต้นฉบับนั้น มักจะพบว่าบ่อยครั้งมันจะมีปัญหาคือตัวฟังก์ชั่น base64_decode() ไม่สามารถตรวจสอบสตริงได้และทำให้แปลงข้อมูลหรือถอดข้อมูลออกมาในสภาพที่ไม่ถูกต้อง. ตัวอย่างเช่น base64_decode('5555', true); จะยังสามารถ decode ได้อยู่ทั้งที่เลข 5555 นี้ไม่ใช่สตริงเข้ารหัส base64 ที่ถูกต้องเลย และมันจะทำให้มีปัญหาอื่นๆตามมาอีกมากในภายหลัง.

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

โค้ดตรวจสอบ

ใช้ htmlspecialchars

function isValidBase64($string): bool
{
    if (!is_string($string)) {
        return false;
    }

    if ($string === '') {
        return true;
    }

    $decoded = base64_decode($string, true);

    if (false === $decoded) {
        return false;
    }
    $result = htmlspecialchars($decoded);
    unset($decoded);
    return $result !== '';
}// isValidBase64

ผลลัพธ์ที่ฟังก์ชั่น htmlspecialchars() ส่งกลับคืนมานั้น ถ้าหากไม่ถูกต้องจะเป็นสตริงที่ว่างเปล่า จึงเอาเงื่อนไขนี้มาใช้ตรวจสอบ.

ใช้ json_encode

function isValidBase64($string): bool
{
    if (!is_string($string)) {
        return false;
    }

    $decoded = base64_decode($string, true);

    if (false === $decoded) {
        return false;
    }
    
    if (false === json_encode($decoded)) {
        return false;
    }
    unset($decoded);

    return true;
}// isValidBase64

เนื่องจากพบว่าคำสั่ง json_encode() นั้นจะคืนค่าเป็น false เสมอถ้าหากมีอักขระใดๆที่ไม่ถูกต้องสมบูรณ์ และสตริงที่ไม่ใช่ base64 ที่แท้จริง มักจะมีปัญหาเมื่อ decode แล้วจะได้อักขระที่ไม่สมบูรณ์ปะปนมาอยู่ด้วย จึงใช้เงื่อนไขนี้ในการตรวจสอบ.

ใช้ mb_convert_encoding

function isValidBase64($string): bool
{
    if (!is_string($string)) {
        return false;
    }

    $decoded = base64_decode($string, true);

    if (false === $decoded) {
        return false;
    }

    if (mb_convert_encoding($decoded, 'UTF-8', 'UTF-8') !== $decoded) {
        return false;
    }

    return true;
}// isValidBase64

คำสั่ง mb_convert_encoding($string, 'UTF-8', 'UTF-8'); นั้นก็ไม่ต่างจากการสางเอาอักขระที่เป็น unicode ที่ไม่สมบูรณ์ออกไป. การ decode สตริงที่ไม่ใช่ base64 ที่ถูกต้องจะได้อักขระเหล่านี้ปะปนมาด้วย เมื่อผ่านการล้างอักขระที่ไม่สมบูรณ์ออกแล้ว ถ้าค่ายังคงเดิมก็สามารถคาดได้ว่านี่คือสตริงที่เป็น base64 ที่เข้ารหัสมาถูกต้อง.

ใส่ความเห็น

อีเมลของคุณจะไม่แสดงให้คนอื่นเห็น ช่องข้อมูลจำเป็นถูกทำเครื่องหมาย *

คุณอาจใช้แท็กHTMLและแอททริบิวต์เหล่านี้: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>