先介绍一个常见场景:当用户在你的表单中填写大量内容,尤其是地址、文章正文这类长文本且无固定格式的输入项时,你是否担心他们会插入恶意代码?答案是肯定的。有些人可能会直接嵌入一段JavaScript代码,等待页面执行,从而引发跨站脚本攻击(XSS)。
那么,如何有效防范?下面逐步拆解应对策略。
STEP1:从入口处严格管控
首先,在设计层面就要打好基础。对于输入项,凡是能检测格式的,尽量进行格式校验;能限制长度的,切勿手软。服务端检测必须作为核心防线——永远不要依赖客户端验证,它只能起到辅助作用。数据库设计时,字段长度也要严格限定,避免给用户留下“发挥空间”。
但最关键的一步,是在输出页面时进行HTML转码。例如,当你输出一个地址字段时,代码通常如下:
<%=convert.html(cus.getAddress())%>
转码函数的具体实现示例:
public static String html(String content) {
if(content==null) return "";
String html = content;
html = html.replaceAll( "&", "&"); // 替换&号
html = html.replace( "\"", """); // 替换双引号
html = html.replace( "\t", " ");// 替换跳格
html = html.replace( " ", " ");// 替换空格
html = html.replace("<", "<");
html = html.replaceAll( ">", ">");
return html;
}
这里需要特别强调:很多人习惯在数据入库时进行HTML编码,但这实际上不符合安全规范。正确的做法是在“出库”时执行转码——即数据被输出到HTML页面之前才进行编码。如果输出的载体不是HTML页面(例如用户控件),则无需进行HTML转码。
真正棘手的场景,是那些需要允许用户输入HTML,同时又必须过滤掉其中脚本的情况。此时,可以使用Tidy这类HTML清理库来处理。不过,这属于另一个话题,本文暂不展开讨论。
STEP2:全面检测
这一步主要是对用户输入内容在展示到页面时,进行一次全面扫描。具体来说,就是对照上述“危险操作清单”逐项排查,确保所有潜在风险点都被识别。
STEP3:记录检测结果
将检测到的每个问题逐条记录下来,形成清晰的记录表。这份记录表是后续修复工作的依据,确保不遗漏任何隐患。
STEP4:根据检测结果进行修复
根据记录表中的问题逐一修复,同时在表中记录修复结果。修复完成后,务必标记清楚,方便后续追踪。
STEP5:复测验证
修复并非终点,复测才是关键。在记录表中记录复测结果,确保所有隐患都已彻底清除。
遵循这一套流程,XSS攻击的入口基本就被堵死了。方法简单,但行之有效。
