我在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进行编码的正确语法是什么?
答案 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是否转义HTMLescapeJavaScript
false false false Boolean是否要转义JavascriptescapeXml
false false false Boolean是否转义XMLvalue
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,则打印'默认值'。