3

我使用 Markdown 提供了一种简单的方法来在我的论坛脚本中向我的用户写帖子。
我正在尝试清理每个用户输入,但我对 Markdown 的输入有疑问。

我需要将降价文本存储在数据库中,而不是 HTML 转换版本,因为允许用户编辑他们的帖子。

基本上我需要像 StackOverflow 一样的东西。

我读了这篇关于 Markdown 的 XSS 漏洞的文章。我发现的唯一解决方案是在我的脚本提供的每个输出之前使用 HTML_purifier。

我认为这会减慢我的脚本速度,我想输出 20 个帖子并为每个帖子运行 HTML_purifier ...

所以我试图找到一种解决方案来清理 XSS 漏洞,清理输入而不是输出。

我无法在输入上运行 HTML_purifier,因为我的文本是 Markdown,而不是 HTML。如果我将它转换为获取 HTML,我将无法转换回 Markdown。

我已经删除(我希望)所有 HTML 代码:

htmlspecialchars(strip_tags($text));

我想过另一种解决方案:

当用户尝试提交新帖子时:将输入从 Markdown 转换为 HTML,运行 HTML_purifier,如果发现一些 XSS 注入,它只会返回错误。但我不知道怎么做,也不知道 HTML_purifier 是否允许。

我在那里发现了很多关于同一问题的问题,但所有解决方案都是将输入存储为 HTML。我需要存储为 Markdown。

有人有什么建议吗?

4

3 回答 3

7
  1. 在输入上运行 Markdown
  2. 在 Markdown 生成的 HTML 上运行 HTML Purifier。对其进行配置,使其允许链接、href 属性等(它仍应剥离javascript:命令)

// the nasty stuff :)
$content = "> hello <a name=\"n\" \n href=\"javascript:alert('xss')\">*you*</a>";

require '/path/to/markdown.php';

// at this point, the generated HTML is vulnerable to XSS
$content = Markdown($content);

require '/path/to//HTMLPurifier/HTMLPurifier.auto.php';

$config = HTMLPurifier_Config::createDefault();
$config->set('Core.Encoding', 'UTF-8');
$config->set('HTML.Doctype', 'XHTML 1.0 Transitional');
$config->set('Cache.DefinitionImpl', null);

// put here every tag and attribute that you want to pass through
$config->set('HTML.Allowed', 'a[href|title],blockquote[cite]');

$purifier = new HTMLPurifier($config);

// here, the javascript command is stripped off
$content = $purifier->purify($content);

print $content;
于 2013-02-16T20:48:50.753 回答
1

解决了...

$text = "> hello <a name=\"n\"
> href=\"javascript:alert('xss')\">*you*</a>";


$text = strip_tags($text);

$text = Markdown($text);

echo $text;

它返回:

<blockquote>
  <p>hello  href="javascript:alert('xss')"&gt;<em>you</em></p>
</blockquote>

并不是:

<blockquote>
  <p>hello <a name="n" href="javascript:alert('xss')"><em>you</em></a></p>
</blockquote>

所以似乎它strip_tags()确实有效。

合并:

$text = preg_replace('/href=(\"|)javascript:/', "", $text);

整个输入应该从 XSS 注入中清除。如我错了请纠正我。

于 2013-02-16T23:08:14.367 回答
0

Markdown 的 html 输出仅取决于 md 解析器,因此您可以

  1. 将您的 md 转换为 html,并在此之后对 html 进行清理,如下所述:

    逃离 XSS 漏洞维护 Markdown 语法?

  2. 或者你可以修改你的 md 解析器来检查每个进入 html 属性的参数是否有 xss 的迹象。Ofc 你应该在解析之前转义 html 标签。我认为这个解决方案比其他解决方案快得多,因为通过简单的文本,您通常应该只检查图像和链接的 url。
于 2013-08-30T02:10:05.660 回答