1

我有一个包含图像和文本的 html 字符串。在渲染时,我只想渲染文本而不是图像。

我试图这样做:

<h:outputText escape="false" value="#{fn:replace(answerBlock.content,'&lt;img&gt;','')}" />

但这返回了一个格式错误的 html,然后在屏幕上呈现。

如何跳过 img 标签并仅在 jsf 中呈现文本?

4

2 回答 2

5

不要使用字符串或正则表达式函数来操作用户控制的 HTML。在这个特定示例中,XSS 攻击漏洞的风险非常大,因为并未涵盖所有方面(例如<script>onclick等)。只需使用真正了解 XSS 含义的 HTML 解析器。例如Jsoup,它也有一个白名单清理功能

String sanitizedHtml = Jsoup.clean(dirtyHtml, Whitelist.basic());

然后改为显示:

<h:outputText value="#{bean.sanitizedHtml}" escape="false" />

为了提高性能,请考虑只解析一次并将其与原始数据一起保存在数据库中。

也可以看看:

于 2013-06-06T14:03:32.933 回答
0

我会在你的answerBlockbean 中添加代码。就像是:

public String imageStrippedContent() {
    return stripImgTags( content() );
}

private String stripImgTags( String html ) {
    // strip img tag using dom parser like jtidy, or maybe regex
    ...
}

然后将您的 facelet 修改为:

<h:outputText escape="false" value="#{answerBlock.imageStrippedContent} />
于 2013-06-06T13:58:41.087 回答