应用程序通过 Web 请求获取不可信赖的数据,在未检验数据是否存在恶意代码的情况下,便将其传 送 给 了Web用户,应用程序将易于受到反射型XSS攻击 。
对于预防反射型 XSS 的情况,示例给出了不规范用法(Java 语言)示例。
示例:下面JSP代码片段的功能是从 HTTP 请求中读取雇员的ID(eid),并将其显示给用户。
<% String name= request.getParameter("username");%>
姓名:<%= name%>
如果 name 里有包含恶意代码,那么 Web 浏览器就会像显示 HTTP 响应那样执行该代码,应用程序将受到反射型 XSS 攻击。
为了避免反射型 XSS 攻击,建议采用以下方式进行防御:
a)对用户的输入进行合理验证(如年龄只能是数字),对特殊字符(如〈、〉、、"以及<script〉、javas- cript 等)进行过滤。
b)根据数据将要置于 HTML上下文中的不同位置(HTML标签、HTML 属性、JavaScript 脚本、CSS、URL), 对所有不可信数据进行恰当的输出编码。
例如:采用 OWASP ESAPI对数据输出 HTML 上下文中不同位置,编码方法如下。
//HTML encode
ESAPL.encoder(),encodeForHTML("inputData");
//HTML attribute encode
ESAPL.encoder().encodeForHTMLAttribute("inputData");
//JavaScript encode
ESAPI.encoder(),encodeForJavaScript("inputData");
//CSS encode
ESAPLencoder().encodeForCSS("inputData");
//URL encode
ESAPI,encoder(),encodeForURL("inputData");
c)设置 HttpOnly 属性,避免攻击者利用跨站脚本漏洞进行Cookie劫持攻击。在Java EE中,给Cookie 添加 HttpOnly 的代码如下:
response
response.setHeader("Set-Cookie"," cookiename = cookievalue; path=/; Domain = domainvaule; Max- age = seconds; HttpOnly");
.setHeader("Set-Cookie"," cookiename = cookievalue; path=/; Domain = domainvaule; Max- age = seconds; HttpOnly");