存储型 XSS与修复

问题:
应用程序从数据库或其它后端数据存储获取不可信赖的数据,在未检验数据是否存在恶意代码的情
况下,便将其传送给了 Web 用户,应用程序将易于受到存储型 XSS 攻击。
例如:下面 JSP 代码片段的功能是根据一个已知雇员 ID ( eid )从数据库中查询出该雇员的姓名,并显示
在 JSP 页面上。
<%...
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("select * from emp where id="+eid);
if (rs != null) {
rs.next();
String name = rs.getString("name");
%>
Employee Name: <%= name %>
如果 name 的值是由用户提供的,且存入数据库时没有进行合理的校验,那么攻击者就可以利用上面的
代码进行存储型 XSS 攻击。
修复:
为了避免存储型 XSS 攻击,建议采用以下方式进行防御:
( 1 )对用户的输入进行合理验证(如年龄只能是数字)。
( 2 )根据数据将要置于 HTML 上下文中的不同位置( HTML 标签、 HTML 属性、 JavaScript 脚本、 CSS 、
URL ),对所有不可信数据进行恰当的输出编码。
( 3 )设置 HttpOnly 属性,避免攻击者利用跨站脚本漏洞进行 Cookie 劫持攻击。在 Java EE 中,给 Cookie
添加 HttpOnly 的代码如下:
...
response.setHeader("Set-Cookie","cookiename=cookievalue; path=/; Domain=domainvaule; Max- age=
seconds; HttpOnly");
安全参考:
CWE(79):Improper Neutralization of Input During Web Page Generation ('Cross-site Scripting')
CWE(80):Improper Neutralization of Script-Related HTML Tags in a Web Page (Basic XSS)
OWASP TOP 10(A3):Cross-Site Scripting (XSS)
OWASP TOP 10(A2):Cross-Site Scripting (XSS)
OWASP TOP 10(A1):Cross Site Scripting (XSS)
OWASP TOP 10(A4):Cross Site Scripting
SANS TOP 25(SANS 2011):Insecure Interaction - CWE ID 079
SANS TOP 25(SANS 2010):Insecure Interaction - CWE ID 079
SANS TOP 25(SANS 2009):Insecure Interaction - CWE ID 079
ISO/IEC():Application Vulnerabilities Cross-site Scripting [XYT]