TUẦN 7 # Lý thuyết Tìm hiểu về các khái niệm như MIME, Header Content-type, File signatures. ## MIME (Multipurpose Internet Mail Extensions) ### Khái niệm MIME MIME là một tiêu chuẩn, là phần mở rộng của email cho phép người dùng trao đổi các tệp tin, các dữ liệu. Các dữ liệu này gồm có các loại như video, âm thanh, chương trình ứng dụng hay hình ảnh. MIME có nhiều điểm khác biệt so với SMTP bởi nó hỗ trợ việc gửi văn bản ASCII và các loại dữ liệu không thuốc ASCII thông qua địa chỉ email. Với các văn bản thuốc bộ ký tự không nằm trong ASCII, giao thức MIME (Multipurpose Internet Mail Extensions) được mặc định dưới dạng bắt buộc. ### Những mặt hạn chế của SMTP Ban đầu, giao thức SMTP chỉ hỗ trợ người dùng giao tiếp bằng văn bản ASCII 7-bit không được mã hóa cũng không xác thực. Theo đó, với 94 ký tự trong ASCII, hệ thống không xử lý được tệp tin nhị phân hoặc các ký tự trong bảng chữ cái của một số ngôn ngữ không phải tiếng Anh. Mọi máy chủ SMTP được thiết kế mặc định là chuyển tiếp thư, cho phép bạn gửi email thông qua nó. Tuy nhiên, giao thức lại có những hạn chế và dễ bị giả mạo gửi thư rác, giả mạo email hay thực hiện các cuộc tấn công mang tên man-in-the-middle viết tắt là MitM. ### Ưu điểm của MIME So với SMTP, MIME mang đến một vài lợi thế nhất định. Chẳng hạn như: - Người dùng sẽ gửi các tệp đính kèm theo dạng nhị phân thông qua địa chỉ email. - Các tệp tin đính kèm thuộc nhiều loại khác nhau có thể được bao gồm trong cùng một email. - Độ dài tin nhắn văn bản sẽ không được giới hạn. - Một số tin nhắn sẽ được hệ thống hỗ trợ. - MIME sẽ tiến hành định nghĩa bốn kiểu phụ cho thông điệp nhiều phần đồng thời xác định xác định xem bản chất của các phần này trong mối quan hệ của chúng. Multipart hay Alternative sẽ giúp hệ thống trình bày thông điệp dưới dạng HTML hay các văn bản thuần túy. ### MIME hoạt động như thế nào? Các email theo định dạng MIME sẽ truyền qua giao thức tiêu chuẩn, ví dụ như Post Office Protocol (POP), SMTP hay Internet Message Access Protocol (IMAP). Thông báo có nội dung gồm nhiều phần khác nhau. Phần tiêu đề sẽ được xác định qua bộ ký tự không phải ASCII. RFC 2045 của IETF sẽ làm nhiệm vụ xác định các tiêu đề khác nhau dùng trong mô tả thông điệp MIME. Máy chủ làm nhiệm vụ chèn MIME khi bắt đầu quá trình truyền email. Sau đó, khách hàng sẽ dung tiêu đề MIME chọn trình phát thích hợp cho dữ liệu. Các trình phát được tích hợp qua trình duyệt web hoạc qua ứng dụng khách. Chẳng hạn tất cả các trình duyệt sẽ có trình phát ảnh định dạng JPEG, GIF và xử lý được các tệp HTML. Với người gửi, MIME chuyển đổi dữ liệu không thuốc ASCII thành dữ liệu NVT 7-bit hay dữ liệu đầu cuối mạng ảo. ASCII 7-bit đại diện cho 128 ký tự còn MIME sẽ cung cấp dữ liệu biến đổi đến với SMTP của một ứng dụng khách. Với người nhận, tin nhắn chuyển trở lại dữ liệu ban đầu để họ xem được nội dung, video, âm thanh hay một loại dữ liệu nào đó khác. ### Các trường MIME header MIME header sẽ chứa các phần con khác nhau như: - MIME-Version: Thư có định dạng MIME với giá trị là 1, 0. - Content-Type: Tiêu đề mô tả phương tiện bên trong nội dung thư. Nó gồm một loại nhất định với các danh mục chung của dữ liệu và một kiểu phụ có chứa MIME đại diện. Các loại MIME sẽ không phân biệt chữ thường hay chữ hoa. - Content-Disposition (Nội dung – Sự sắp xếp): Tiêu đề được xác định dưới dạng trình bày email với các vấn đề về tự động hiển thị thông báo (Inline), tệp đính kèm sẽ không hiển thị tự động và RFC 2183 với mục đích chỉ định tiêu đề để bố trí nội dung. - Content-Transfer-Encoding (Nội dung – Chuyển – Mã hoá): Tiêu đề cho thấy loại lược đồ mã hóa nhị phân thành dạng văn bản đã được dùng ngoài mã hóa ban đầu chỉ định trong tiêu đề nội dung hay chưa. ## Header Content-type Tiêu đề `Content-Type` mô tả phương tiện bên trong nội dung thư. Nó gồm một loại nhất định với các danh mục chung của dữ liệu và một kiểu phụ có chứa MIME đại diện. Các loại MIME sẽ không phân biệt chữ thường hay chữ hoa. Trong phản hồi, tiêu đề `Content-Type` cung cấp cho khách hàng loại nội dung thực tế của nội dung được trả về. Giá trị của tiêu đề này có thể bị bỏ qua, ví dụ như khi trình duyệt thực hiện đánh hơi MIME; đặt giá trị tiêu đề `X-Content-Type-Options` thành nosniff để ngăn chặn hành vi này. Trong các yêu cầu, (chẳng hạn như `POST` hoặc `PUT`), máy khách sẽ cho máy chủ biết loại dữ liệu nào thực sự được gửi. |Loại tiêu đề| Tiêu đề đại diện | | -------- | -------- | |Tên tiêu đề bị cấm | KHÔNG |Tiêu đề phản hồi được liệt kê trong danh sách an toàn của CORS | Đúng |Tiêu đề yêu cầu được liệt kê trong danh sách an toàn của CORS |Có, với hạn chế là các giá trị không được chứa byte tiêu đề yêu cầu không an toàn CORS : 0x00-0x1F (ngoại trừ 0x09 (HT)), `"():<>?@[\]{}`và 0x7F (DEL).. Nó cũng cần phải có loại MIME với giá trị được phân tích cú pháp (bỏ qua các tham số) là `application/x-www-form-urlencoded`, `multipart/form-data`, hoặc `text/plain`. **Syntax** ``` Content-Type: text/html; charset=utf-8 Content-Type: multipart/form-data; boundary=something ``` **Chỉ thị** `media-type` Loại MIME của tài nguyên hoặc dữ liệu. `charset` Chuẩn mã hóa ký tự. Không phân biệt chữ hoa chữ thường, ưu tiên sử dụng chữ thường. `boundary` Đối với các thực thể nhiều phần, lệnh boundary là bắt buộc. Lệnh này bao gồm từ 1 đến 70 ký tự từ một tập hợp các ký tự (và không kết thúc bằng khoảng trắng) được biết là rất mạnh mẽ thông qua các cổng email. Nó được sử dụng để gói gọn ranh giới của nhiều phần của tin nhắn. Thông thường, ranh giới tiêu đề được thêm vào trước hai dấu gạch ngang và ranh giới cuối cùng có hai dấu gạch ngang được thêm vào cuối. **Ví dụ** Content-Type ở dạng HTML Trong một yêu cầu `POST`, xuất phát từ việc gửi biểu mẫu HTML, yêu cầu `Content-Type` được chỉ định bởi thuộc tính `enctype` trên phần tử `<form>`. ``` <form action="/" method="post" enctype="multipart/form-data"> <input type="text" name="description" value="some text" /> <input type="file" name="myFile" /> <button type="submit">Submit</button> </form> ``` Yêu cầu trông giống như thế này: ``` POST /foo HTTP/1.1 Content-Length: 68137 Content-Type: multipart/form-data; boundary=---------------------------974767299852498929531610575 -----------------------------974767299852498929531610575 Content-Disposition: form-data; name="description" some text -----------------------------974767299852498929531610575 Content-Disposition: form-data; name="myFile"; filename="foo.txt" Content-Type: text/plain (content of the uploaded file foo.txt) -----------------------------974767299852498929531610575-- ``` ## File Signatures File Signature hoặc Magic Number là một tập hợp giao thức gồm các giá trị số và văn bản không đổi được sử dụng để xác định định dạng tệp. Nói cách khác, mọi loại tệp đều yêu cầu một File Signature duy nhất để hệ điều hành nhận dạng, phân loại và hiển thị cho người dùng. Hàng trăm Magic Numbers (File Signatures) khác nhau đã được tạo ra cho những mục đích sử dụng khác nhau. Ngày nay File Signatures quan trọng đối với bạn khi bạn đang thực hiện khôi phục file. Nếu bạn đã xóa các tệp có File Signature cụ thể (ví dụ: * .jpeg), việc quét ổ cứng để tìm File Signature đó sẽ dễ dàng hơn và tốn ít thời gian hơn nhiều so với việc quét nó để tìm tất cả các File Signatures có thể có, duyệt qua chúng và chọn từng file một để hồi phục. File Signatures được hỗ trợ - Adobe Files (*.pdf, *.aep, *.psd, *.swf) - Camera Raw Files (*.crw, *.cr2, *.dng, *.raf, *3fr, *.kdc, *.dcr, *mrw, *.mos, *.raw, *mef, *nef, *.orf, *.rw2, *.pef, *.srw, *.erf, *.x3f, *.arw, *.sr2, *.srf) - Compressed Archives (*.7z, *.arc, *.arj, *bz2, *.gz, *.lz4, *.lzh, *.tar, *.cab, *.rar, *.xz, *.zip, *.zoo) - Electronic Books (*.djvu, *.fb2, *.lit, *.qbw, *.rb) - File System Metadata (*.iso, *.Sdir, *.Sfile, *.Sindx) - FileMaker Platform (*.fp3, *.fp5, *.fmp12, *.fp7) - Formatted Text Files (*.chm, *.xml, *.htm, *.rtf) - Microsoft and OpenOffice Documents (*.rpt, *.mdb, *.xlsx, *.xls, *.msg, *.doc, *.docx, *.odb, *.odf, *.odg, *.odp, *.ods, *.odt, *.ole, *..pst, *,pptx, *.ppt, *.vsd, *.xps) - Miscellaneous (*.max, *.dwg, *.3ds, *.dxf, *.eps, *.fdb, *.stl) - Music and Audio Files (*.4xa, *aac, *.ac3, *.aiff, *.aifc, *.flac, *.mid, *.ape, *.mp3, *.ogg, *.ra, *.au, *.mmf, *.wav, *.wvc, *.wma) - Photos and images (*.bmp, *.cmx, *.cdr, *.gif, *.ico, *.jp2, *.j2c, *.jpg, *.c4d, *.mng, *.pcx, *.png, *.tif, *.ani) - QuickTime Multimedia (*.3g2, *.3gp, *.cdc, *.dcf, *.f4v, *.jpa, *.jpm, *.jpx, *.m4a, *.m4b, *.m4p, *.m4v, *.maf, *.mj2, *.mov, *.mp4, *.mpg, *.mqv, *.sdv) - Video Files (*.4xm, *.asf, *.amv, *.avi, *.fli, *.flc, *.flv, *.mxf, *.mkv, *.mpg, *.mts, *.mpeg, *.m2v, *.r3d, *.rm, *.rmvb, *.wmv) # Thực hành: - Code web upload file từ ngôn ngữ tùy chọn https://hackmd.io/@O_v7bSgGTW6665BSrrI8eQ/SJSwN40Vp - Làm các bài upload file trên RootMe https://hackmd.io/@O_v7bSgGTW6665BSrrI8eQ/B1M_0t1H6