记一次成功的sql注入入侵检测附带sql性能优化
很多同窗和园友都曾遭遇过SQL注入的困扰,大部分情况下,这些问题的源头在于代码的严谨性不足,往往是在经历了多次错误和挫折之后,人们才能真正学会认真对待。
假如你被委派接手一个技术层面存在缺陷的网站,且在无法推翻原有架构的前提下,只能逐步替换旧程序,那么所面临的挑战将会十分艰巨。例如我所遇到的问题:
问题一:老板可能会说,网站刚做完时并未出现木马问题,怎么你一来就频频出现木马入侵。争论无益,更重要的是解决问题。与其和老板争执不休,不如拿出事实和证据,邀请公司里其他懂技术的人一同参与,证明公司网站被挂马并非是你的责任。例如,我曾通过细致排查网站目录,删除通过FCK上传的木马,并修补FCK的上传漏洞,同时记录下这篇“Fckeditor使用笔记”。其实很多人都遇到过类似问题,也都有过成功的解决经验,这些都是小问题。让老板明白这一点,比解决漏洞问题更为重要。我费尽口舌解释,几乎恨不得把所有稍微懂点技术的员工都叫到一起,让他们了解什么是大马什么是小马,并演示如何上传木马。真的是感觉需要进行一场黑客教程的普及。
问题二:网站再次遭遇入侵,仅仅两个月前的问题刚刚解决,如今网站再次被挂马。若老板再次归咎于你的到来,这时果断选择离开。这就是为何不能与不懂技术的人硬碰硬,更不必与老板争论,因为他们无法理解你的专业。这个网站是早期技术开发的产物,基于其他CMS系统修改而成。我必须保证旧模块的正常使用,同时逐步更新网站底层。面对如此多的页面,无法逐一检测每个页面的漏洞。为此,我开发了狼蚁网站SEO优化的检测代码,简单有效,并可借此优化SQL。
具体方案如下:
第一步:建立SQL日志表,记录SQL语句、执行次数、参数及值、开始时间、结束时间、来源页面、IP以及语句执行时间(暂时未使用)。表结构如下:
```sql
CREATE TABLE [dbo].[my_sqllog]...
```
第二步:在SqlHelper里编写记录代码。原本这两个方法可以是私有的,但由于这个二等残废的网站其他地方使用了别的SqlHelper类,因此直接调用了此处通过合理优化的SqlHelper类的方法。
在数据库操作中,日志记录是一项重要的安全措施。通过记录每一条执行的SQL语句,我们可以追踪、监控数据库的活动,并在遭遇入侵时提供重要的线索。为了实现这一功能,我们需要对代码进行一系列的调整和优化。
我们需要在执行SQL语句之前,增加一个日志记录的操作。这个操作可以通过一个名为`ExecuteSqlLog`的方法实现,该方法会接收SQL语句及其相关参数,并将它们以及执行的其他细节(如执行时间、IP地址等)记录到日志表中。
代码示例:
```csharp
public static int ExecuteSqlLog(CommandType commandType, string commandText, params DbParameter[] parameters)
{
// 进行参数处理、连接字符串获取等初始化操作
// ...
// 执行SQL语句并记录日志信息到my_sqllog表
// ...
return 执行结果; // 返回执行结果
}
```
接下来,我们需要修改每个执行SQL语句的方法,加入上述的日志记录操作。无论是`ExecuteScalar`、`ExecuteReader`还是`ExecuteNonQuery`等方法,都需要在执行SQL之前调用`ExecuteSqlLog`方法。这样,每一条SQL语句的执行都会被记录下来。
例如,在`ExecuteScalar`方法中:
```csharp
public static object ExecuteScalar(DbConnection connection, CommandType commandType, string commandText, params DbParameter[] parameters)
{
// 初始化连接和命令对象
// ...
// 执行SQL之前进行日志记录操作
int log = ExecuteSqlLog(commandType, commandText, parameters);
// 执行SQL语句并获取结果
object result = cmd.ExecuteScalar();
// ...
return result;
}
```
通过这种方式,当遭遇SQL注入攻击时,我们可以从日志表中查看到入侵者构造的恶意SQL语句。例如,下面的SQL语句就是一个典型的构造注入示例:
构造的SQL如下:`39191+update+my_websetting+set+websitetitle=...`,其中包含了木马地址的脚本片段(`
微信营销
- 记一次成功的sql注入入侵检测附带sql性能优化
- 使用Vue-cli 3.0搭建Vue项目的方法
- react-native使用leanclound消息推送的方法
- 详解前后端分离之VueJS前端
- JavaScript中数据结构与算法(一):栈
- JSP判断移动设备的正则
- 正则表达式教程之重复匹配详解
- 详解node.js的http模块实例演示
- JS封装的选项卡TAB切换效果示例
- layui实现三级导航菜单
- JavaScript中数组Array方法详解
- javascript多物体运动实现方法分析
- JavaScript实现瀑布流以及加载效果
- ECMall支持SSL连接邮件服务器的配置方法详解
- PHP使用file_get_content设置头信息的方法
- ASP.NET2.0使用Enter Key作为默认提交问题分析(附源码