我有一个包含图片和文字的html字符串。渲染时,我只想呈现文本而不是图像。
我试着这样做:
<h:outputText escape="false" value="#{fn:replace(answerBlock.content,'<img>','')}" />
但这会返回一个格式错误的HTML,然后在屏幕上呈现。
如何跳过img标签并在jsf中渲染文本?
答案 0 :(得分:5)
不要使用字符串或正则表达式函数来操纵用户控制的HTML。 XSS攻击漏洞的风险在这个特定的例子中非常大,因为并未涵盖所有方面(例如<script>
,onclick
等)。只需使用一个知道XSS含义的真正的HTML解析器。例如Jsoup也有whitelist sanitizer feature。
String sanitizedHtml = Jsoup.clean(dirtyHtml, Whitelist.basic());
然后显示:
<h:outputText value="#{bean.sanitizedHtml}" escape="false" />
要提高性能,请考虑仅解析一次并将数据库与原始数据一起保存。
答案 1 :(得分:0)
我会向你的answerBlock
bean添加代码。类似的东西:
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} />