我在 HP Fortify 中扫描了我的应用程序并遇到问题
Cross-Site Scripting: Poor Validation
。我正在使用 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
适当的语法如下所示:
<html lang="${myVar}">
在您的情况下,请使用
<%@ taglib uri="/WEB-INF/tld/esapi.tld" prefix="esapi" %>
<html lang="<esapi:encodeForHTMLAttribute>${myvar}</esapi:encodeForHTMLAttribute>">
,因为您动态获取的值将被插入到标签上的“name”属性中。 如果要说,在 p 标签中,您会使用
HTMLAttribute
。 esapi:encodeForHTML
此外,如果该值将由渲染时的 JavaScript 函数接收,
<p>
<esapi:encodeForHTML>${myVal}</esapi:encodeForHTML>
</p>
。
编码总是有一个适当的上下文,并且上下文由以下问题回答:“什么样的解释器将首先接收此数据?”
=================================================
我说得不够明确。 我提供的示例仅在听起来像是作为原始 HTML 存储时才会转义 HTML 属性。上面的一般示例已被重新设计。
使用您的示例,尝试:
esapi:encodeForJavaScript
我习惯了 JSTL 语法,所以我不能 100% 确定在此处包装变量的最佳方法。 你必须玩它。 或者,您可以向
<form method='post' name='<s:property value=<esapi:encodeForHTMLAttribute>'tableBean.formName'<esapi:encodeForHTMLAttribute>/>' action='Notification.action'>
添加一个方法,例如
tableBean
,如下所示:tableBean.attributeEscapedFormName
public class TableBean{
String formName;
public String htmlAttributeEscapedFormName(){
return ESAPI.encoder().escapeForHTMLAttribute( formName );
}
}
标签
参考以更好地了解如何使用它。用于获取某个值的属性,默认为顶部 如果未指定则堆栈。参数
允许的动态属性:
property
默认 如果 value 属性为false
,则使用的值
null
- false false false Boolean 是否转义 CSV(对于转义列的值很有用)
escapeCsv
- false true false Boolean 是否转义 HTML
escapeHtml
- false false false Boolean 是否转义Javascript
escapeJavaScript
- false false false Boolean 是否转义XML
escapeXml
- false false 要显示的对象值
示例:
value
示例 1 打印<s:push value="myBean"> <!-- Example 1: --> <s:property value="myBeanProperty" /> <!-- Example 2: -->TextUtils <s:property value="myBeanProperty" default="a default value" /> </s:push>
的
的结果 方法。 示例 2 打印myBean
的getMyBeanProperty()
的结果 方法,如果是myBean
,则打印“默认值”。getMyBeanProperty()