【问题标题】:Primefaces confirmDialog with line break and XSS fearsPrimefaces confirmDialog 带有换行和 XSS 恐惧
【发布时间】:2020-01-27 22:06:18
【问题描述】:

我有一个使用 primefaces 进行确认操作的命令按钮:

<p:commandButton value="Test"
    rendered="..."
    action="#{controller.actionMethod(param)}">
    <p:confirm header="Confirmation" escape="false" message="This is a really long message test &lt;br/&gt; 
        This is a really long message test."/>
</p:commandButton>

我了解到关闭转义是一个潜在的 XSS 攻击漏洞,因此我正在尝试在消息中不使用换行符的情况下解决此问题(并允许 escape=true)

confirmDialog 是全局的:

<p:confirmDialog global="true" showEffect="fade" hideEffect="fade">
    <p:commandButton value="Yes"
        type="button" styleClass="ui-confirmdialog-yes" icon="ui-button-icon-left ui-icon ui-c ui-icon-check" />
    <p:commandButton value="No"
        type="button" styleClass="ui-confirmdialog-no" icon="ui-button-icon-left ui-icon ui-c ui-icon-close" />
</p:confirmDialog>   

我已经尝试使用预换行来使用样式,但我没有运气。我在追求一个非问题吗?这真的是 XSS 漏洞吗?

【问题讨论】:

  • 这能回答你的问题吗? Newline in <p:confirm message>
  • 与@JasperdeVries 一起使用escape="false" 回答是可以的,只要您知道该框中的内容即可。如果是用户输入的数据,你永远不会想使用 escape="false" 但如果你总是内容的作者,那没关系,这正是 escape="false" 的用途。
  • @Melloware - 这些对话框完全由开发者控制,没有任何输入。
  • 那就不用担心使用 escape="false"。

标签: jsf primefaces


【解决方案1】:

在消息中引入换行符的更好方法是使用 facet 作为described here。这样你就可以摆脱这种 XSS 大惊小怪了。

<p:confirmDialog header="Confirmation">
    <f:facet name="message">
        Are you sure you want to continue?<br/>Yes or no?
    </f:facet>
</p:confirmDialog> 

如果你想走这条路,假设你使用 Prime Faces 7 在documentation manual 中多次给出转义属性而没有任何 XSS 警告。当我从用户那里获得文本输入而不是按钮输入时,我会更担心 XSS。

【讨论】:

  • 在未转义的输出中使用来自“不受信任的来源”的输入时,XSS 很危险。因此,在您的两种方法(= 来自重复的 Q)中,与 Q 中的代码一样存在风险跨度>
  • 正如我在答案中所写,它仅适用于按钮输入。如果输入是“文本输入”,我同意你的看法。
猜你喜欢
  • 2013-05-16
  • 2012-09-04
  • 1970-01-01
  • 1970-01-01
  • 2014-03-16
  • 1970-01-01
  • 2014-08-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多