应用程序从数据库或其他后端数据存储获取不可信赖的数据,在未检验数据是否存在恶意代码的 情况下,便将其传送给了 Web 用户,应用程序将易于受到存储型 XSS 攻击。
对于预防存储型 XSS 的情况,示例给出了不规范用法(Java 语言)示例。
- 示例:
-
- <% .
-
- Statement stmt = conn.createStatement();
-
- ResultSetrs = stmt.executeQuery("select * from users where id ="+ id);
-
- String address = null;
-
- if (rs!= null){
-
- rs.next();
-
- address = rs.getString("address");
-
-
-
- %>
-
- 家庭地址:<%= address %〉
上面 JSP 代码片段的功能是根据一个已知雇员ID(eid)从数据库中查询出该雇员的姓名,并显示 在JSP 页面上。
如果 name 的值是由用户提供的,且存入数据库时没有进行合理的校验,那么攻击者就可以利用上 面的代码进行存储型 XSS 攻击。
为了避免存储型XSS 攻击,建议采用以下方式进行防御:
a) 与预防反射型 XSS 相同,对用户的输入进行合理验证(如年龄只能是数字),对特殊字符(如 〈、〉、"以及