使用Primefaces inputText小部件时如何解码文本?

时间:2014-10-01 16:25:41

标签: jsf primefaces encoding xss

我正在尝试将XSS预防功能添加到我的JSF / primefaces系统中。从参考http://www.ibm.com/developerworks/library/se-prevent/开始,我理解它应该如何完成的方式是:

  1. 数据在后端保存原样(即解码)。例如,“alert(/ xss /)”
  2. 当显示为输出时,Web服务器(在jsf情况下,托管bean)将对字符进行编码。例如,“< script> alert(/ xss!/)< / script>”
  3. 浏览器将下载编码脚本并将其转换回解码方式。例如,“alert(/ xss /)”。 要在JSF中实现这一点,我需要设置outputText属性escape =“false”,否则它将转义字符,因为这是默认行为。
  4. 除了必须在我的所有小部件中显式设置escape =“false”之外,这个解决方案似乎也有效。但是,问题来自于我没有从我的bean读取outputText小部件,而是使用inputText,它将始终保持编码字符串来自托管bean,并且永远不会将其解码回来。

    我有什么想法可以解决这个问题吗?

1 个答案:

答案 0 :(得分:2)

你似乎有一个重大的误解。 IBM的这篇文章明确针对的是普通香草&#34;实际上没有任何形式的自动XSS预防的JSP应用程序(即使你在JSP中更好地只使用JSTL <c:out> or fn:escapeXml()而不是文章所写的那些笨拙)。但是,JSF已经内置了自动XSS预防功能,特别是当与Facelets一起用作视图技术而不是其前身JSP时。

您首先应该在后端手动解码它。停止步骤#1将解决所有问题;你不再需要escape="false"输出以防止双重转义,你不必担心输入中的正确表示。在JSF中,当您使用escape="false"重新显示用户控制的输入时,默认情况下一切都是XSS安全之外。

总而言之,IBM的文章对现代Java Web应用程序来说是垃圾。作者似乎有十年历史的JSP,其中包含 scriptlets

另见: