发布于2026-07-09 阅读(0)
扫一扫,手机访问
CodeIgniter 最让人头疼的一点是——它自己压根儿不提供 Markdown 解析器。想要渲染 Markdown 文章,必须手动集成第三方库,比如 erusev/parsedown、michelf/php-markdown 或轻量级的 cebe/markdown。但问题不在于“装谁”,而在于装上之后,输出转义、XSS 防护和缓存协同这些坑,一个都不能躲。这里先给一个核心判断:如果只图省事直接 echo 解析结果,大概率要出事。

erusev/parsedown 实现安全基础渲染Parsedown 是目前最常用的 PHP Markdown 解析器,无依赖、维护活跃,社区很信任它。但它默认不转义 HTML——这本来是为灵活性设计的,可在 CodeIgniter 里,视图层不会自动帮你过滤原始 HTML 输出,直接 echo 就等于把 XSS 风险敞开了。所以你必须自己决定:允不允许内联 HTML?
安装没什么悬念:composer require erusev/parsedown。用法也简单,但关键是那条注释——
$parsedown = new \Parsedown(); $html = $parsedown->text($markdown_content); // 不过滤 HTML // 若需禁用 HTML,先调用 $parsedown->setSafeMode(true);
这里必须警惕的是:如果允许用户提交 Markdown,那即便开启 safeMode,parsedown 也允许链接写成 [x](ja vascript:alert(1)),点一下照样执行 JS。解决方案只有两条路:要么全程启用 safeMode,接受功能上的限制;要么对 href 和 src 属性做额外清洗,配合 CSP 策略或白名单过滤器。
每次在视图里 new \Parsedown() 不仅低效,还容易埋 bug。CodeIgniter 的标准做法是把解析器注册为自定义库或服务类,在控制器中注入或加载。比如创建一个 application/libraries/Markdown_parser.php:
parser = new \Parsedown();
$this->parser->setSafeMode(true); // 默认关闭 HTML
}
public function parse($text) {
return $this->parser->text($text);
}
}
然后在控制器中加载:$this->load->library('markdown_parser');,传递到视图时注意:$data['content_html'] = $this->markdown_parser->parse($post['body']);。视图中直接输出 = $content_html ?>——千万别用 html_escape(),否则 标签会被转义成纯文字,渲染全白费。
如果你对文章详情页启用了页面缓存($this->output->cache(60)),而 Markdown 内容又含动态元素(比如当前时间、用户昵称、未读数 badge),那就出大问题了——缓存会把解析后的静态 HTML 固化,后续请求永远看不到更新。
解决方案并不复杂:
cache()cache()->sa ve() 按原文本 hash 存储:$cache_key = 'md_' . md5($raw_markdown); $html = $this->cache->get($cache_key) ?: $this->markdown_parser->parse($raw_markdown); $this->cache->sa ve($cache_key, $html, 3600);parsedown 对相同输入始终输出相同 HTML,但不同版本可能存在细微差异——升级前务必做回归测试,否则线上可能突然“变脸”原生 parsedown 不处理 ```js 这类语法高亮,需要手动钩住 blockCodeComplete 或改用支持扩展的变体(比如 parsedown-extra)。更常见的做法是:解析后,用正则匹配 ,再交给前端的 highlight.js 渲染。
步骤很直接:确保解析器输出的 标签带 class="js" 属性(parsedown 默认支持,只要源码块首行写了 ```js)。然后在视图底部引入 highlight.js 的样式和脚本,调用 hljs.highlightAll();。关键点只有一个:CodeIgniter 输出的 HTML 必须保留原始 class 属性,不能被 html_escape() 或模板引擎二次转义。
最后再补一句:整个集成过程,最容易被忽略的其实是 XSS 边界。你以为关了 safeMode 就安全了,但真正危险的往往是你没想到的地方——比如用户提交的 Markdown 里嵌了一个 ja vascript: 协议的链接。清洗 href 属性,或者全程启用 safeMode,二者选其一。没有中间态。
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
正版软件
正版软件
正版软件
正版软件
正版软件
1
2
3
7
8