php - 从 XSS 中清除 Markdown

标签 php html xss markdown code-injection

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

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

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

我读了this article关于 Markdown 的 XSS 漏洞。我找到的唯一解决方案是在我的脚本提供的每个输出之前使用 HTML_purifier。

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

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

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

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

htmlspecialchars(strip_tags($text));

我想到了另一种解决方案:

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

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

有人有什么建议吗?

最佳答案

  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;

关于php - 从 XSS 中清除 Markdown,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14914896/

相关文章:

php - Laravel Socialite 传递和检索自定义数据?

javascript - 将 PHP 数组发送到 JS 模块, "import"问题

php - 语句不检查 php mysql 中的电子邮件值

go - 在Golang中实现XSS防护

javascript - 检查输入并将其转换为适当的类型以防止 XSS

php - 如何在 Cake 3 的表模型文件中设置数据源?

javascript - 在我的 Django TextField 中使链接可点击

javascript - 如果按钮反复隐藏和显示,它会失去它的 onclick 监听器吗

javascript - 如何在 javascript 中验证和限制数字数据的 asp.net 文本框控件的长度?

svg - 用户上传的 .svg 是否存在 XSS 风险?你怎么能 "sterilize"SVG?