ผู้เขียน 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 ที่เข้ารหัสมาถูกต้อง.