ASP 站点最常被攻击的两类漏洞就是 SQL 注入与 XSS。前者源于把用户输入直接拼进 SQL,后者源于把不可信内容直接输出。把过滤逻辑收敛成两个函数并强制使用,是低成本的基础防护。

实现思路

SqlSafe 把输入中的单引号全部翻倍,使输入无法闭合 SQL 语句;HtmlSafe 基于 Server.HTMLEncode 转义尖括号与引号。取参、写 SQL、输出三步全部走这两个函数。

完整代码

<%@ Language="VBScript" CodePage=65001 %>
<%
Option Explicit

Rem SQL 注入过滤:把单引号翻倍
Function SqlSafe(v)
    If IsNull(v) Or v = "" Then
        SqlSafe = ""
    Else
        SqlSafe = Replace(CStr(v), "'", "''" )
    End If
End Function

Rem 输出过滤:HTML 特殊字符编码
Function HtmlSafe(v)
    HtmlSafe = Server.HTMLEncode(CStr(v))
End Function

Rem 使用示例
Dim kw, uid
kw = SqlSafe(Request("keyword"))
uid = SqlSafe(Request("uid"))

Response.Write HtmlSafe(kw)
Response.Write HtmlSafe(uid)
%>

说明与边界

  • 数字型参数建议再加 IsNumeric 校验,否则仍可能被绕过;
  • 翻倍法只是基础防护,凡是可预编译的场景都应优先用 ADO Command 参数化;
  • HtmlSafe 用于正文外的输出,富文本内容请按白名单标签过滤。

小结

输入防注入、输出防 XSS,两条线都封住后老站点的常见漏洞面就大幅缩小,改造时重点排查历史代码里直接拼接 Request 的位置。