# Cursor Markdown 预览：保留表格链接，阻止脚本和事件属性执行

marked与DOMPurify在真实DOM中保留正常格式，缺陷载荷标记1，清洗后七个本机样例均未执行；不宣称覆盖所有XSS。

## 环境

- Node.js 24+；进入 reference 后 npm install。依赖为锁定的直接版本，首次安装需要网络。
- npm run build 后再启动HTTP服务。编译bundle与WASM运行时不随包分发，build.mjs从本地npm依赖准备。

## 启动

~~~sh
cd reference
npm install
npm run build
python3 -m http.server 8787
~~~

## 七步操作

1. 准备Markdown输入

输入包含标题、粗体、表格、文档链接和原创本地img事件样例。所有攻击字符串只在自己的localhost练习页运行，不访问第三方目标。

2. 渲染正常格式

先用marked解析Markdown，核对正常表格和粗体结构。这一步只完成语法转换，Markdown解析器本身不是安全边界。

3. 运行缺陷预览

点击故意不清洗版本，原生DOM事件把执行标记变为1。反例证明当前载荷确实能执行，而不是选择了一份本来就无害的字符串。

4. 清洗后再连接DOM

调用DOMPurify.sanitize后再设置innerHTML，必须在连接DOM之前清洗。不能先插入执行，再删除危险节点当作已防住。

5. 保留表格链接

安全版保持粗体、表格和正常链接，执行标记为0。只把所有HTML转成纯文本虽然可能降低风险，却没有满足本题的预览功能合同。

6. 执行七个样例

运行七个本地载荷，逐个连接清洗后的DOM并观察实际执行标记，结果均为0。报告保留每个输入与清洗后的HTML，便于复查规则。

7. 记录防护范围

下载marked、DOMPurify锁版本源码与本地样例。七例不是所有XSS的充分证明，后续若再次修改清洗后的DOM，需要重新审视边界；Cursor账号会话未运行。

## 目录身份

- starter：待完成的任务接口与原创输入，TODO不是已完成实现。
- reference：作者原生完成参考和实际产物。records.json/browser-result.json为本地实测记录，不是AI助手回复。
- TASK.md：可交给相应AI助手的原始任务合同。该助手账号生成会话未运行。

## 依赖与许可

原创教学代码以MIT许可提供。第三方项目、模型及浏览器遵循其自身许可。第三方依赖由本地安装获取，不包含node_modules、模型权重、WASM运行时、数据库、缓存或凭据。

## 官方依据

- https://github.com/cure53/DOMPurify
