Defaults.Exposed

Defaults.ExposedCách khắc phục › Bảo vệ clickjacking (X-Frame-Options)

Cách khắc phục Bảo vệ clickjacking (X-Frame-Options)

Một hướng dẫn một dòng nói với trình duyệt không để các trang web khác âm thầm tải trang của bạn bên trong trang của chúng. Không có nó, kẻ lừa đảo có thể ẩn trang thật, đã đăng nhập của bạn sau một trang giả và lừa khách hàng nhấp vào những thứ họ không bao giờ có ý định — phê duyệt thanh toán, thay đổi mật khẩu, cấp quyền truy cập.

Điểm mấu chốt với doanh nghiệp bạn: Kẻ gian lận có thể vô hình bọc website live của bạn bên trong một trang giả và đánh cắp tiền hoặc quyền truy cập tài khoản từ khách hàng đang đăng nhập của bạn — và với khách hàng trông như trang của bạn làm điều đó. Bản sửa miễn phí và mất khoảng 15 phút cho nhà phát triển; để trống là khoảng cách đã biết mà cả tội phạm và người mua thận trọng có thể phát hiện trong vài giây.

Điều này có thể gây thiệt hại gì

Tại sao điều này quan trọng. Đây là cài đặt miễn phí, một dòng mất vài phút để thêm, và nó đóng lại toàn bộ loại mánh khóe nhắm vào khách hàng đang đăng nhập của bạn. Trong tính điểm của chúng tôi đây là kiểm tra bảo mật web đáng điểm thật được đánh giá nghiêm trọng cao, vì header thiếu để lại lỗ hổng đã biết, dễ kiểm tra mà tội phạm tự động hóa và người mua tìm kiếm.

Thực ra là gì, giải thích đơn giản

Khi ai đó truy cập website của bạn, trình duyệt của họ cũng có thể được yêu cầu tải trang của bạn bên trong một website khác — như một cửa sổ nhỏ được nhúng bên trong trang lớn hơn. Nghe có vẻ vô hại, và đôi khi là vậy. Nhưng đó là cơ chế đằng sau cuộc tấn công gọi là clickjacking.

Đây là mánh khóe. Kẻ lừa đảo xây trang của chúng và lặng lẽ tải website thật của bạn bên trong nó — vô hình, làm hoàn toàn trong suốt. Sau đó chúng đặt nội dung của chính chúng lên trên: nút sáng bóng, “Phát video,” “Nhận phần thưởng của bạn.” Khách hàng của bạn thấy trang của kẻ tấn công và nhấp vào những gì trông như nút vô hại. Nhưng vì website thật của bạn đang ngồi vô hình dưới con trỏ của họ, lần nhấp thực sự đổ lên trang của bạn — xác nhận thanh toán, thay đổi mật khẩu, phê duyệt quyền truy cập, chấp nhận quyền hạn. Khách hàng nghĩ họ đã nhấp một thứ; thực ra họ đã nhấp thứ khác, trên trang họ tin tưởng.

Bảo vệ clickjacking là hướng dẫn ngắn, vô hình website của bạn gửi đến trình duyệt của mỗi khách truy cập nói, thực chất:

“Đừng để các trang khác tải tôi bên trong chúng. Nếu ai đó thử, từ chối.”

Trình duyệt hiện đại tuân theo điều này tự động. Khi được bật, mánh khóe đơn giản không hoạt động — bản sao nhúng của trang của bạn từ chối tải. Không có nó, trang của bạn là công cụ sẵn sàng được dùng như lớp ẩn trong một vụ lừa đảo, và khách hàng bị mắc sẽ liên kết toàn bộ với thương hiệu của bạn, không phải của kẻ tấn công.

Điều này có thể khiến bạn mất gì

Đây là các kịch bản thực tế, hàng ngày. Chúng tôi không bao giờ nêu tên doanh nghiệp thật; đây là minh họa về cách khoảng cách được sử dụng.

  1. “Xác nhận” vô hình. Khách hàng đang đăng nhập vào cổng tài khoản của bạn ở một tab. Họ hạ cánh trên trang (từ quảng cáo, email, kết quả tìm kiếm) hứa hẹn điều gì đó hấp dẫn và hiển thị nút “Tiếp tục” lớn. Ẩn dưới nút đó là kiểm soát “Xác nhận chuyển tiền” hoặc “Thay đổi email” thật của bạn, được tải từ phiên đã đăng nhập của chính họ. Họ nhấp “Tiếp tục” — và vô tình phê duyệt thay đổi trên tài khoản thật của họ với bạn. Với họ, và với nhóm hỗ trợ của bạn, trông như họ đã làm điều đó trên trang của bạn.

  2. Chiếm đoạt cài đặt. Kẻ tấn công đóng khung trang cài đặt tài khoản của bạn và phủ lên trò chơi hoặc khảo sát vô hại. Vài lần nhấp đúng chỗ lặng lẽ lật một cài đặt — thêm email của kẻ tấn công là địa chỉ khôi phục, cấp quyền ứng dụng, hoặc vô hiệu hóa cảnh báo bảo mật. Tài khoản giờ bị xâm phạm lặng lẽ, và không có gì trông sai vào thời điểm đó.

  3. Thỏa thuận đình trệ. Khách hàng lớn hơn gửi bảng câu hỏi bảo mật tiêu chuẩn trước khi ký. Một dòng hỏi liệu trang của bạn có đặt bảo vệ chống-framing (X-Frame-Options / CSP frame-ancestors) không. Liên hệ IT của bạn phải trả lời “không,” và thu mua tạm dừng trong khi bạn vội sửa cài đặt miễn phí, 15 phút mà giờ trông như dấu đỏ trước người mua.

  4. Chiến dịch dùng thương hiệu làm mồi nhử. Vì các trang thật, đáng tin của bạn có thể được nhúng, kẻ tấn công dùng đăng nhập hoặc trang thanh toán của bạn như lớp thuyết phục trong chiến dịch lừa đảo rộng hơn. Những khách hàng bị mắc không đổ lỗi cho kẻ tấn công mờ ám — họ nhớ đó là lần “trang của bạn” để họ bị lừa.

  5. Gắn cờ kiểm toán. Quét của công ty bảo hiểm, hoặc kiểm toán viên xem xét tư thế bảo mật của bạn, liệt kê thiếu bảo vệ clickjacking trong số các phát hiện. Đây là mục vệ sinh cơ bản kinh điển; bị gắn cờ báo hiệu rằng các bảo vệ miễn phí, dễ dàng không có sẵn — điều đó ảnh hưởng đến cách phần còn lại bảo mật của bạn được đánh giá.

Điểm xuyên suốt: thiệt hại đổ lên khách hàng thật, đang đăng nhập đang làm điều họ không có ý định — và nó mang tên của bạn, không phải của kẻ tấn công.

Thực ra nó là gì

Khi trình duyệt yêu cầu website của bạn một trang, máy chủ của bạn gửi lại trang cộng với một số “header” vô hình — hướng dẫn thêm trình duyệt đọc nhưng khách truy cập không bao giờ thấy. Bảo vệ clickjacking được gửi qua những header này. Có hai, và kiểm tra của chúng tôi đạt nếu một trong hai hiện diện:

1. Header cũ hơn — X-Frame-Options:

X-Frame-Options: SAMEORIGIN

Đây là kiểm soát lâu dài, được hỗ trợ rộng rãi. Nó nhận một trong hai giá trị thực tế:

2. Header hiện đại — frame-ancestors của Content-Security-Policy:

Content-Security-Policy: frame-ancestors 'self';

Đây là kiểm soát mới hơn, linh hoạt hơn và là cái các tiêu chuẩn hiện tại trỏ đến. Nó làm cùng việc nhưng cho bạn chính xác về ai có thể nhúng bạn:

”Tốt” trông như thế nào

Cài đặt mạnh nhất dùng cả hai: frame-ancestors cho trình duyệt hiện đại (và để chính xác trong việc đặt tên người nhúng được phép) và X-Frame-Options: SAMEORIGIN như dự phòng cho client cũ hơn. Kiểm tra của chúng tôi thỏa mãn với một trong hai — nhưng vì cả hai đều miễn phí và mất cùng vài phút, không có lý do gì không đặt cả hai.

Một chi tiết quan trọng nhà phát triển của bạn nên biết: header Content-Security-Policy-Report-Only không thực thi bất cứ thứ gì — nó chỉ báo cáo. Nếu bạn muốn bảo vệ clickjacking thực sự có hiệu lực, nó phải đến từ header thực thi (CSP bình thường với frame-ancestors, hoặc X-Frame-Options), không phải từ header chỉ-báo-cáo.

Cách sửa (miễn phí, ~15 phút)

Chuyển phần này cho người chạy website của bạn — người IT, nhà phát triển web, hoặc hỗ trợ hosting. Bản sửa miễn phí. Đây là một hoặc hai response header, hoặc một quy tắc trong CDN. Không có gì cần mua.

Kiểm tra đạt khi một trong hai header X-Frame-Options (đặt thành DENY hoặc SAMEORIGIN) hoặc chỉ thị CSP frame-ancestors hiện diện. Cài đặt đầy đủ được khuyến nghị thêm cả hai.

Bước 1 — Quyết định độ nghiêm ngặt

Bước 2 — Thêm header (chọn nền tảng của bạn)

Nginx — bên trong server block:

add_header X-Frame-Options "SAMEORIGIN" always;
add_header Content-Security-Policy "frame-ancestors 'self';" always;

Apache — đảm bảo mod_headers được bật, sau đó trong virtual host:

Header always set X-Frame-Options "SAMEORIGIN"
Header always set Content-Security-Policy "frame-ancestors 'self';"

Microsoft IIS — trong web.config bên trong <customHeaders>:

<add name="X-Frame-Options" value="SAMEORIGIN" />
<add name="Content-Security-Policy" value="frame-ancestors 'self';" />

Cloudflare (hoặc CDN tương tự): đến Rules → Transform Rules → Modify Response Header, và thêm hai quy tắc đặt X-Frame-Options thành SAMEORIGINContent-Security-Policy thành frame-ancestors 'self'; trên tất cả response. Đây là đường dễ nhất nếu bạn không có quyền truy cập máy chủ trực tiếp.

Đã gửi Content-Security-Policy vì lý do khác? Đừng tạo header CSP thứ hai — thêm frame-ancestors vào chính sách hiện có của bạn. Hai header CSP có thể xung đột.

Website builder (Squarespace, Wix, Shopify và tương tự): những nền tảng này thường đặt bảo vệ chống-framing cho bạn, vì vậy bạn có thể đã đạt mà không cần làm gì. Nếu kiểm tra của chúng tôi gắn cờ, kiểm soát thường trong cài đặt bảo mật của nền tảng, hoặc bạn thêm nó tại CDN đứng trước trang. (Lưu ý: Google Workspace và Microsoft 365 chạy email của bạn, không phải website — header này được đặt bất cứ nơi nào trang công khai của bạn thực sự sống, không phải trong admin Workspace/365.)

Bước 3 — Reload và xác minh

Reload máy chủ web hoặc triển khai quy tắc CDN, sau đó tải trang live của bạn và kiểm tra response header — browser dev tools → tab Network → nhấp vào yêu cầu trang → Response Headers, hoặc bất kỳ công cụ kiểm tra header miễn phí nào. Xác nhận các header xuất hiện trên response trang thật, không chỉ trang chủ. Sau đó chạy lại kiểm tra.

Các lỗi phổ biến

FAQ

Tôi không rành kỹ thuật — tôi có thể tự xử lý điều này không?

Bạn không cần làm phần kỹ thuật. Đây là một cài đặt được thêm vào máy chủ website hoặc CDN của bạn, và bất kỳ nhà phát triển web hoặc nhà cung cấp IT nào cũng có thể thêm nó trong vài phút. Chuyển phần 'Cách sửa' bên dưới cho họ — nó nói chính xác cần thêm gì. Bản sửa miễn phí; chúng tôi chỉ tính phí nếu bạn muốn chúng tôi tiếp tục theo dõi rằng nó luôn được bật.

Điều này có ngừng chính website của tôi, hoặc đối tác hợp lệ, hiển thị các trang của tôi không?

Chỉ nếu bạn đặt quá nghiêm ngặt. Cài đặt phổ biến ('SAMEORIGIN', hoặc 'frame-ancestors self') vẫn để chính website của bạn nhúng các trang của chính nó bình thường — nó chỉ chặn các trang bên ngoài. Nếu đối tác thực sự cần nhúng một trang cụ thể của bạn, nhà phát triển của bạn có thể cho phép nguồn đơn lẻ đó trong khi vẫn chặn mọi người khác.

Chúng tôi là doanh nghiệp nhỏ — có ai thực sự nhắm vào chúng tôi không?

Các cuộc tấn công này được chạy hàng loạt bởi công cụ tự động, không phải được chọn tay. Các trang nhỏ hơn thường bị nhắm vào chính xác vì chúng thiếu các bảo vệ cơ bản như thế này. Kẻ tấn công không cần biết bạn là ai — họ chỉ cần trang của bạn có thể nhúng được. Đóng khoảng cách không tốn gì.

'Tốt' thực sự trông như thế nào?

Hoặc là header X-Frame-Options đặt thành SAMEORIGIN (hoặc DENY), hoặc Content-Security-Policy với chỉ thị frame-ancestors — lý tưởng là cả hai. Kiểm tra của chúng tôi đạt nếu một trong hai hiện diện. Kiểm soát hiện đại, linh hoạt hơn là frame-ancestors; X-Frame-Options là header cũ hơn vẫn bao phủ một số trình duyệt cũ, vì vậy cài đặt đầy đủ dùng cả hai.

Điều này không giống với ổ khóa SSL hay HTTPS sao?

Không — chúng bảo vệ chống lại những thứ hoàn toàn khác nhau. HTTPS mã hóa kết nối để không ai có thể đọc trong quá trình truyền. Bảo vệ clickjacking ngăn các trang của bạn được tải bên trong trang của người khác. Bạn có thể có chứng chỉ hoàn hảo và vẫn hoàn toàn mở với clickjacking. Chúng là các kiểm tra riêng biệt và bạn muốn cả hai.

Nếu chúng tôi không sửa, điểm có giảm không?

Có. Đây là kiểm tra bảo mật web có điểm, không phải thông tin — header thiếu tốn điểm và được đánh giá nghiêm trọng cao, vì nó trực tiếp phơi lộ khách hàng đang đăng nhập của bạn với gian lận. Đây cũng là một trong những điểm rẻ nhất để lấy lại: một header miễn phí duy nhất, khoảng 15 phút thời gian của nhà phát triển.