公司网站是用.net写的,对于一个对.net毫无研究的人来说,要优化,简直无从下手,公司网站老是被黑,我是这样做的。
1.做个测试,确定是sql注入。
2.网上查下sql注入屏蔽方法,主要查到这几个。
(1)屏蔽错误信息,即在客户端浏览器内输入错误信息导致无法正常显示,通常开发时为了调试方便,但是正式环境是要修改的。修改web.config的<customErrors mode="RemoteOnly" defaultRedirect="mycustompage.htm"/>同时在根路径下建立mycustompage.htm页面,页面上九写点静态提示信息就可以了。
(2)在页面每次提交时判断url是否包含非法字符,搞过几年的javaEE的我大概会想到,每次页面提交时先判断,类似于拦截器,或者像jsp那样include一个页面,由于jsp本身就是一个servlet,所以可以每次提交的时候先判断,如果不合法,既返回错误信息。抱着这个想法,查啊查,网上说.net里面有个global.asax的页面,好像有个Application_BeginRequest,具体是什么原理我就不清楚了。使用下,但是找遍了我的项目目录也没找到这个文件,于是就想新建一个,到网上下个编辑器,什么vs2010,下好了,加上去,怎么也没反应,调试了一天,找不到原因,结果第二天过来,可以了,晕死,估计有个地方要重启吧,但是我重启服务了额,具体什么原因,不清楚。
下面是我的判断方法:
<%@ Application Language="C#" %>
<script runat="server">
void Application_BeginRequest(object sender, EventArgs e)
{
//SQL防注入
string Sql_1 = "and|or|join|exec|insert+|select+|delete+|update+|count|chr|mid|master+|truncate|char|declare|drop+|drop+table|creat+|creat+table";
string Sql_2 = "exec+|insert|insert+|delete+|update+|count(|count+|chr+|+mid(|+mid+|+master+|truncate+|char+|+char(|declare+|drop+|creat+|drop+table|creat+table";
string[] sql_c = Sql_1.Split('|');
string[] sql_c1 = Sql_2.Split('|');
if (Request.QueryString != null)
{
foreach (string sl in sql_c)
{
if (Request.QueryString.ToString().ToLower().IndexOf(sl.Trim()) >= 0)
{
Response.Write("警告!你的IP已经被记录!不要使用敏感字符!");//
Response.Write(sl);
Response.Write(Request.QueryString.ToString());
Response.End();
break;
}
}
}
if (Request.Form.Count > 0)
{
string s1 = Request.ServerVariables["SERVER_NAME"].Trim();//服务器名称
if (Request.ServerVariables["HTTP_REFERER"] != null)
{
string s2 = Request.ServerVariables["HTTP_REFERER"].Trim();//http接收的名称
string s3 = "";
if (s1.Length > (s2.Length - 7))
{
s3 = s2.Substring(7);
}
else
{
s3 = s2.Substring(7, s1.Length);
}
if (s3 != s1)
{
Response.Write("警告!你的IP已经被记录!不要使用敏感字符!");//
Response.End();
}
}
}
}
void Application_Start(object sender, EventArgs e)
{
//在应用程序启动时运行的代码
// Response.Write("警告!你的IP已经被记录!不要使用敏感字符!");
}
void Application_End(object sender, EventArgs e)
{
//在应用程序关闭时运行的代码
// Response.Write("警告!你的IP已经被记录!不要使用敏感字符!");
}
void Application_Error(object sender, EventArgs e)
{
//在出现未处理的错误时运行的代码
// Response.Write("警告!你的IP已经被记录!不要使用敏感字符!");
}
void Session_Start(object sender, EventArgs e)
{
// Response.Write("警告!你的IP已经被记录!不要使用敏感字符!");
}
void Session_End(object sender, EventArgs e)
{
// Response.Write("警告!你的IP已经被记录!不要使用敏感字符!");
//在会话结束时运行的代码。
// 注意: 只有在 Web.config 文件中的 sessionstate 模式设置为
// InProc 时,才会引发 Session_End 事件。如果会话模式
//设置为 StateServer 或 SQLServer,则不会引发该事件。
}
</script>