HTML 或脚本不可能蒙混过此正则表达式!不要使用正则表达式寻找无效字符并在发现这种无效字符后拒绝请求,因为轻易出现漏掉的情况。第二种防范措施是对所有作为输出的输入进行 HTML 编码。这会减少危险的 HTML 标记,使之变成更安全的转义符。您可以在 ASP.NET 中使用 HttpServerUtility.HtmlEncode,或者在 ASP 中使用Server.HTMLEncode 转义任何可能出现问题的字符串。
4. 不要请求 sa 权限
我们要讨论的最后一种输入信任攻击是 SQL 插入代码。许多开发人员编写这样的代码,即获取输入并使用该输入来建立 SQL 查询,进而与后台数据存储(如 Microsoft SQL Server 或 Oracle)进行通信。
请看以下代码片段:
void DoQuery(string Id) { SqlConnection sql=new SqlConnection(@"data source=localhost;" + "user id=sa;password=password;"); sql.Open(); sqlstring= "SELECT hasshipped" + " FROM shipping WHERE id='" + Id + "'"; SqlCommand cmd = new SqlCommand(sqlstring,sql); ... }
这段代码有三个严重缺陷。首先,它是以系统治理员帐户 sa 建立从 Web 服务到SQL Server的连接的。不久您就会看到这样做的缺陷所在。第二点,注重使用“password”作为 sa帐户密码的聪明做法!但真正值得关注的是构造 SQL 语句的字符串连接。假如用户为 ID 输入 1001,您会得到如下 SQL 语句,它是完全有效的。
SELECT hasshipped FROM shipping WHERE id = '1001'
但攻击者比这要有创意得多。他们会为 ID 输入一个“'1001' DROP table shipping --”,它将执行如下查询:
SELECT hasshipped FROM shipping WHERE id = '1001' DROP table shipping -- ';
这时您也许会觉得希奇,怎么任何一个用户都能删除 SQL Server 数据库中的表呢。当然,您是对的,只有治理员才能做这样的工作。但这里您是作为 sa 连接到数据库的,而 sa 能在 SQL Server 数据库上做他想做的任何事。永远不要在任何应用程序中以 sa连接 SQL Server;正确的做法是,假如合适,使用 Windows 集成的身份验证,或者以一个预先定义的具有适当权限的帐户连接。