PHP 用の「安全な」マークダウン プロセッサ?
-
23-08-2019 - |
質問
パブリックコメントでの使用に適したマークダウンの PHP 実装はありますか?
基本的に、マークダウン構文のサブセット (太字、斜体、リンク、ブロック引用符、コードブロック、リスト) のみを許可し、すべてのインライン HTML を削除する (またはエスケープする可能性があります)。
1 つのオプションは、通常のマークダウン パーサーを使用し、HTML サニタイザーを通じて出力を実行することだと思いますが、これを行うより良い方法はありますか?
サイトの残りの部分では PHP Markdown Extra を使用しているため、すでに 2 番目のパーサー (脚注のサポートなどは不要なため、非「Extra」バージョン) を使用する必要があります。また、 *bold*
テキストとすべてをエスケープする <a href="etc">
, 、生成するよりも <b>bold</b>
テキストを削除して、不要な部分を削除しようとしています。
また、これに関連して、「メイン」サイトには WMD コントロールを使用していますが、コメントには他にどのようなオプションがありますか?WMD の JavaScript プレビューは優れていますが、PHP マークダウン プロセッサと同じ「無効化」が必要になります (画像などを表示できません。そうしないと、誰かが送信して、作業中のマークダウンが「壊れて」しまいます)。
現在の私の計画は、PHP マークダウン -> HTML サンタイザーメソッドを使用し、WMD を編集して画像/見出し構文を削除することです。 showdown.js
- しかし、これはこれまでに数え切れないほど行われているようです..
基本的に:
- PHP には「安全な」マークダウン実装はありますか?
- 同じオプションを簡単に無効にできる HTML/JavaScript マークダウン エディタはありますか?
アップデート: 結局単に実行するだけになりました markdown()
出力スルー HTML ピュリファイアー.
この方法では、Markdown レンダリングが出力サニタイズから分離され、非常にシンプルになり (ほとんど変更されていない 2 つのコード ベース)、より安全になり (レンダリングとサニタイズを同時に実行しようとしない)、より柔軟になります (複数のサニタイズが可能)レベル、たとえば、信頼できるコンテンツの場合はより緩やかな構成、パブリック コメントの場合はより厳格なバージョン)
解決
PHP値下げは、消毒剤の選択肢を持っていますが、どこでも宣伝されていないようです。 (バージョン1.0.1mにライン191で開始)Markdown_Parser
にmarkdown.php
クラスのトップを見てみましょう。
# Change to `true` to disallow markup or entities.
var $no_markup = false;
var $no_entities = false;
あなたは、それぞれ、true
、マークアップとエンティティにそれらを変更する場合は、、エスケープよりもむしろ逐語的に挿入する必要があります。そこ(コンストラクタを介して、例えば)これらを変更するには、任意の組み込みの方法ではありませんが、あなたは常に1を追加することができます:
function do_markdown($text, $safe=false) {
$parser = new Markdown_Parser;
if ($safe) {
$parser->no_markup = true;
$parser->no_entities = true;
}
return $parser->transform($text);
}
上記の関数ではなく提供Markdown
関数のように(ライン43-56)し、それをキャッシュするよりも、すべてのランに新しいパーサを作成することに注意してください、それが遅い側のビットであるかもしれない。
他のヒント
JavaScript マークダウン エディターの仮説:
- JavaScript 駆動のマークダウン エディターを使用する (例: ショーダウンに基づく)
- ツールバーから不要なアイテムのアイコンと視覚的な手がかりをすべて削除します。
- 送信時に不要なマークアップをクリーンアップするための JavaScript フィルターを設定する
- すべての JavaScript の変更とフィルターをコンピューター上でローカルにテストして強化します。
- これらのフィルターを PHP 送信スクリプトでミラーリングして、サーバー側で同じものをキャッチします。
- ヘルプ/チュートリアルから不要な項目への参照をすべて削除します。
JavaScript で Markdown エディターを作成しましたが、機能が強化されました。それにはかなりの時間と SVN の改訂がかかりました。しかし、Markdown エディターを変更して、許可される HTML を制限するのは、それほど難しいことではないと思います。
あなたがあなた自身のパーサを書くために探しているなら、なぜBBコードアーキテクチャを使用しています。
あなた/(ユーザー)を提出する場合は、あなたが、mysql_escape_real_string()でテキストをサニタイズするには、yesそこに他の機能を必要とするが、これは任意のJS注入を停止しますコメントます。
どのように値下げを通してそれを処理する前に、ユーザが入力した入力にはhtmlspecialcharsを実行しているでしょうか?それは危険な何かを逃れるが、値下げは理解し、すべてを残す必要があります。
私はこれが働かない場合を考えるようにしようとしているが、手オフ何も考えていないことができます。