1.屏蔽所有错误页,使用统一的出错页面。
攻击者开始都根据输入非法的SQL语句,根据页面返回的错误信息来判断后台数据库类型,系统表名等等。因此,我们应该屏蔽掉所有异常的信息。在ASP.NET2.0中,我们可以添加Global.asax文件。在 void Application_Error(object sender, EventArgs e)
方法中添加一下代码:
Server.ClearError();
然而这样会对我们开发造成一定的困扰。因为屏蔽掉所有的异常信息,程序员要定位错误位置将非常困难。因此我们的想法是:在程序开始调试的时候,页面将显示默认的错误信息,在网站发布的时候,页面降屏蔽所有出错信息。我们可以在Web.config中增加一个配置节。
<appSettings>
<add key="ReleaseVersion" value=""/>
</appSettings>
把void Application_Error(object sender, EventArgs e)
改成
if (ConfigurationManager.AppSettings["ReleaseVersion"] == "True")
{
Server.ClearError();
}
这样只要在发布之前把value设置为"True"就可以了。
2.在后台检查所有SQL的参数。
2.1 '|and|exec|insert|select|delete|update|count|*|%|chr|mid|master|truncate|char|declare 不能包含以上关键字。
2.2 对于长度进行判断,不能超过一定的长度。
2.3 使用SqlCommand调用存储过程。参数使用SqlParameter,它会自动把value中的特殊字符转义。
3.数据库后台敏感数据必须加密,不能存明码。比如账号密码信息。
4.对于数据库连接使用的用户不能权限太大。
如果你的sql数据库连接使用的是sa权限的用户,那么使用sql注入就有可能获取操作系统的administrators组的权限,也就是服务器的全部管理权限。 因为有所有系统的存储过程可是直接执行很多系统操作,比如执行shell脚本,读取注册表等等。
master.dbo.xp_regread 读注册表
xp_cmdshell 扩展存储过程将命令字符串作为操作系统命令 shell 执行,并以文本行的形式返回所有输出。