2

Mako テンプレートでいくつかの UGC ( ) を出力するとき、mako フィルタ 'h' を使用してコンテンツをサニタイズし、改行の代わりにいくつかのタグを$user.text追加して、少し書式設定を行いたいと思います。<br>

しかし、mako は「h」フィルタを適用した順序を無視しているようで、<br>タグはエスケープされてレンダリングされません。

これは私のBR追加フィルターです:

<%
def nl2br(str):
    return str.replace("\n", "<br/>")
%>

これは私のテスト文字列です:

hello,

My name is

James

次のフィルタ付き mako タグ:

${user.text | n,h,nl2br}
${user.text | n,nl2br,h}

<br>...タグがエスケープされた同じ html を生成します。

hello,
&lt;br/&gt;
&lt;br/&gt;My name is
&lt;br/&gt;
&lt;br/&gt;James

<br>タグがエスケープせずに通過できるようにする唯一の方法は、次のように「h」フィルターを完全に削除することです。

${user.text | n,nl2br}

しかし、これはフィールドをサニタイズするという目的を無効にしuser.textます。

<br>「h」フィルタを起動してタグを追加するにはどうすればよいですか?

バッファーで何か不足していますか?

4

2 に答える 2

3

Markup.replace表示されている動作は、置換文字列が安全でないと想定しているという事実によるものです。

>>> from markupsafe import マークアップ、エスケープ
>>> e = エスケープ(">x\ny")
>>> へ
マークアップ(u'>x\ny')
>>> e.replace("\n", "<br />")
マークアップ(u'>x<br />y')

解決策は、が信頼されていることを伝えるmarkupsafeことです。<br />

>>> e.replace("\n", Markup("<br />"))
マークアップ(u'>x<br />y')

したがって、nl2brフィルターは次のようになります。

from markupsafe import Markup
def nl2br(s):
    return s.replace("\n", Markup("<br />"))

そして、${user.text|h,nl2br}期待どおりに動作するはずです。

于 2013-02-10T05:46:07.610 に答える
0

上記の注文で何が起こっているのかを理解できなかったので、答えがある場合はここに投稿してください. 代わりに、回避策を使用しました...

このhタグはフィルターの順序で起動するのが遅すぎたので、独自のバージョンを作成し、 を呼び出してクリーンな HTML を返すように強制しました__str__

def early_html_escape(string):
    """Run markupsafe escaping and force the result to string."""
    import markupsafe
    return markupsafe.escape(string).__str__()

これにより、タグが HTML エンティティに変換されることなく、最初に HTML エスケープを介して、次にnl2brフィルターを介してユーザーのテキストを渡すことができました。<br>

${user.text | early_html_escape,nl2br }

それが誰かを助けることを願っています。

于 2013-01-20T17:41:13.523 に答える