简单高效防注入攻击的动态多参数、动态SQL语句拼接方法,提高网站的安全性...

news/2024/5/17 9:55:14/文章来源:https://blog.csdn.net/weixin_34055910/article/details/89937937

并非人人是高手,并非人人是神仙,我也有不懂的地方,我也有不注意的技术问题,多交流多学习就是最好的提高方法

 

   其实对与初学者来说,进行的动态的查询语句拼接也不是那么好做的事情,就是做出来了,也未必是经得起考验的足够灵活好用的,未必是能拿得出手可以进行推广的,是否能拿得出就是其中的关键。

 

   今天检查公司的软件项目质量,发现有2个同事写的程序存在SQL注入攻击的漏洞,当然也不能怪罪人家,他们也是刚参加工作1-2年,还没有那么丰富的技术经验、安全意识,不会注意到自己编写的系统会有严重的安全漏洞。

   公司在宁波也有一个政府网站的项目,在做系统安全检查自动扫描时,也被查出了一些SQL注入攻击的漏洞,这也使得让我更加提高了系统是否存在安全漏洞的意识,当然我写的系统很少会有这类的漏洞,但是整个公司有几十号人在做开发公司,所以也难免别人不会犯错。

  

   人工检查是否有SQL注入安全漏洞,其实非常简单,只要在查询输入框里输入有单引号的字符“'”,例如查询条件输入“吉日'嘎拉”其中有单引号,很可能这个查询的页面就崩溃了出现了错误页面,或者跳转到出错页面了,若有这样的情况发生,几乎99.3721%都可以看做是有潜在的SQL注入攻击漏洞。

 

   防止这个错误的发生,从技术上应该说是要用“参数化的查询”,贴一些代码,给大家参考一下我的做法:

代码
        #region public DataTable Search(string folderId, string searchValue, Boolean deleteMark) 查询
        
/// <summary>
        
/// 查询
        
/// </summary>
        
/// <param name="folderId">目录</param>
        
/// <param name="searchValue">查询条件</param>
        
/// <param name="deleteMark">删除标志</param>
        
/// <returns>数据表</returns>
        public DataTable Search(string folderId, string searchValue, Boolean deleteMark)
        {
            
// 一、这里是将Boolean值转换为int类型。
            int delete = deleteMark ? 10;

            
// 二、这里是开始进行动态SQL语句拼接,字段名、表明都进行了常量定义,表名字段名发生变化时,很容易就知道程序哪里都调用了这些。
            string sqlQuery = string.Empty;
            sqlQuery 
= " SELECT " + BaseNewsTable.FieldId
                    
+ "        ," + BaseNewsTable.FieldFolderId
                    
+ "        ," + BaseNewsTable.FieldTitle
                    
+ "        ," + BaseNewsTable.FieldFilePath
                    
+ "        ," + BaseNewsTable.FieldFileSize
                    
+ "        ," + BaseNewsTable.FieldReadCount
                    
+ "        ," + BaseNewsTable.FieldDescription
                    
+ "        ," + BaseNewsTable.FieldCategoryCode
                    
+ "        ," + BaseNewsTable.FieldEnabled
                    
+ "        ," + BaseNewsTable.FieldDeleteMark
                    
+ "        ," + BaseNewsTable.FieldSortCode
                    
+ "        ," + BaseNewsTable.FieldCreateUserId
                    
+ "        ," + BaseNewsTable.FieldCreateUserRealname
                    
+ "        ," + BaseNewsTable.FieldCreateDate
                    
+ "        ," + BaseNewsTable.FieldModifyUserId
                    
+ "        ," + BaseNewsTable.FieldModifyUserRealname
                    
+ "        ," + BaseNewsTable.FieldModifyDate
                    
+ " FROM " + this.CurrentTableName
                    
+ " WHERE " + BaseNewsTable.FieldDeleteMark + " = " + delete;

            
// 三、我们认为 folderId 这个查询条件是安全,不是人为输入的参数,所以直接进行了SQL语句拼接
            if (!String.IsNullOrEmpty(folderId))
            {
                sqlQuery 
+= " AND " + BaseNewsTable.FieldFolderId + " = '" + folderId + "'";
            }

            
// 四、这里是进行参数化的准备,因为是多个不确定的查询参数,所以用了List。
            List<DbParameter> dbParameters = new List<DbParameter>();

            
// 五、这里看查询条件是否为空
            searchValue = searchValue.Trim();
            
if (!String.IsNullOrEmpty(searchValue))
            {
                
// 六、这里是进行支持多种数据库的参数化查询
                sqlQuery += " AND (" + BaseNewsTable.FieldTitle + " LIKE " + DbHelper.GetParameter(BaseNewsTable.FieldTitle);
                sqlQuery 
+= " OR " + BaseNewsTable.FieldCreateUserRealname + " LIKE " + DbHelper.GetParameter(BaseNewsTable.FieldCreateUserRealname);
                sqlQuery 
+= " OR " + BaseNewsTable.FieldContents + " LIKE " + DbHelper.GetParameter(BaseNewsTable.FieldContents);
                sqlQuery 
+= " OR " + BaseNewsTable.FieldDescription + " LIKE " + DbHelper.GetParameter(BaseNewsTable.FieldDescription) + ")";
                
                
// 七、这里是判断,用户是否已经输入了%
                if (searchValue.IndexOf("%"< 0)
                {
                    searchValue 
= "%" + searchValue + "%";
                }

                
// 八、这里生成支持多数据库的参数
                dbParameters.Add(DbHelper.MakeInParam(BaseNewsTable.FieldTitle, searchValue));
                dbParameters.Add(DbHelper.MakeInParam(BaseNewsTable.FieldCreateUserRealname, searchValue));
                dbParameters.Add(DbHelper.MakeInParam(BaseNewsTable.FieldContents, searchValue));
                dbParameters.Add(DbHelper.MakeInParam(BaseNewsTable.FieldDescription, searchValue));
            }

            
// 九、这里是将List转换为数组,进行数据库查询
            return DbHelper.Fill(sqlQuery, dbParameters.ToArray());
        }
        
#endregion

 

对以上代码进行一下简单的点评:

优点有如下:

    1:支持多数据库。

    2:dbParameters.Add,非常灵活,可以动态组织多个查询条件条件,想要几个参数就要几个参数,最后又巧妙的用了 dbParameters.ToArray(),这个是值得学习的。

    3:函数的命名、注释、参数的大小写比较规范。

    4:函数的注释写得很棒,对初学者学习模仿起了一个好榜样。

    5:searchValue.IndexOf("%"也想得比较深入,有些专业人事查询时,可能已经输入了%。

    6:表名、表字段都进行了定义,若后期表名、表字段发生了变化,程序不会有未知的错误,很容易在编码阶段就发现错误,在软件开发初期,表名、字段名变来变去是很常见的事情,若是好几个人开发的,又经常变来变去的,若是当时没控制好,后期就会乱套。

    7:SQL语句拼接时,没有用 WHERE 1=1 AND , 而是巧妙的运用了 DeleteMark 字段,是值得学习的。

    8:SQL语句中关键字都进行了大写,是比较符合行业规范的,大家也值得参考。

    9:不管如何,对自己写的每行代码,每行注释,都有了深入的讲解、深入的认识,这是大家值得学习的,若哪里写得不好,有错就改的精神,分享的精神是值得学习的。

  10:先关注好身边的事情、才能关注网上的事情,是大家值得学习的,别总是有过于远大的理想,过于理想化的梦想,把身边的事情都做好,把身边的同事都关注好,就是干得最出色最及格了,这个务实的精神也是大家值得学习的。

  11:  查询代码思路严谨得有些过分,实在是过分,区区一个动态查询居然分了9个步骤来实现,思路细腻严谨得让人实在是佩服啊,不佩服不行啊,菜鸟程序员的骄傲、学习模仿的楷模,呵呵。

 

  先就写到这里吧,再夸下去,估计很多人都要吐了。

 

  

    

 

 

 本文转自jirigala_bao 51CTO博客,原文链接:http://blog.51cto.com/jirigala/806839


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_773330.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

好的学习网站及博客

2019独角兽企业重金招聘Python工程师标准>>> 慕课网&#xff1a;http://www.imooc.com/course/list ActiveMq:http://boy00fly.iteye.com/blog/1103586 转载于:https://my.oschina.net/luyaolove/blog/598490

zabbix 监控web网站性能

一直在纠结用什么实例来给大家演示呢&#xff1f;想来想去还是官方的好&#xff0c;那我们怎么用zabbix监控web性能和可用性呢&#xff1f;我们这边分为几个步骤&#xff1a;打开网站、登陆、登陆验证、退出&#xff0c;一共4个小step&#xff0c;看实例。 检测流程 1. 打开网站…

paper 28 :一些常见常用数据库的下载网站集锦

做图像处理模式识别的童鞋怎么可以没有数据库呢&#xff1f; 但是&#xff0c;如果自己做一个数据库&#xff0c;费时费力费钱先不说&#xff0c;关键是建立的数据库的公信力一般不会高&#xff0c;做出的算法也别人也不好比较&#xff0c;所以呢&#xff0c;下载比较权威的公共…

学英语好网站

转载于:https://www.cnblogs.com/DeeLMind/p/7627276.html

初学Node.js之Markdown建站

平时做项目中的Web应用都是用Asp.Net或者Java&#xff0c;但有时候需要快速做一些小Web的时候&#xff0c;感觉用Asp.Net或者Java都有点重。一开始想学学PHP&#xff0c;但实在不喜欢PHP的语法&#xff0c;所只用PHP写了两个简单的Demo之后就写不下去了。了解到最近Node.js有点…

自己搭建CA颁发证书做https加密网站

如果网站是针对内网的访问的&#xff0c;自己搭建CA服务器颁发证书就可以&#xff0c;如果是针对互联网来访问的&#xff0c;还是买ssl证书比较好&#xff0c;今天就来介绍一下自己搭建CA服务器颁发证书做加密网站。 192.168.10.187 CA服务器 192.168.10.190 web服务器 &#x…

完整利用Rsync实现服务器/网站数据增量同步备份

我们在选择VPS、服务器架设项目之后&#xff0c;所有的项目、网站数据都需要我们自行备份和维护&#xff0c;即便有些服务商有提供管理型服务器&#xff0c;但是数据自行备份和管理才是较为靠谱的。无论是网站&#xff0c;还是其他项目&#xff0c;数据的备份方式有很多种&…

MVC与单元测试实践之健身网站(一)-项目概述

2019独角兽企业重金招聘Python工程师标准>>> 前不久刚刚通过租房网站的开发学习了MVC&#xff0c;并随后学习了单元测试相关的基础&#xff0c;现在开始健身网站的开发&#xff0c;该项目将结合MVC与单元测试&#xff0c;在开发实践过程中&#xff0c;趁热打铁&…

Java爬虫_资源网站爬取实战

对 http://bestcbooks.com/ 这个网站的书籍进行爬取 (爬取资源分享在结尾) 下面是通过一个URL获得其对应网页源码的方法 传入一个 url 返回其源码 (获得源码后&#xff0c;对源码进行解析&#xff0c;获得页面中其他的书籍地址和当前页面的书籍的百度网盘的链接,因为这个网站…

Nginx配置SSL证书部署HTTPS网站

一、什么是 SSL 证书&#xff0c;什么是 HTTPSSSL 证书是一种数字证书&#xff0c;它使用 Secure Socket Layer 协议在浏览器和 Web 服务器之间建立一条安全通道&#xff0c;从而实现&#xff1a;1、数据信息在客户端和服务器之间的加密传输&#xff0c;保证双方传递信息的安全…

【好书试读】速度与激情:以网站性能提升用户体验

开始试读&#xff1a;https://yqfile.alicdn.com/1d4578a32e3f5120cd35a1e53e2000b5.pdf天猫购买链接&#xff1a;速度与激情&#xff1a;以网站性能提升用户体验 Web设计师在权衡外观设计与网站性能时总是要作出艰难的选择。良好的内容、布局、图片和交互对于吸引用户来说至关…

网站用户身份识别俩大招之django实现cookie

导航&#xff1a; 原理介绍 代码实现 过程分析 追踪Cookie 原理介绍 众所周知&#xff0c;http协议是无状态的协议&#xff0c;简单理解是用户的前一步操作和后一步操作之间没有关系&#xff0c;互相不知道&#xff0c;不干扰。而在很多场景下&#xff0c;浏览网页时&#xff0…

Java网站开发必看书籍

转发&#xff1a;https://blog.csdn.net/tianya846/article/details/50683248 1&#xff1a;《java并发编程从入门到精通》 推荐理由&#xff1a; 从入门讲到精通的&#xff0c;网络安全&#xff0c;网络并发的好书。《Java并发编程从入门到精通》作者结合自己10多年Java并发编…

记在VMware虚拟机中对网站进行性能压力测试的经历

由于本次测试&#xff0c;仅仅是对静态网站首页进行的测试&#xff0c;所以没有涉及到MySQL数据库的性能监测 服务器基本配置 webbench测试工具 Linux上一款优秀的web性能压力测试工具。webbench最多可以模拟3万个并发连接去测试网站的负载能力。 下面开始测试 第一次并发测试 …

基于keepalived实现多种模式的高可用集群网站架构

一、 实现主从服务器高可用技术。 大概网络拓扑图&#xff1a; 前提准备条件&#xff1a; 准备四台机器&#xff0c;一台为keepalived的master&#xff0c;一台为keepalived的backup&#xff0c;一台为rs1&#xff0c;一台为rs2&#xff0c;同时都关闭防火墙和selinux。 ①安装…

基于django的视频点播网站开发-step8-后台登录功能

从本讲起&#xff0c;我们会介绍后台管理系统的开发&#xff0c;后台管理&#xff0c;主要是对数据库中的数据进行增、删、改、查的操作&#xff0c;满足网站管理员对网站的管理与维护的需求。 其实&#xff0c;django自带的也有一个后台管理系统&#xff08;/admin&#xff09…

阿里P9架构师简述从单机至亿级流量大型网站系统架构的演进过程

阶段一、单机构建网站网站的初期&#xff0c;我们经常会在单机上跑我们所有的程序和软件。此时我们使用一个容器&#xff0c;如tomcat、jetty、jboos&#xff0c;然后直接使用JSP/servlet技术&#xff0c;或者使用一些开源的框架如mavenspringstructhibernate、mavenspringspri…

SEO新手网站优化工作操作流程汇总

SEO是一个系统的过程&#xff0c;如果你对SEO概念没有很了解&#xff0c;是很难操作的。我们列出有关SEO网站优化操作流程。 以下是网站优化SEO新手操作流程汇总 一、网站诊断 1、网站历史&#xff1a;域名注册时间、域名到期时间、域名注册机构、域名注册人 2、服务器数据&…

个人网站如何使用支付宝收款实现

想给个人网站增加一个支付&#xff0c; 找到https://neue.v2ex.com/t/350564&#xff0c; 按照里面大家讨论的&#xff0c;还真的可以了。 1.开通功能 https://neue.v2ex.com/t/326701 有个商家二维码 图中二维码是服务商的员工码&#xff0c;作为推广的服务商肯定是会有返利…

php 易宝支付,网站接入易宝支付遇上的问题

因为工作的需要&#xff0c;就接触了易宝支付。本以为根据易宝支付提供的demo跟文档就能快速的完成接入工作&#xff0c;可是这一过程并不顺利&#xff0c;耽误了不少时间&#xff0c;所以我就把遇上的问题给记录下来&#xff0c;也许能帮到更多朋友。1)文档选择存在两份文档&a…