存储过程之外:SQL注入深入防御
日期:2007年9月18日 作者: 查看:[大字体 中字体 小字体]- { // We allow only alphanumeric input Regex allowRegex = new Regex(“^[a-zA-Z0-9]*$”); if ((!allowRegex.IsMatch(textBoxUserId.Text)) (!allowRegex.IsMatch(textBoxPassword.Text))) { labelErrorMessage.Text = “Invalid user ID or password.”; return; } else { // Call the login stored procedure … } } }
一个更加彻底的深入防御策略是使用一个允许输入联合模式(也被认为是“优选名单”)和拒绝输入模式(或者称为”黑名单”)。用户的输入必须匹配优选名单模式(或者说至少一个优选名单模式,如果不多于一个的话)而且不和黑名单模式匹配(或者说任何黑名单模式)。如果在你的允许输入表中允许类似省略号这样的非字符输入,在深度防御策略中,你应该明确的使用黑名单模式。
// We allow alpha characters, spaces, and apostrophes as input Regex allowRegex = new Regex(@“^[a-zA-Z\s\’]*$”); // But we disallow common SQL functions Regex disallowRegex = new Regex(“(unionselectdropdelete)”); if ((!allowRegex.IsMatch(textBoxLastName.Text)) (disallowRegex.IsMatch(textBoxLastName.Text))) { labelErrorMessage.Text = “Invalid name.”; return; }
最后,我们必须论及加入损害控制到你的深入防御策略。如果一个黑客真的找到了一个对你的数据库执行SQL命令的途径,他可能会造成什么样的损害呢?如果你的应用程序作为一个管理员用户连接到数据库,象Microsoft SQL Server的”sa”用户,损害甚至会很严重。他不仅仅能看表中的数据,他也能增加他自己的新数据或者改变已经存在数据的值。设想一个在线购物站点,所有的商品项目价格标成低于一个美分。他能够增加新的用户或者删除已经存在用户。他能删除行,表或者甚至整个数据库。你能通过应用最少权限原则到你的深入防御策略减轻这个风险:使你的应用软件作为一个只有足够执行必需动作的许可,而没有其它更多的许可。如果你的应用程序只是从一个数据库中读数据,去掉数据库用户插入,更新和删除的许可。如果应用程序只需要对一个产品目录数据库进行存取(举例来说),确保用户不能存取定购历史数据库。永远不要指定”sa”或者任何管理员用户作为数据库用户。
下一篇:强烈推荐,MySQL服务维护笔记
