condenast-spain/parsedown

Markdown 解析器。

1.7.4 2018-11-19 10:18 UTC

README

PHP 中更好的 Markdown 解析器

演示 | 性能比较 | 测试 |

特性

安装

Composer

运行以下命令安装 composer 包

composer require condenast-spain/parsedown

手动

  1. 最新发布版 下载 "源代码"
  2. 包含 Parsedown.php

示例

$Parsedown = new Parsedown();

echo $Parsedown->text('Hello _Parsedown_!'); # prints: <p>Hello <em>Parsedown</em>!</p>
// you can also parse inline markdown only
echo $Parsedown->line('Hello _Parsedown_!'); # prints: Hello <em>Parsedown</em>!

安全性

Parsedown 能够在它生成的 HTML 中转义用户输入。此外,Parsedown 还会应用其他脚本向量(如脚本链接目标)的净化,这些脚本向量是由 markdown 语法本身引入的。

要告诉 Parsedown 它正在处理不可信的用户输入,请使用以下方法

$parsedown = new Parsedown;
$parsedown->setSafeMode(true);

如果您希望在不信任的用户输入中允许 HTML,但仍希望输出无 XSS,则建议使用允许 HTML 标签白名单的 HTML 清洁器,例如 HTML Purifier

在两种情况下,您都应强烈考虑采用多层次防御措施,如部署 内容安全策略(浏览器安全功能),以确保即使在攻击者发现上述第一道防线中的漏洞时,您的页面也可能保持安全。

Parsedown 扩展的安全性

在使用 Parsedown 扩展时,安全模式不一定能产生安全的结果。应单独评估扩展,以确定其对 XSS 的具体安全性。

转义 HTML

⚠️  警告:此方法不安全,可能存在 XSS 风险!

如果您希望在不信任的输入中转义 HTML,可以使用以下方法

$parsedown = new Parsedown;
$parsedown->setMarkupEscaped(true);

请注意,这仍然允许用户插入不安全的脚本向量,例如 [xss](javascript:alert%281%29) 这样的链接。

问题

Parsedown 是如何工作的?

Parsedown 尝试像人类一样读取 Markdown。首先,它查看行。它对行的开头很感兴趣。这有助于它识别块。例如,如果一行以 - 开头,那么它可能属于列表的一部分。一旦它识别出块,它就继续到内容。在阅读的过程中,它会关注特殊字符。这有助于它识别内联元素(或内联)。

我们称这种方法为“基于行的方法”。我们相信 Parsedown 是第一个采用此方法的 Markdown 解析器。自从 Parsedown 发布以来,其他开发人员已经使用相同的方法在 PHP 和其他语言中开发了其他 Markdown 解析器。

它符合 CommonMark 吗?

它通过了大多数 CommonMark 测试。大多数未通过测试的情况都涉及非常不常见的情况。然而,随着 CommonMark 的成熟,兼容性应该会提高。

谁在使用它?

Laravel 框架Bolt CMSGrav CMSHerbie CMSKirby CMSOctober CMSPico CMSStatamic CMSphpDocumentorRaspberryPi.orgSymfony 示例等等。