THẢO LUẬN

thg 6 25, 10:50 CH

he 😃

0

Làm thế nào mà máy tính có thể phân biệt được một file là image hay text ? Trending how-to-detect-file-format.png

Đặt vấn đề Máy tính làm thế nào để biết file nào là ảnh, file nào là văn bản?

Nhìn qua câu hỏi thì có vẻ đơn giản, chẳng phải mỗi file điều có đuôi extension sao, dựa vào đó mà phân biệt thôi.

Image thì sẽ có những đuôi như .png, .jpeg,… Text thì sẽ có những .txt… Thế bạn đã bao giờ tải nhầm một file ảnh có đuôi .txt mà không thể mở nó chưa? Và với tư cách là một lập trình viên, tôi còn có thêm một số câu hỏi

Nếu file đó không có phần đuôi extension thì sao ? Nếu người dùng chỉnh sửa đuôi của file ảnh thành file .txt thì khi upload lên server thì sao ? Có nhiều vấn đề để chúng ta tìm hiểu hơn rồi đó phải không? Cùng mình khám phá nha!

Đơn giản mà nói thì đuôi extension không quyết định loại của file đó Thật vậy, một file có thể không có đuôi extension và nếu có, cũng chưa chắc đuôi extension đó thể hiện đúng loại file.

Mức độ quan trọng của đuôi extension cũng tuỳ vào hệ điều hành.

(optional) Nhìn chung thì hệ điều hành như linux sẽ chẳng quan tâm đuôi extension của file đâu, thay vào đó cứ file nào executable được là nó chạy à, nó sẽ nhìn vào header file, nội dung file để tìm kiếm những application phù hợp để thực thi file đó. Ví dụ những file có dòng đầu là #!/bin/bash

Cái này gọi là shebang, đây là một cách đặc biệt để nói với hệ điều hành rằng bạn muốn mở file này bằng program nào.

(mandatory) Còn một vài hệ điều hành hướng đến sự thuận tiện cho người dùng như Window thì đuôi extension sẽ có nhiều đất diễn hơn. File association (Registry): dựa vào đuôi extension, Window sẽ liên kết với các application cụ thể, và dùng application đó để mở file. Default programs: Window cũng cho phép bạn tuỳ chỉnh, với đuôi extension này thì sẽ được mở với application kia. Magic number là gì ? Đầu tiên, ta cần hình dung các file trông như thế nào, nó sẽ được lưu dưới dạng nhị phân như sau

0100 0111 0100 1001 0100 0110 ....

Thường thì phần đầu của file sẽ có những chuỗi byte đặc biệt, ta gọi nó là Magic number giúp các application chuyên dụng phân biệt được file đó là gì.

Cùng nhìn thêm 1 ví dụ về file PNG bên dưới nhá, sau khi xác định được file đó là gì thì phía sau chúng ta sẽ có các metadata khác nữa, cái metadata dài như thế nào, chứa cái gì thì sẽ tuỳ vào loại file đó.

Untitled.png

💡 Metadata là dữ liệu mô tả thông tin chi tiết về dữ liệu, như phía trên thì là dữ liệu để mô tả cái file là ảnh và có những đặc tính gì.

Ví dụ về magic numbers của một vài file:

PNG: 89 50 4E 47 0D 0A 1A 0A JPEG: FF D8 FF PDF: 25 50 44 46 ZIP: 50 4B 03 04 MIME type là gì ? Định nghĩa này thì chắc hẳn đa số anh em lập trình ta sẽ gặp nhiều.

MIME type (viết tắt của Multipurpose Internet Mail Extensions) là một chuỗi ký tự chuẩn được sử dụng để xác định định dạng của một tệp. Nó gồm hai phần: loại (type) và kiểu con (subtype), được phân tách bằng dấu gạch chéo (/).

Ví dụ:

image/png: Hình ảnh định dạng PNG image/jpeg: Hình ảnh định dạng JPEG text/plain: Văn bản thuần túy application/pdf: Tài liệu PDF video/mp4: Video định dạng MP4 Cách hoạt động:

Khi bạn mở một tệp trên máy tính, hệ điều hành sẽ kiểm tra MIME type của tệp đó (thường được xác định dựa trên phần đuôi extension hoặc magic number) để tìm ứng dụng phù hợp để mở tệp. Tương tự, khi trình duyệt web tải xuống một tệp, nó sẽ xem MIME type để xác định cách xử lý tệp đó (hiển thị trực tiếp trong trình duyệt, tải xuống, hoặc mở bằng ứng dụng khác).

Tìm kiếm MIME type:

Bạn có thể tìm thấy danh sách đầy đủ các MIME type được IANA (Internet Assigned Numbers Authority) công nhận trên trang web của họ hoặc trên các nguồn khác như MDN Web Docs:

https://www.iana.org/assignments/media-types/media-types.xhtml https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/MIME_types Bonus - Validate file Validate file input là một tiến trình phức tạp, không có một phương pháp đơn lẽ nào hiệu quả! Chúng ta cần phải kết hợp nhiều phương thức lại với nhau.

Với những gì đã học được phía trên, khi kiểm tra định dạng của 1 file, chúng ta không chỉ nên kiểm tra đuôi extension, vì nó rất dễ bị bypass.

Kiểm tra MIME type sẽ đáng tin cậy hơn, những vẫn có lỗ hỏng.

Một request upload file thường sẽ có header chứa trường Content-Type để xác định MIME type của file đó. Kẻ tấn công có thể chỉnh sửa trường này, nên bạn hãy cẩn thận.

💡 Tôi đã thử kiểm tra thư viện multer, nó xài một thư viện là busboy, và việc check mimeType hoàn toàn dựa vào trường Content-Type

Kiểm tra header file, cụ thể là phần magic number hay file signature, sau đó so sánh với danh sách những loại đáng tin cậy đã được công khai ở những link dưới đây, nếu không có trong đó thì quăng ra lỗi.

https://en.wikipedia.org/wiki/List_of_file_signatures https://en.wikipedia.org/wiki/Magic_number_(programming) https://gist.github.com/leommoore/f9e57ba2aa4bf197ebc5 Cuối cùng chính là kiểm tra nội dung file, dùng các phần mềm antivirus or anti-malware để quét toàn bộ nội dung file, lỗi bỏ các file độc hại.

Kết bài Tóm lại, việc xác định loại file không chỉ đơn thuần dựa vào đuôi extension mà là sự kết hợp của nhiều yếu tố như hệ điều hành, magic number và MIME type. Hiểu được chúng, bạn sẽ có thể xử lý file một cách chính xác và an toàn hơn.

Hy vọng bài viết này đã cung cấp cho bạn những kiến thức hữu ích về vấn đề này. Nếu bạn có bất kỳ câu hỏi hoặc góp ý nào, đừng ngần ngại để lại bình luận bên dưới!

Nguồn tham khảo https://www.linkedin.com/advice/1/how-do-you-validate-file-types-sizes-before https://en.wikipedia.org/wiki/Magic_number_(programming)

0

hơi ngoài blog xíu, e muốn hỏi là có con api bot nào có thể tích hợp vào web để tự sinh ra title, description, slug,... theo quy chuẩn mình câu hình và content đầu vào không ah

0

Cảm ơn bạn đã đọc bài nhé 🫶

0
Avatar
đã bình luận cho bài viết
thg 6 25, 1:54 CH

tác giả copy vào google dịch à 😦

0

Cảm ơn bác nhiều, đang định implement cái này. Được hướng dẫn chi tiết như vậy quá tuyệt vời.

+1

Code ở mục 1 vẫn work mà nhỉ, bạn có thể giải thích kĩ hơn không?

+1

hay đó bro 😁

0
thg 6 25, 5:10 SA

Cái ý thường xuyên đi phỏng vấn dù có ý định nghỉ việc hay không này thật sự lần đầu mình đọc được. Nhưng ngẫm thì cũng đúng vì nếu đi PV mình cũng tự định lượng được bản thân của mình đang ở mức nào và những câu hỏi của nhà tuyển dụng còn có câu nào mình ko trả lời được chả hạn thì cũng là kiến thức mình hổng cần update thêm. Cảm ơn ad nhé

0
thg 6 25, 5:05 SA

Cảm ơn b, bài viết rất hay và phân tích cực kỳ chi tiết

0

ướt

0
Avatar
đã bình luận cho bài viết
thg 6 25, 1:44 SA

Mỗi lần restart, pid của process thay đổi, lại phải làm cơm á b @@

0

Bác có nói là những câu hỏi trong sách ít gặp ở các công ty Việt Nam. Cho mình xin vài tài liệu có các câu hỏi thường gặp với 😁

0

@duongpham910 Em cảm ơn ạ. Có gì em sẽ hỏi anh tiếp hihi.

0

có web nào free ko ad ơi

0

bookmark để đọc sau

+1

@Clarence161095 Thank you, bro. Góp ý rất tâm huyết. Respect 🫡

0

Mình cũng đồng ý với bạn @refacore, tuy nhiên mình xin bổ sung một chút theo ý kiến cá nhân của mình 😁:

Không phải là hoàn toàn không được 😁, 1tr request hello world nó cũng khác 1tr request query db select 1. Đây có thể gọi là biện pháp cấp cơ sở kiểu "dân quân tự vệ" thôi 😄 Không đúng 100% về bản chất nhưng cũng sẽ giảm thiểu thiệt hại một chút chút chút (có thêm 1 chút xíu xíu time để các biến pháp khác có thể can thiệp kịp). Tất nhiên là DDOS với botnet luôn làm ae đau đầu, nhất là những app nhỏ không có nhiều kinh phí để trả tiền cho các service cao cấp. Thôi thì xóm nghèo cứ "dân quân tự vệ" trước, biết là chả làm được gì nhưng có hơn không 😁

Tuy nhiên trong một số trường hợp nhất định, Rate limiting quả thực có thể giúp chống lại các cuộc tấn công DDoS ở một mức độ nhất định, đặc biệt là với các cuộc tấn công đơn giản hoặc quy mô nhỏ. Tuy không phải giải pháp toàn diện nhưng cũng góp phần giảm thiểu thiệt hại và "kéo dài thời gian" để các biện pháp khác can thiệp kịp thời.

Cụ thể, rate limiting giúp:

  • Hạn chế số lượng request gửi đến hệ thống trong một khoảng thời gian, tránh hệ thống bị quá tải.
  • Chặn các địa chỉ IP đáng ngờ gửi quá nhiều request.
  • Bảo vệ các API công khai và điểm cuối quan trọng khỏi bị lạm dụng.

Tuy nhiên, rate limiting cũng có những hạn chế:

  • Khó đối phó với các cuộc tấn công DDoS quy mô lớn, sử dụng nhiều IP hoặc kỹ thuật tinh vi.
  • Có thể ảnh hưởng tới trải nghiệm của người dùng chính thống nếu cấu hình không phù hợp.
  • Cần được kết hợp với các biện pháp bảo mật khác để tăng cường hiệu quả.
  • Có thể bị "vượt mặt" bởi các kẻ tấn công thông minh.
  • Cần cân nhắc kỹ lưỡng để tránh chặn các request hợp lý từ người dùng thật.
  • Cần theo dõi và cập nhật liên tục để đảm bảo hiệu quả.
  • Và quan trọng nhất là: Không thể ngăn chặn hoàn toàn các cuộc tấn công DDoS.

Vì vậy, rate limiting nên được kết hợp với các biện pháp bảo mật khác như firewall, hệ thống phát hiện xâm nhập (IDS), mạng phân phối nội dung (CDN), Cloudflare, AWS Shield, Azure DDoS Protection,... (Ối zồi ôi có tiền thì mua tiên cũng được) để tạo thành lớp phòng thủ đa tầng.

Đối với các ứng dụng nhỏ, nguồn lực có hạn, rate limiting vẫn là đội "dân quân tự vệ" đáng để triển khai. Dù không thể chống lại mọi cuộc tấn công, nhưng "có còn hơn không" mà, đúng không nào? 😄

+1
Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí