从XSS消除Markdown

Fez*_*sta 3 html php xss markdown code-injection

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

我需要在数据库中存储markdown文本,而不是HTML转换版本,因为用户可以编辑他们的帖子.

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

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

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

所以我试图从XSS漏洞中找到一个清理消毒的解决方案来消除输入而不是输出.

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

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

htmlspecialchars(strip_tags($text));
Run Code Online (Sandbox Code Playgroud)

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

当用户尝试提交新帖子时:将输入从Markdown转换为HTML,运行HTML_purifier,如果发现某些XSS注入,则只返回错误.但我不知道如何制作这个,也不知道HTML_purifier是否允许它.

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

有人有什么建议吗?

nic*_*ass 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;
Run Code Online (Sandbox Code Playgroud)

  • @FezVrasta没有机会.有许多方法可以避免使用字符串"javascript" - https://www.owasp.org/index.php/XSS_Filter_Evasion_Cheat_Sheet.此外,您甚至无法使用正则表达式解析HTML. (3认同)
  • 你怎么知道他正试图破解你?这是默默无闻的安全.您最终可能会阻止合法用户.如果SO阻止我发布上面的代码怎么办? (3认同)