クライアントが php4 を使用していて、PEAR を使用していないように見える状況があります。vBulletin の BBCode システムで動作する確立された PHP BBCode パーサーはありますか?
BBCode を HTML に変換するだけです。これは vBulletin から新しいプラットフォームへのデータ移行であるため、vBulletin の BBCode パーサーを使用できません。
ドキュメント:
クライアントが php4 を使用していて、PEAR を使用していないように見える状況があります。vBulletin の BBCode システムで動作する確立された PHP BBCode パーサーはありますか?
BBCode を HTML に変換するだけです。これは vBulletin から新しいプラットフォームへのデータ移行であるため、vBulletin の BBCode パーサーを使用できません。
ドキュメント:
'個体'?堅実な BBcode パーサーをまったく見つけたことがありません。それらはすべて、HTML インジェクション攻撃を許可するようにだまされやすい、不注意な正規表現の緩いコレクションのようです。
たとえば、John W が投稿したものは、次のようないくつかのタグで明らかに悪用される可能性があります。
[img]xxx" onerror="alert('JS injection!')[/img]
さらにjavascript:
、他の危険な URL を&
許可し、エスケープに失敗し、多くの URL 文字 ( %
! を含む) を許可しない一方で、誤って許可してはならない他の文字を許可します (作成者は、文字列内のバックスラッシュエスケープがそこで何をしているのかを完全には理解していません)。誤ってネストされたタグや誤って他のタグの属性に吸い込まれたタグを禁止することはできません... 基本的に、これは安全でない混乱であり、これは bbcode パーサーのコースに匹敵します。
役に立たない回答で申し訳ありません(大きすぎてコメントに収まりませんでした)。
ETA re comment: ああ、それは正確には bbcode モジュールではなく、似ているだけです。行ごとに分割し、既存の制御文字を削除し、バイト 01 を のサロゲートとして使用し、 の場合&
は 02 を、 の場合は<
03 を>
使用し、各変換ステップで re.split を使用し(\x02[^\x03]*\x03)
、毎秒 (非タグ) 部分で置換正規表現を実行しました。改行やエモートなどの「最も内側」の置換から始めて、画像からリンク、斜体/太字のマークアップへと外側に向かって挿入\x02html tags\x03
します。最後に HTML エンコード&<>
し、制御コードを に置き換えます&<>
。これにより、マークアップ自体がマークアップされなくなります。これは、単純な正規表現ベースのマークアップにおける脆弱性の大きな原因です。
考えてみれば、私は実際の Python bbcode パーサーも作成しましたが、それは簡単な互換性ハックとしてのみでした。完全な bbcode のすべての機能を提供するわけではありません。特に、範囲タグ (つまり、終了タグを持つタグ) を他の範囲タグ内にネストすることはできませんでした。シングルパス正規表現を使用して任意のタグを照合し、置換関数にタグ名に基づいて置換方法を決定させることができるため、これが受け入れられる場合は比較的簡単に実装できます。例えば。:
\[ (i|b|color|url|somethingelse) \=? ([^]]+)? \] (?: ([^]]*) \[\/\1\] )
(これはVERBOSE
正規表現であるため、空白は読みやすくするためのものです。正規表現がこれまでに読み取れるのと同じくらいです。)
ネスティングを削除すると、コーナー ケースの数が大幅に簡素化されます。
このライブラリは PEAR を必要とせず、インジェクションを防止するためのいくつかのトリックを備えています。
http://www.christian-seiler.de/projekte/php/bbcode/index_en.html