Làm cách nào để biết hình ảnh có phải là base64 hay không trong PHP?
Show
Hàm base64_encode() là một hàm có sẵn trong PHP được sử dụng để chuyển đổi bất kỳ dữ liệu nào sang mã hóa base64. Để chuyển đổi hình ảnh thành mã hóa base64, trước tiên cần lấy nội dung của tệp. Điều này có thể được thực hiện với sự trợ giúp của hàm file_get_contents() của PHP. Sau đó chuyển dữ liệu thô này sang hàm base64_encode() để mã hóa Chức năng bắt buộc
Hình ảnh đầu vào Chương trình
bytes = (string_length(encoded_string) − 814) / 1.370 bytes = (string_length(encoded_string) − 814) / 1.371 bytes = (string_length(encoded_string) − 814) / 1.372
đầu ra iVBORw0KGgoAAAANSUhEUgAAApsAAAC4CAYAAACsNSfVAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJ Thẩm quyền giải quyết
PHP là ngôn ngữ kịch bản phía máy chủ được thiết kế dành riêng cho phát triển web. Bạn có thể học PHP từ đầu bằng cách làm theo Hướng dẫn PHP và Ví dụ về PHP này Trong lập trình máy tính, Base64 là một nhóm lược đồ mã hóa nhị phân thành văn bản biểu thị dữ liệu nhị phân (cụ thể hơn là chuỗi byte 8 bit) theo chuỗi 24 bit có thể được biểu thị bằng bốn chữ số Base64 6 bit Phổ biến đối với tất cả các lược đồ mã hóa nhị phân thành văn bản, Base64 được thiết kế để mang dữ liệu được lưu trữ ở định dạng nhị phân trên các kênh chỉ hỗ trợ nội dung văn bản một cách đáng tin cậy. Base64 đặc biệt phổ biến trên World Wide Web[1] trong đó một trong những ứng dụng của nó là khả năng nhúng các tệp hình ảnh hoặc nội dung nhị phân khác bên trong nội dung văn bản như tệp HTML và CSS. [2] Base64 cũng được sử dụng rộng rãi để gửi tệp đính kèm e-mail. Điều này là bắt buộc vì SMTP – ở dạng ban đầu – được thiết kế để chỉ vận chuyển các ký tự ASCII 7 bit. Mã hóa này gây ra tổng chi phí là 33–37% (33% do chính mã hóa; thêm tối đa 4% do ngắt dòng được chèn) Mỗi chữ số Base64 có thể nhận 64 giá trị khác nhau, mã hóa 6 bit dữ liệu. Những ký tự nào được chọn để biểu thị 64 giá trị khác nhau giữa các lần triển khai. Chiến lược chung là chọn 64 ký tự phổ biến cho hầu hết các bảng mã và cũng có thể in được. Sự kết hợp này khiến dữ liệu khó có thể bị sửa đổi khi truyền qua các hệ thống thông tin, chẳng hạn như email, theo truyền thống không phải là 8-bit sạch. [3] Ví dụ: triển khai Base64 của MIME sử dụng Các phiên bản sớm nhất của loại mã hóa này được tạo ra để liên lạc quay số giữa các hệ thống chạy cùng một hệ điều hành, ví dụ: uuencode cho UNIX và BinHex cho TRS-80 (sau này được điều chỉnh cho Macintosh), và do đó có thể đưa ra nhiều giả định hơn về . Chẳng hạn, uuencode sử dụng chữ in hoa, chữ số và nhiều ký tự dấu chấm câu, nhưng không sử dụng chữ thường. [4][5][6][3] Bảng Base64 từ RFC 4648[sửa mã nguồn]Đây là bảng chữ cái Base64 được xác định trong RFC 4648 §4. Xem thêm Tóm tắt biến thể (bên dưới) Base64 for URL parameters/filenames, that adhere to RFC 4648. 716010000function base64url_encode($data, $pad = null) { 432100000function base64url_encode($data, $pad = null) { 548110000Base64 for URL parameters/filenames, that adhere to RFC 4648. 701000001Base64 for URL parameters/filenames, that adhere to RFC 4648. 7117010001Base64 for URL parameters/filenames, that adhere to RFC 4648. 7233100001Base64 for URL parameters/filenames, that adhere to RFC 4648. 7349110001Base64 for URL parameters/filenames, that adhere to RFC 4648. 742000010Base64 for URL parameters/filenames, that adhere to RFC 4648. 7518010010Base64 for URL parameters/filenames, that adhere to RFC 4648. 7634100010Base64 for URL parameters/filenames, that adhere to RFC 4648. 7750110010Base64 for URL parameters/filenames, that adhere to RFC 4648. 783000011Base64 for URL parameters/filenames, that adhere to RFC 4648. 7919010011Base64 for URL parameters/filenames, that adhere to RFC 4648. 8035100011Base64 for URL parameters/filenames, that adhere to RFC 4648. 8151110011function base64url_encode($data, $pad = null) { 04000100Base64 for URL parameters/filenames, that adhere to RFC 4648. 8320010100Base64 for URL parameters/filenames, that adhere to RFC 4648. 8436100100Base64 for URL parameters/filenames, that adhere to RFC 4648. 8552110100function base64url_encode($data, $pad = null) { 15000101Base64 for URL parameters/filenames, that adhere to RFC 4648. 8721010101Base64 for URL parameters/filenames, that adhere to RFC 4648. 8837100101Base64 for URL parameters/filenames, that adhere to RFC 4648. 8953110101Base64 for URL parameters/filenames, that adhere to RFC 4648. 906000110Base64 for URL parameters/filenames, that adhere to RFC 4648. 9122010110Base64 for URL parameters/filenames, that adhere to RFC 4648. 9238100110Base64 for URL parameters/filenames, that adhere to RFC 4648. 9354110110Base64 for URL parameters/filenames, that adhere to RFC 4648. 947000111Base64 for URL parameters/filenames, that adhere to RFC 4648. 9523010111Base64 for URL parameters/filenames, that adhere to RFC 4648. 9639100111Base64 for URL parameters/filenames, that adhere to RFC 4648. 9755110111Base64 for URL parameters/filenames, that adhere to RFC 4648. 988001000Base64 for URL parameters/filenames, that adhere to RFC 4648. 9924011000function base64url_encode($data, $pad = null) { 0040101000function base64url_encode($data, $pad = null) { 0156111000function base64url_encode($data, $pad = null) { 029001001function base64url_encode($data, $pad = null) { 0325011001Base64 for URL parameters/filenames, that adhere to RFC 4648. 841101001function base64url_encode($data, $pad = null) { 0557111001function base64url_encode($data, $pad = null) { 0610001010function base64url_encode($data, $pad = null) { 0726011010Base64 for URL parameters/filenames, that adhere to RFC 4648. 942101010function base64url_encode($data, $pad = null) { 0958111010function base64url_encode($data, $pad = null) { 1011001011function base64url_encode($data, $pad = null) { 1127011011function base64url_encode($data, $pad = null) { 1243101011function base64url_encode($data, $pad = null) { 1359111011function base64url_encode($data, $pad = null) { 1412001100function base64url_encode($data, $pad = null) { 1528011100function base64url_encode($data, $pad = null) { 1644101100function base64url_encode($data, $pad = null) { 1760111100function base64url_encode($data, $pad = null) { 1813001101function base64url_encode($data, $pad = null) { 1929011101function base64url_encode($data, $pad = null) { 2045101101function base64url_encode($data, $pad = null) { 2161111101function base64url_encode($data, $pad = null) { 214001110function base64url_encode($data, $pad = null) { 2330011110function base64url_encode($data, $pad = null) { 2446101110function base64url_encode($data, $pad = null) { 2562111110function base64url_encode($data, $pad = null) { 2615001111function base64url_encode($data, $pad = null) { 2731011111function base64url_encode($data, $pad = null) { 2847101111function base64url_encode($data, $pad = null) { 2963111111Base64 for URL parameters/filenames, that adhere to RFC 4648. 70Padding=Các ví dụ[sửa]Ví dụ bên dưới sử dụng văn bản ASCII để đơn giản, nhưng đây không phải là trường hợp sử dụng thông thường, vì nó đã có thể được chuyển an toàn trên tất cả các hệ thống có thể xử lý Base64. Cách sử dụng điển hình hơn là mã hóa dữ liệu nhị phân (chẳng hạn như hình ảnh); Đây là một thành ngữ nổi tiếng từ điện toán phân tán
Khi trích dẫn (không có khoảng trắng ở cuối) được mã hóa thành Base64, nó được biểu diễn dưới dạng chuỗi byte gồm các ký tự ASCII 8 bit được đệm được mã hóa trong lược đồ Base64 của MIME như sau (dòng mới và khoảng trắng có thể xuất hiện ở bất kỳ đâu nhưng được bỏ qua trên
Trong trích dẫn trên, giá trị được mã hóa của Man là TWFu. Được mã hóa bằng ASCII, các ký tự M, a và n được lưu trữ dưới dạng các giá trị byte Như ví dụ này minh họa, mã hóa Base64 chuyển đổi ba octet thành bốn ký tự được mã hóa SourceText (ASCII)ManOctets77 (0x4d)97 (0x61)110 (0x6e)Bits010011010110000101101110Base64đã mã hóaSextets1922546Nhân vậtTWWuOctets84 (0x54)87 (0x57)70 (0x46)117 (0x75)
Chuyển đổi thập lục phân sang bát phân rất hữu ích để chuyển đổi giữa nhị phân và Base64. Chuyển đổi như vậy có sẵn cho cả máy tính tiên tiến và ngôn ngữ lập trình. Ví dụ: biểu diễn thập lục phân của 24 bit ở trên là 4D616E. Biểu diễn bát phân là 23260556. 8 chữ số bát phân đó có thể được chia thành các cặp (23 26 05 56) và mỗi cặp có thể được chuyển đổi thành số thập phân để mang lại 19 22 05 46. Sử dụng bốn số thập phân đó làm chỉ số cho bảng chữ cái Base64, các ký tự ASCII tương ứng là TWFu Nếu chỉ có hai octet đầu vào quan trọng (e. g. , 'Ma'), hoặc khi nhóm đầu vào cuối cùng chỉ chứa hai octet, tất cả 16 bit sẽ được ghi lại trong ba chữ số Base64 đầu tiên (18 bit); SourceText (ASCII)MaOctets77 (0x4d)97 (0x61)Bits010011010110000100Base64encodedSextets19224Padding CharacterTWE=Octets84 (0x54)87 (0x57)69 (0x45)61 (0x3D) Nếu chỉ có một octet đầu vào quan trọng (e. g. , 'M'), hoặc khi nhóm đầu vào cuối cùng chỉ chứa một octet, tất cả 8 bit sẽ được ghi lại trong hai chữ số Base64 đầu tiên (12 bit); SourceText (ASCII)MOctets77 (0x4d)Bits010011010000Base64encodedSextets1916PaddingPadding CharacterTQ==Octets84 (0x54)81 (0x51)61 (0x3D)61 (0x3D) Phần đệm đầu ra [ chỉnh sửa ]Bởi vì Base64 là mã hóa sáu bit và vì các giá trị được giải mã được chia thành các bộ tám bit 8 bit, nên cứ bốn ký tự của văn bản được mã hóa Base64 (4 sextet = 4 × 6 = 24 bit) đại diện cho ba bộ tám dữ liệu hoặc văn bản không được mã hóa ( . Điều này có nghĩa là khi độ dài của đầu vào chưa được mã hóa không phải là bội số của ba, thì đầu ra được mã hóa phải được thêm phần đệm để độ dài của nó là bội số của bốn. Ký tự đệm là Ký tự đệm không cần thiết để giải mã, vì số lượng byte bị thiếu có thể được suy ra từ độ dài của văn bản được mã hóa. Trong một số triển khai, ký tự đệm là bắt buộc, trong khi đối với những triển khai khác, ký tự này không được sử dụng. Một ngoại lệ trong đó các ký tự đệm được yêu cầu là khi nhiều tệp được mã hóa Base64 được ghép nối Giải mã Base64 với phần đệm[sửa]Khi giải mã văn bản Base64, bốn ký tự thường được chuyển đổi lại thành ba byte. Các ngoại lệ duy nhất là khi các ký tự đệm tồn tại. Một function base64url_encode($data, $pad = null) { 441light wbGlnaHQgd28=Base64 for URL parameters/filenames, that adhere to RFC 4648. 782light wobGlnaHQgd29yNone3light worMột cách khác để diễn giải ký tự đệm là coi nó như một lệnh loại bỏ 2 bit ở cuối chuỗi bit mỗi khi gặp phải ____ _ _ _ _ _. Ví dụ: khi `bGlnaHQgdw==` được giải mã, chúng tôi chuyển đổi từng ký tự (ngoại trừ các lần xuất hiện ở cuối của Giải mã Base64 không đệm[sửa]Không có phần đệm, sau khi giải mã bình thường bốn ký tự thành ba byte lặp đi lặp lại, có thể còn lại ít hơn bốn ký tự được mã hóa. Trong tình huống này, chỉ còn lại hai hoặc ba ký tự. Một ký tự được mã hóa còn lại là không thể, bởi vì một ký tự Base64 chỉ chứa 6 bit và 8 bit được yêu cầu để tạo một byte, do đó cần tối thiểu hai ký tự Base64. Ký tự đầu tiên đóng góp 6 bit và ký tự thứ hai đóng góp 2 bit đầu tiên. Ví dụ LengthEncodedLengthDecoded2bGlnaHQgdw1light w3bGlnaHQgd282light wo4bGlnaHQgd29y3light worTriển khai và lịch sử[sửa | sửa mã nguồn]Bảng tóm tắt các biến thể[sửa | sửa mã nguồn]Việc triển khai có thể có một số ràng buộc đối với bảng chữ cái được sử dụng để biểu diễn một số mẫu bit. Điều này đặc biệt liên quan đến hai ký tự cuối cùng được sử dụng trong bảng chữ cái ở vị trí 62 và 63 và ký tự được sử dụng để đệm (có thể bắt buộc trong một số giao thức hoặc bị loại bỏ trong các giao thức khác). Bảng bên dưới tóm tắt các biến thể đã biết này và cung cấp liên kết đến các tiểu mục bên dưới
Thư tăng cường bảo mật[sửa]Việc sử dụng tiêu chuẩn hóa đầu tiên được biết đến của mã hóa hiện được gọi là MIME Base64 là trong giao thức Thư điện tử nâng cao quyền riêng tư (PEM), do RFC 989 đề xuất vào năm 1987. PEM định nghĩa sơ đồ "mã hóa có thể in được" sử dụng mã hóa Base64 để chuyển đổi một chuỗi octet tùy ý thành định dạng có thể được biểu thị bằng các dòng ký tự 6 bit ngắn, theo yêu cầu của các giao thức truyền như SMTP. [7] Phiên bản hiện tại của PEM (được chỉ định trong RFC 1421) sử dụng bảng chữ cái gồm 64 ký tự bao gồm các chữ cái La Mã viết hoa và viết thường ( Để chuyển đổi dữ liệu sang mã hóa có thể in PEM, byte đầu tiên được đặt trong tám bit quan trọng nhất của bộ đệm 24 bit, byte tiếp theo ở giữa tám bit và byte thứ ba trong tám bit ít quan trọng nhất. Nếu còn ít hơn ba byte để mã hóa (hoặc tổng cộng), các bit bộ đệm còn lại sẽ bằng không. Sau đó, bộ đệm được sử dụng, sáu bit mỗi lần, quan trọng nhất trước tiên, làm chỉ số trong chuỗi. "______2705" và ký tự được chỉ định được xuất ra Quá trình được lặp lại trên dữ liệu còn lại cho đến khi còn ít hơn bốn octet. Nếu ba octet vẫn còn, chúng được xử lý bình thường. Nếu còn lại ít hơn ba octet (24 bit) để mã hóa, thì dữ liệu đầu vào sẽ được đệm bên phải với các bit 0 để tạo thành bội số nguyên của sáu bit Sau khi mã hóa dữ liệu không được đệm, nếu hai octet của bộ đệm 24 bit là các số không được đệm, thì hai ký tự PEM yêu cầu tất cả các dòng được mã hóa bao gồm chính xác 64 ký tự có thể in được, ngoại trừ dòng cuối cùng, dòng này có thể chứa ít ký tự có thể in hơn. Các dòng được phân tách bằng các ký tự khoảng trắng theo quy ước cục bộ (dành riêng cho nền tảng) Thông số kỹ thuật MIME (Phần mở rộng thư Internet đa năng) liệt kê Base64 là một trong hai lược đồ mã hóa nhị phân thành văn bản (kế hoạch còn lại có thể in được trích dẫn). [5] Mã hóa Base64 của MIME dựa trên mã hóa của phiên bản RFC 1421 của PEM. nó sử dụng cùng một bảng chữ cái 64 ký tự và cơ chế mã hóa như PEM và sử dụng ký hiệu MIME không chỉ định độ dài cố định cho các dòng được mã hóa Base64, nhưng nó chỉ định độ dài dòng tối đa là 76 ký tự. Ngoài ra, nó chỉ định rằng bất kỳ ký tự nào nằm ngoài bộ tiêu chuẩn gồm 64 ký tự mã hóa (Ví dụ: chuỗi CRLF), phải được bộ giải mã tuân thủ bỏ qua, mặc dù hầu hết các triển khai đều sử dụng cặp dòng mới CR/LF để phân định các dòng được mã hóa Do đó, độ dài thực tế của dữ liệu nhị phân được mã hóa Base64 tuân thủ MIME thường bằng khoảng 137% độ dài dữ liệu gốc (4⁄3×78⁄76), mặc dù đối với các tin nhắn rất ngắn, chi phí có thể cao hơn nhiều do chi phí của . Rất gần đúng, kích thước cuối cùng của dữ liệu nhị phân được mã hóa Base64 bằng 1. 37 lần kích thước dữ liệu ban đầu + 814 byte (đối với tiêu đề). Kích thước của dữ liệu được giải mã có thể được tính gần đúng với công thức này bytes = (string_length(encoded_string) − 814) / 1.37 UTF-7, được mô tả đầu tiên trong RFC 1642, sau này được thay thế bởi RFC 2152, đã giới thiệu một hệ thống có tên là Base64 đã sửa đổi. Sơ đồ mã hóa dữ liệu này được sử dụng để mã hóa UTF-16 dưới dạng các ký tự ASCII để sử dụng trong các phương thức vận chuyển 7 bit, chẳng hạn như SMTP. Nó là một biến thể của mã hóa Base64 được sử dụng trong MIME. [8][9] Bảng chữ cái "Modified Base64" bao gồm bảng chữ cái MIME Base64, nhưng không sử dụng ký tự đệm " OpenPGP[sửa mã nguồn]OpenPGP, được mô tả trong RFC 4880, mô tả mã hóa Radix-64, còn được gọi là "áo giáp ASCII". Radix-64 giống với mã hóa "Base64" được mô tả bởi MIME, với việc bổ sung CRC 24 bit tùy chọn. Tổng kiểm tra được tính trên dữ liệu đầu vào trước khi mã hóa; . [10] RFC 3548[sửa mã nguồn]RFC 3548, có tựa đề Mã hóa dữ liệu Base16, Base32 và Base64, là một bản ghi nhớ cung cấp thông tin (không theo quy chuẩn) nhằm cố gắng thống nhất các thông số kỹ thuật RFC 1421 và RFC 2045 của mã hóa Base64, mã hóa bảng chữ cái thay thế và Base32 (hiếm khi Trừ khi các triển khai được viết theo một thông số kỹ thuật đề cập đến RFC 3548 và yêu cầu cụ thể khác, RFC 3548 cấm các triển khai tạo thông báo chứa các ký tự bên ngoài bảng chữ cái mã hóa hoặc không có phần đệm, đồng thời tuyên bố rằng các triển khai bộ giải mã phải từ chối dữ liệu chứa các ký tự bên ngoài bảng chữ cái mã hóa . [6] RFC 4648[sửa mã nguồn]RFC này lỗi thời RFC 3548 và tập trung vào Base64/32/16 Tài liệu này mô tả các lược đồ mã hóa Base64, Base32 và Base16 thường được sử dụng. Nó cũng thảo luận về việc sử dụng nguồn cấp dữ liệu trong dữ liệu được mã hóa, việc sử dụng phần đệm trong dữ liệu được mã hóa, việc sử dụng các ký tự không phải bảng chữ cái trong dữ liệu được mã hóa, việc sử dụng các bảng chữ cái mã hóa khác nhau và mã hóa chuẩnMã hóa Base64 có thể hữu ích khi thông tin nhận dạng khá dài được sử dụng trong môi trường HTTP. Ví dụ: khung lưu giữ cơ sở dữ liệu cho các đối tượng Java có thể sử dụng mã hóa Base64 để mã hóa id duy nhất tương đối lớn (thường là UUID 128 bit) thành một chuỗi để sử dụng làm tham số HTTP trong biểu mẫu HTTP hoặc URL HTTP GET. Ngoài ra, nhiều ứng dụng cần mã hóa dữ liệu nhị phân theo cách thuận tiện để đưa vào URL, kể cả trong các trường biểu mẫu web ẩn và Base64 là mã hóa thuận tiện để hiển thị chúng theo cách nhỏ gọn Sử dụng Base64 tiêu chuẩn trong URL yêu cầu mã hóa các ký tự ' Vì lý do này, tồn tại các biến thể Base64 đã sửa đổi cho các biến thể URL (chẳng hạn như base64url trong RFC 4648), trong đó các ký tự ' Các phương thức JavaScript Base64 có thể được sử dụng trong nhiều ngữ cảnh khác nhau
Một số ứng dụng sử dụng bảng chữ cái Base64 khác biệt đáng kể so với bảng chữ cái được sử dụng trong các biến thể Base64 phổ biến nhất (xem bảng tóm tắt Biến thể ở trên)
Một vấn đề với bảng chữ cái RFC 4648 là khi một danh sách sắp xếp gồm các chuỗi mã hóa ASCII được chuyển đổi Base64 và sắp xếp lại, thứ tự của các phần tử sẽ thay đổi. Điều này là do ký tự đệm và các ký tự trong bảng chữ cái thay thế không được sắp xếp theo giá trị ký tự ASCII (có thể thấy giá trị này bằng cách sử dụng các nút sắp xếp của bảng mẫu sau). Các bảng chữ cái như (không đệm) B64 giải quyết vấn đề này Làm cách nào để kiểm tra hình ảnh base64 trong PHP?php $array=getimagesize("dữ liệu. hình ảnh/gif; . base64_encode('tệp bất kỳ'). '"); $e=explode("/",$array['mime']); if($e[0]=="image") { echo "file la image . ?> Save this answer.
Làm cách nào để kiểm tra xem dữ liệu có phải là base64 hay không trong PHP?"; $value_2 = mảng(); tiếng vang "nnbase64. n"; foreach (str_split(base64_decode('Không mã hóa base64',true)) dưới dạng $char) { echo ord($char). "N"; . tối đa($value_2). "
Làm cách nào để kiểm tra xem chuỗi base64 có phải là hình ảnh không?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ó phải là chuỗi mã hóa Base 64 hợp lệ hay không . Nếu có - 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.
Làm cách nào để kiểm tra dữ liệu được mã hóa hay không trong PHP?Trong PHP, mb_detect_encoding() được sử dụng để phát hiện mã hóa ký tự. Nó có thể phát hiện mã hóa ký tự cho một chuỗi từ danh sách các ứng cử viên được sắp xếp theo thứ tự. Chức năng này được hỗ trợ trong PHP 4. 0. |