Hướng dẫn php check if base64 is image - php kiểm tra xem base64 có phải là hình ảnh không

Tôi đang xây dựng một ứng dụng cho phép người dùng POST HTML5 Dữ liệu Canvas sau đó được mã hóa trong Base64 và hiển thị cho tất cả người dùng. Tôi đang xem xét phân tích dữ liệu vào một tệp .png thực tế và lưu trữ trên máy chủ, nhưng tuyến Base64 cho phép tôi lưu trữ hình ảnh trong cơ sở dữ liệu và giảm thiểu các yêu cầu. Các hình ảnh là duy nhất, rất ít và trang sẽ không được làm mới thường xuyên.

Một chút jQuery sẽ lấy dữ liệu canvas, data:image/png;base64,iVBORw... và chuyển nó theo tập lệnh PHP kết thúc nó như vậy:

function is_base64($str){
    if ( base64_encode(base64_decode($str, true)) === $str){
       return true;
    } else {
       return false;
    }
}
0

Tuy nhiên, bảo mật là nền tảng và cần xác nhận dữ liệu Canvas Base64 để ngăn chặn dữ liệu độc hại trong yêu cầu POST. Mối quan tâm chính của tôi là ngăn chặn các URL bên ngoài được tiêm vào thẻ

function is_base64($str){
    if ( base64_encode(base64_decode($str, true)) === $str){
       return true;
    } else {
       return false;
    }
}
2 và được yêu cầu trên tải trang.

Tôi hiện đang có một thiết lập như thế này:

$data = (isset($_POST['canvas']) && is_string($_POST['canvas'])) ? $_POST['canvas'] : null;
$base = str_replace('data:image/png;base64,', '', $data);
$regx = '~^([A-Za-z0-9+/]{4})*([A-Za-z0-9+/]{4}|[A-Za-z0-9+/]{3}=|[A-Za-z0-9+/]{2}==)$~'

if ((substr($data, 0, 22)) !== 'data:image/png;base64,')
{
  // Obviously fake, doesn't contain the expected first 22 characters.
  return false;
}

if ((base64_encode(base64_decode($base64, true))) !== $base64)
{
  // Decoding and re-encoding the data fails, something is wrong
  return false;
}

if ((preg_match($regx, $base64)) !== 1) 
{
  // The data doesn't match the regular expression, discard
  return false;
}

return true;

Tôi muốn đảm bảo thiết lập hiện tại của tôi đủ an toàn để ngăn các URL bên ngoài được chèn vào thẻ

function is_base64($str){
    if ( base64_encode(base64_decode($str, true)) === $str){
       return true;
    } else {
       return false;
    }
}
2 và nếu không, có thể làm gì để xác thực dữ liệu hình ảnh?

function is_base64($str){
    if ( base64_encode(base64_decode($str, true)) === $str){
       return true;
    } else {
       return false;
    }
}

function is_base64($str){
    if ( base64_encode(base64_decode($str, true)) === $str){
       return true;
    } else {
       return false;
    }
}
4

Đây là tên thật và chức năng thất bại !!!!

@desaikalpesh34 Tôi tin rằng điều này giải quyết vấn đề của bạn và của tôi!

private function isBase64Encoded(string $s) : bool
    {
        if ((bool) preg_match('/^[a-zA-Z0-9\/\r\n+]*={0,2}$/', $s) === false) {
            return false;
        }
        $decoded = base64_decode($s, true);
        if ($decoded === false) {
            return false;
        }
        $encoding = mb_detect_encoding($decoded);
        if (! in_array($encoding, ['UTF-8', 'ASCII'], true)) {
            return false;
        }
        return $decoded !== false && base64_encode($decoded) === $s;
    }

PHP có hai chức năng tích hợp để làm việc với Base64: base64_encode và base64_decode. Dường như điều này là đủ để làm việc với thuật toán này, nhưng thực tế chứng minh rằng nó không phải lúc nào cũng đơn giản. Ví dụ, một số người dùng gặp phải vấn đề khi cố gắng xác thực các giá trị Base64.

Trước hết tôi muốn chỉ cho bạn gần như cách hoàn hảo để kiểm tra xem chuỗi có được mã hóa Base64 không.

Như bạn đã nhận thấy, tôi đã viết về cách gần như hoàn hảo, vì đối với một kiểm tra lý tưởng, bạn có thể xem xét như sau:

  • Để hỗ trợ các giá trị đa dòng, hãy sửa lỗi đầu vào bằng cách sử dụng
    function is_base64($str){
        if ( base64_encode(base64_decode($str, true)) === $str){
           return true;
        } else {
           return false;
        }
    }
    
    5.
  • Vì pad pad char là sử dụng tùy chọn
    function is_base64($str){
        if ( base64_encode(base64_decode($str, true)) === $str){
           return true;
        } else {
           return false;
        }
    }
    
    6 để kiểm tra xem chúng có giống hệt nhau không.
  • Nếu bạn muốn xử lý nhiều tiêu chuẩn của Base64, hãy bình thường hóa đầu vào bằng cách thay thế 62-63 ký tự chỉ mục.

Ngoài ra, nếu bạn đang tự hỏi tại sao các chuỗi như là ABCD, thì IUJHKLSC, hoặc 123412341234, được coi là hợp lệ, ngay cả khi chúng tạo ra một kết quả kỳ lạ, vui lòng cho tôi nhớ rằng Base64 được phát triển để mã hóa và giải mã dữ liệu nhị phân. Vì vậy, không có gì sai. Bạn có thể tự mình xem bằng cách tải xuống các tệp sau và giải mã chúng bằng công cụ tệp Decode Base64 hoặc thậm chí sử dụng các ngôn ngữ hoặc triển khai lập trình khác.

  • 123412341234.bin
  • abcd.bin
  • iujhklsc.bin

Cuối cùng, tôi muốn chỉ ra một số sai lầm phổ biến trong quá trình xác thực Base64:common mistakes made during the Base64 validation:

1) Sai lầm lớn nhất là không kiểm tra Sai Boolean. Ví dụ: đoạn trích bên dưới sẽ không bao giờ hiển thị hợp lệ, ngay cả khi đầu vào

function is_base64($str){
    if ( base64_encode(base64_decode($str, true)) === $str){
       return true;
    } else {
       return false;
    }
}
7 là giá trị base64 hợp lệ cho mã hóa được mã hóa 0 0 (không).

2) Có lẽ bạn nghĩ rằng nó đủ để sử dụng toán tử so sánh giống hệt nhau (

function is_base64($str){
    if ( base64_encode(base64_decode($str, true)) === $str){
       return true;
    } else {
       return false;
    }
}
8). Tuy nhiên, đây không phải là trường hợp. Ví dụ sau đây sẽ luôn luôn xuất ra giá trị hợp lệ, ngay cả khi
function is_base64($str){
    if ( base64_encode(base64_decode($str, true)) === $str){
       return true;
    } else {
       return false;
    }
}
9 là giá trị cơ sở không hợp lệ.

3) Người tiếp theo AHA! Hiệu ứng sẽ là ý tưởng để kích hoạt chế độ

private function isBase64Encoded(string $s) : bool
    {
        if ((bool) preg_match('/^[a-zA-Z0-9\/\r\n+]*={0,2}$/', $s) === false) {
            return false;
        }
        $decoded = base64_decode($s, true);
        if ($decoded === false) {
            return false;
        }
        $encoding = mb_detect_encoding($decoded);
        if (! in_array($encoding, ['UTF-8', 'ASCII'], true)) {
            return false;
        }
        return $decoded !== false && base64_encode($decoded) === $s;
    }
0. Tuy nhiên, tôi không nghĩ rằng đây là những gì bạn cần. Ít nhất là do thực tế là bất kỳ chữ số và chữ cái Latin nào sẽ được coi là giá trị base64 hợp lệ. Ví dụ, những điều sau đây sẽ luôn luôn xuất hiện hợp lệ, mặc dù điều này rõ ràng không phải là trường hợp.

Nhân tiện, như một trò đùa, tôi muốn lưu ý rằng ví dụ cuối cùng gần giống với biểu thức thông thường:

Tất nhiên, tất cả phụ thuộc vào loại đầu vào bạn muốn kiểm tra và kết quả quan trọng như thế nào. Tuy nhiên, nếu bạn nhận được dữ liệu đầu vào từ người dùng không xác định, tôi thực sự khuyên bạn nên kiểm tra lại mọi thứ.

Làm thế nào tôi có thể biết hình ảnh có phải là base64 hay không trong PHP?

Xin chào các bạn, bạn có thể xác thực mã hình ảnh mã hóa cơ sởusing getimagesize() function just use the given below code:

Làm thế nào để tôi biết nếu một hình ảnh là base64?

Không thể phân biệt rõ ràng Chuỗi văn bản và chuỗi mã hóa hình ảnh Base64.Cách duy nhất - kiểm tra xem chuỗi của bạn có hợp lệ chuỗi mã hóa cơ sở 64 hợp lệ không.Nếu nó là - có lẽ đó là một hình ảnh.Nếu không - bạn có thể chắc chắn đó là một văn bản.check if your string is valid Base 64 encoding string. If it is - probably it is an image. If not - you can be sure it is a text.

Làm thế nào tôi có thể biết nếu PHP là base64 được mã hóa?

Làm thế nào để kiểm tra xem một cái gì đó là cơ sở64 được mã hóa mã PHP..
chức năng is_base64_encoded ($ data).
if (preg_match ('%^[a-za-z0-9/+]*= {0,2} $%', $ data)) {.
trả về đúng ;.
} khác {.
trả lại sai ;.

Làm thế nào để bạn kiểm tra xem một chuỗi có phải là base64 hay không?

Trong mã hóa base64, bộ ký tự là [A-Z, A-Z, 0-9 và + /].Nếu độ dài phần còn lại nhỏ hơn 4, chuỗi được đệm với các ký tự '='.^([A-A-Z0-9+/] {4})* có nghĩa là chuỗi bắt đầu với các nhóm 0 hoặc nhiều hơn.^([A-Za-z0-9+/]{4})* means the string starts with 0 or more base64 groups.