3

私は Markdown を使用して、フォーラム スクリプトでユーザーに投稿を書き込む簡単な方法を提供しています。
すべてのユーザー入力をサニタイズしようとしていますが、Markdown の入力に問題があります。

ユーザーは投稿を編集できるため、HTML に変換されたバージョンではなく、マークダウン テキストをデータベースに保存する必要があります。

基本的に、StackOverflow のようなものが必要です。

Markdown の XSS 脆弱性に関するこの記事を読みました。そして、私が見つけた唯一の解決策は、スクリプトが提供するすべての出力の前に HTML_purifier を使用することです。

これによりスクリプトが遅くなる可能性があると思います.20の投稿が出力され、それぞれに対してHTML_purifierが実行されると思います...

そのため、出力ではなく入力をサニタイズする XSS 脆弱性からサニタイズするためのソリューションを見つけようとしていました。

テキストが HTML ではなく Markdown であるため、入力に対して HTML_purifier を実行できません。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 に答える