赞
踩
跨站点脚本漏洞最有效的解决方案是对用户受影响输出进行 HTML encoding。应用程序应该对:直接源自用户输入的值、可能受用户影响的值、受用户影响的数据存储库值(数据库、日志、文件等)或可能具有的任何其他信息的任何输出进行编码。
这些信息在传输中应该执行净化:替换掉非字母数字的字符,确保数据是展示给用户,而不是在用户的浏览器中被执行
HTML Encoding 可以通过实施自定义 HTML encoder 或者实施第三方 HTML encoder class
潜在的风险非字母数字字符包括
< > ( ) [ ] { } / \ " ' ` ' (Unicode Quote) , . * % & # ; ! ~ * + - = | $ : ? \t (TAB) \n (CrLf-Enter)
代码例子
- public static String htmlEntityEncode(String s) {
- int len = s.length();
- StringBuilder buf = new StringBuilder(len);
-
- for (int i = 0; i < len; i++) {
- char c = s.charAt(i);
- if (c >= 'a' && c <= 'z' || c >= 'A' && c <= 'Z' || c >= '0' && c <= '9') {
- buf.append(c);
- } else {
- buf.append("&#").append((int) c).append(";");
- }
- }
- return buf.toString();
- }
2 验证用户输入 系统应验证所有输入。 输入验证应在服务器端执行,使用postive的方法(将允许的输入限制为出现在白名单中的字符),而不是negative的方法(防止使用出现在黑名单中的字符)。 positive 的方法有助于程序员避免使用恶意字符导致的潜在缺陷。 验证输入时,应按以下顺序执行以下验证: 检查实际输入是否存在;如果 Input 字段是非可选的,则不允许 null 或空输入。 强制输入大小限制:确保输入长度在预期的大小范围内(最大和最小都要考虑)。 检查输入类型:确保接收到的类型是预期的类型,并将输入存储在指定类型的变量(字符串变量)中。 检查输入值范围:验证输入值是否在逻辑兼容值范围的限制范围内。 清理特殊字符:除非有特定的功能需要,否则输入字符集应限制为 [a-z]、[A-Z] 和 [0-9]。 验证输入符合逻辑。(输入年龄的话不能为负数吧。。。) 不要将用户输入嵌入客户端脚本:最初从用户输入派生的值不应直接用作 HTML 脚本 (JS/VBS)、脚本标记或任何其他 HTML 标记或事件的一部分。 写入日志的源自用户的值应在其文档之前进行类似的编码,以防止对通过 Web 界面查看日志的管理用户执行脚本攻击。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。