我正在获取跨站点脚本:对struts调用bean类的差评

时间:2017-03-20 17:47:53

标签: jsp struts2 xss fortify esapi

我在HP Fortify中扫描了我的应用程序并遇到了跨站点脚本问题:验证不良。我正在使用ESAPI库。我在Struts应用程序上得到了这个发现。

<%@ taglib prefix="s" uri="/struts-tags" %>
<form method='post' name='<s:property value='tableBean.formName'/>' action='Notification.action'>
public String printApplications() throws IOException, ServletException {
    request.setAttribute(TableDisplayBean.TABLE_BEAN, tableBean);
}

使用ESAPI对tableBean.formName进行编码的正确语法是什么?

2 个答案:

答案 0 :(得分:1)

在:

<html lang="${myVar}">

适当的语法如下所示:

<%@ taglib uri="/WEB-INF/tld/esapi.tld" prefix="esapi" %>
<html lang="<esapi:encodeForHTMLAttribute>${myvar}</esapi:encodeForHTMLAttribute>">

在您的情况下,请使用HTMLAttribute,因为您动态获取的值将插入到代码的“name”属性中。如果要说,在p-tag中,您可以使用esapi:encodeForHTML

<p>
<esapi:encodeForHTML>${myVal}</esapi:encodeForHTML>
</p>

此外,如果javascript函数在渲染时收到该值esapi:encodeForJavaScript

编码总是有一个适当的上下文,上下文的问题是“什么样的解释器会先收到这些数据?”

=============================================

我不够明确。我提供的示例仅在HTML属性听起来像是作为原始HTML存放时才会转义。上面的一般例子已经过重新设计。

使用您的示例,尝试:

<form method='post' name='<s:property value=<esapi:encodeForHTMLAttribute>'tableBean.formName'<esapi:encodeForHTMLAttribute>/>' action='Notification.action'>

我习惯使用JSTL语法,所以我不是100%确定在这里包装变量的最佳方法。你必须玩它。或者,您可以向tableBean添加方法,例如tableBean.attributeEscapedFormName,如下所示:

public class TableBean{
    String formName;
    public String htmlAttributeEscapedFormName(){
        return ESAPI.encoder().escapeForHTMLAttribute( formName );
    }
}

答案 1 :(得分:0)

您应该阅读property tag reference以更好地了解如何使用它。

  

用于获取值的属性,默认为顶部   如果没有指定堆栈。参数

     

允许动态属性:false

     

默认值   value属性为null时要使用的值

     
      
  • escapeCsv false false false Boolean是否转义CSV(用于转义列的值)
  •   
  • escapeHtml false true false Boolean是否转义HTML
  •   
  • escapeJavaScript false false false Boolean是否要转义Javascript
  •   
  • escapeXml false false false Boolean是否转义XML
  •   
  • value false false要显示的对象值
  •   
     

示例:

<s:push value="myBean">

 <!-- Example 1: -->
 <s:property value="myBeanProperty" />

 <!-- Example 2: -->TextUtils
 <s:property value="myBeanProperty" default="a default value" /> 
</s:push> 
     

示例1打印myBean的getMyBeanProperty()的结果   方法。   示例2打印myBean的getMyBeanProperty()的结果   方法,如果为null,则打印'默认值'。