【问题标题】:Using markdown properly in a PHP application在 PHP 应用程序中正确使用 markdown
【发布时间】:2012-12-22 00:24:47
【问题描述】:

我在一个使用 Markdown 作为其语法的 Web 应用程序上工作,我面临的唯一问题是如何验证服务器端的用户输入,以便它实际上是 Markdown,而不是可以使用POST 请求或通过禁用 javascript。

我知道 StackOverflow 可以做到这一点,但他们如何做到这一点并允许某些 HTML 标签包括容易受到 XSS 攻击的图像?任何可以提供帮助的开源软件包(示例赞赏)。

因为听说 StackOverflow 使用了它,所以我将尝试使用 Pagedown 作为客户端验证器。

【问题讨论】:

  • @zerkms 将 Markdown 转换为 html,我需要逆向,我需要它来检查输入是否确实是 Markdown...
  • @fermionoid:继续你的研究,你才刚刚开始。跟随 Stackover 线索,Jeff 在这里有一些信息:Programming Is Hard, Let's Go Shopping!
  • @hakre 有没有更好的标记语言?我听说 BBCode 不安全,我真的不想发明自己的 :)
  • @fermionoid:根据定义,没有什么是安全的。反之亦然。解决方案的保护取决于实施。
  • @zerkms,好的,嗯..你觉得昆汀的回答怎么样?我的解释是否意味着剥离除白名单之外的标签是否正确?

标签: php markdown


【解决方案1】:

您需要大约投资。一到两周的正确编码并完成一些 tagoup 解析器/处理程序,可以清理传入的 HTML(通过 Markdown)。

我强烈建议采用三遍验证和处理方案:

  1. 混合模式:将作为 Markdown 文档一部分的传入 HTML 标记列入白名单。
  2. Markdown 解析器:将 Markdown 转换为 HMTL
  3. HTML 模式:将作为 HTML 文档的 HTML 标记列入白名单。

然后你就可以输出了。存储 Markdown 源和“支持”的 HTML 数据,这样您就不需要为每个显示操作都这样做。

【讨论】:

  • 好的,那么如何使用 htmlpurifier 来删除非法属性等?
  • 您可以在步骤 3 中使用 Htmlpurifier。)。已经做好了 IIRC 的所有工作。它检查这些“非法”属性和等部分。顺便说一句,源是开放的..
  • 对,所以我有 #1 作为 Pagedown 对吗?我还有一个包可以将 markdown 转换为 html,然后将 strip_tags 和 htmlpurifier 用于#3。但是昆汀发布的列表是否合适,或者我可以从中添加或删除任何其他标签吗?
  • 好吧,我不知道 Pagedown,但 Pagedown 可能也遵循类似的三步模式 - 只是在客户端。我这里的列表是通用的,您可以在客户端服务器上实现它。所以在服务器上,步骤 1.) 也需要运行,你不能假装步骤 1.) 已经在客户端运行。不,整个过程需要在每一侧运行,只需三个步骤。所以#1 已经从输入中删除了所有无效的 HTML 标签 before #1 中的非 HTML markdown 部分将被转换为 HTML。 #3 只注意 #2 不让漏洞利用。
  • 那么这让我回到了如何使用 PHP 脚本将 html 转换为标记的问题......
【解决方案2】:

Markdown 允许在其中包含任意 HTML。由于这包括 <script> 元素,因此您可以拥有有效的 Markdown,这也是 XSS 攻击。

通过 Markdown 解析器运行传入数据以获取 HTML,然后将其视为任何其他用户提交的 HTML(通过应用 a whitelist to the elements and attributes 的 HTML 解析器传递它)。

【讨论】:

  • 所以我应该接受传入的客户端验证 Markdown,然后去除不在白名单上的标签?
  • @fermionoid:这就是白名单的定义,是的。 en.wikipedia.org/wiki/Whitelist
  • @hakre,好的,我试试看。
  • 没有。接受传入的 markdown,使用 markdown 解析器将其转换为 HTML,然后将白名单应用于元素 和属性。如果您还允许onclick,则允许<a> 没有好处。
  • 好的,我现在明白了,但是如何删除属性? htmlpurifier 会起作用吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-12-14
  • 2016-11-02
  • 1970-01-01
  • 2012-01-25
  • 1970-01-01
  • 2012-07-26
  • 2013-01-10
相关资源
最近更新 更多