记一次成功的sql注入入侵检测附带sql性能优化
前端之家收集整理的这篇文章主要介绍了
记一次成功的sql注入入侵检测附带sql性能优化,
前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
但是如果是让你接手一个二等残废的网站,并让你在上面改版,而且不能推翻式改版,只能逐步替换旧的程序,那么你会非常痛苦,例如我遇到的问题:
问题1.
老板对你说,以前刚做完网站好好了,没有出现木马,怎么你来了,就会出现木马,先别说了,赶紧解决问题,我彻底无语,但是如果争吵,其实证明你和老板一样无知,拿出证据和事实分析来让公司其他稍微懂技术的一起来证明,公司网站被挂马不是你来了的错。
如是我通过网站目录仔细排查将通过fck上传的网马删除并修补fck的上传漏洞并记下了这篇 Fckeditor使用笔记 ,其实很多人都遇到过,也解决过,都是小问题,但是让你老板明白比解决漏洞问题更蛋疼,我那解释的叫一个汗啊,恨不得把公司所有稍微懂点技术的都叫上让他们看什么是大马什么是小马,然后演示怎么上传木马,奶奶的,黑客教程普及啊。
问题2.
网站又出现问题,上次的问题解决了不过两个月,网站又被入侵挂马,如是老板这次再说因为我来了才出问题,立马走人,这就是为什么不能更不懂技术的人硬碰硬,更不能和你的老板来说,说了你又不懂。
但是要命的是网站是以前的技术开发的二等残废,在别个的cms上修改的,我必须保证网站在的开发的同时旧的模块还可以使用,通过逐步更新的方法将网站底层翻新,但是那么多页面,你很难一个一个去检测那个页面有漏洞,如是写出下面的检测代码,没想到这么简单的就搞定了,并且可以通过此方法优化你的sql。
第一步建立一个sql日志表
<div class="codetitle"><a style="CURSOR: pointer" data="76557" class="copybut" id="copybut76557" onclick="doCopy('code76557')"> 代码如下:
<div class="codebody" id="code76557">
CREATE TABLE [dbo].[my_
sqllog](
[id] [bigint] IDENTITY(1,1) NOT NULL,
[hit] [bigint] NULL,
[
sqltext]
varchar COLLATE Chinese_PRC_CI_AS NULL,
[paramdetails]
varchar COLLATE Chinese_PRC_CI_AS NULL,
[begintime] [datetime] NULL,
[endtime] [datetime] NULL,
[fromurl]
varchar COLLATE Chinese_PRC_CI_AS NULL,
[ip]
varchar COLLATE Chinese_PRC_CI_AS NULL,
[lastelapsedtime] [bigint] NULL,
CONSTRAINT [PK
mysqllog] PRIMARY KEY CLUSTERED
(
[id] ASC
)WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]
记录
sql语句、此
sql语句被执行
次数,参数及值,记录开始时间,结束时间,来自哪个
页面,ip和此条语句执行时间(暂时没用)
第二步在
sqlhelper里写记录
代码 两个
方法本来可以写成private的,但是此二等残废的网站其他地方用的别的
sqlhelper类,就直接
调用此处通过合理优化的
sqlhelper类的
方法了。
代码1:插入日志
<div class="codetitle">
<a style="CURSOR: pointer" data="68271" class="copybut" id="copybut68271" onclick="doCopy('code68271')"> 代码如下:
<div class="codebody" id="code68271">
public static int Execute
sqlLog(CommandType commandType,string commandText,params DbParameter[] cmdParams)
{
#region 参数处理
string colums = "";
string dbtypes = "";
string values = "";
string paramdetails = "";
if (cmdParams != null && cmdParams.Length > 0)
{
foreach (DbParameter param in cmdParams)
{
if (param == null)
{
continue;
}
colums += param.ParameterName + " ";
dbtypes += param.DbType + " ";
values += param.Value + ";";
}
paramdetails = string.Format(" {0},{1},{2}",colums,dbtypes,values);
}
string fromurl = "";
if (System.Web.HttpContext.Current!=null)
{
fromurl = System.Web.HttpContext.Current.Request.Url.ToString();
}
// commandText = commandText.Replace("'","‘").Replace(";",";");
sqlParameter[] parameters = new
sqlParameter[]
{
new
sqlParameter("@hit",1),
new
sqlParameter("@
sqltext",commandText),
new
sqlParameter("@paramdetails",paramdetails),
new
sqlParameter("@begintime",DateTime.Now),
new
sqlParameter("@endtime",
new
sqlParameter("@fromurl",fromurl),
new
sqlParameter("@ip",Web.PressRequest.GetIP()),
new
sqlParameter("@lastelapsedtime",0),
};
#endregion
using (DbConnection connection = Factory.CreateConnection())
{
connection.ConnectionString = GetRealConnectionString(commandText);//ConnectionString;
string
sql = "";
// 执行DbCommand命令,并返回结果.
int id =
Utils.TypeConverter.ObjectToInt(ExecuteScalarLog(CommandType.Text,
"select top 1 id from my_
sqllog where
sqltext=@
sqltext",commandText)));
if (id > 0)
{
sql = "update my_
sqllog set hit=hit+1,ip=@ip,endtime=@endtime,fromurl=@fromurl where id=" + id;
}
else
{
sql = "insert into my_
sqllog(hit,
sqltext,paramdetails,begintime,endtime,fromurl,ip,lastelapsedtime) values(@hit,@
sqltext,@paramdetails,@begintime,@endtime,@fromurl,@ip,@lastelapsedtime)";
}
// 创建DbCommand命令,并进行预处理
DbCommand cmd = Factory.CreateCommand();
bool mustCloseConnection = false;
PrepareCommand(cmd,connection,(DbTransaction)null,commandType,
sql,parameters,out mustCloseConnection);
// 执行DbCommand命令,并返回结果.
int retval = cmd.ExecuteNonQuery();
// 清除参数,以便再次使用.
cmd.Parameters.Clear();
if (mustCloseConnection)
connection.Close();
return retval;
}
}