Bảo mật
Component nào hiển thị nội dung không tin cậy (Markdown từ người dùng hay mô hình, code, link, tệp) và Yugen UI làm sạch những gì; phần còn lại app phải tự làm.
Yugen UI xử lý gì
Đã rà soát bảo mật trước 1.0 (#165).
- Markdown và StreamingMarkdown phân tích thành React element, không có HTML và không dùng
dangerouslySetInnerHTML. Thẻ HTML hiện như chữ. - Link chỉ giữ
http:,https:,mailto:, và link tương đối (/path,#id) trong Markdown; StreamingMarkdown chỉ giữ link tương đối khi bậtrelativeLinks.javascript:,data:,vbscript:và URL bắt đầu bằng//hiện như chữ, kể cả khi viết hoa lẫn lộn hay chèn ký tự điều khiển. Citation dùng cùng cách kiểm tra. Ảnh () hiện thành link, nên một tin nhắn không tải được ảnh từ máy chủ khác. - Nội dung rất dài hay lồng rất sâu không làm treo trang: độ sâu có giới hạn (khối 32, inline 16), ngoặc và dấu chưa đóng được quét có giới hạn, và CI cho bộ phân tích chạy với input độc hại và ngẫu nhiên trong ngân sách thời gian.
- CodeBlock hiển thị token như chữ, và bộ tô màu vẫn tuyến tính trên dòng rất dài.
- Ảnh xem trước của FileUpload và PromptInput dùng object URL và thu hồi khi gỡ tệp hoặc component unmount. Tệp SVG hiện trong
<img>, nơi script không chạy. - React 19 chặn URL
javascript:mà bạn tự truyền vàohref(Link, ButtonasChild…).
App phải tự làm gì
- Prose định dạng mọi HTML bạn đặt vào và không làm sạch nó. HTML từ người dùng hay CMS phải được sanitize trước (ví dụ bằng DOMPurify), hoặc dùng component Markdown thay vì HTML.
- Kiểm tra URL từ người dùng trước khi đưa vào
hrefhaysrc: cho phéphttps:(và các scheme bạn cần), không chodata:ở link. - Giới hạn dung lượng nội dung từ người dùng và mô hình ở server; giới hạn phía client chỉ giữ trang không bị treo.
- Kiểm tra tệp tải lên ở server;
acceptvà giới hạn dung lượng của FileUpload là để giúp người dùng, không phải để bảo mật.
Báo lỗ hổng
Hãy báo riêng theo hướng dẫn trong SECURITY.md, không mở issue công khai.