简单高效防注入攻击的动态多参数、动态SQL语句拼接方法,提高网站的安全性
来源:互联网 发布:淘宝助理怎么做数据包 编辑:程序博客网 时间:2024/06/05 11:20
并非人人是高手,并非人人是神仙,我也有不懂的地方,我也有不注意的技术问题,多交流多学习就是最好的提高方法
其实对与初学者来说,进行的动态的查询语句拼接也不是那么好做的事情,就是做出来了,也未必是经得起考验的足够灵活好用的,未必是能拿得出手可以进行推广的,是否能拿得出就是其中的关键。
今天检查公司的软件项目质量,发现有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 ? 1: 0;
// 二、这里是开始进行动态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));
 %3
/// <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 ? 1: 0;
// 二、这里是开始进行动态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));
 %3
- 简单高效防注入攻击的动态多参数、动态SQL语句拼接方法,提高网站的安全性
- 简单高效防注入攻击的动态多参数、动态SQL语句拼接方法,提高网站的安全性
- 简单高效防注入攻击的动态多参数、动态SQL语句拼接方法,提高网站的安全性
- 简单高效防注入攻击的动态多参数、动态SQL语句拼接方法,提高网站的安全性
- 简单高效防注入攻击的动态多参数、动态SQL语句拼接方法,提高网站的安全性
- 简单高效防注入攻击的动态多参数、动态SQL语句拼接方法,提高网站的安全性
- 简单高效防注入攻击的动态多参数、动态SQL语句拼接方法,提高网站的安全性
- 简单高效防注入攻击的动态SQL语句拼接方法,提高网站的安全性
- 网站安全性:C#防SQL注入代码的实现方法
- 动态SQL拼接要防注入
- 参数化提交SQL语句和拼接SQL语句安全性分析 SQL注入 简单对比分析
- java防sql注入的sql语句拼接工具sqlHandle
- 多条件查询--使用dapper命令参数动态拼接出最安全的sql语句
- 提高NodeJS网站的安全性:Web服务器防黑客攻击技巧
- 提高NodeJS网站的安全性:Web服务器防黑客攻击技巧
- 【网站安全】简单的Js脚本攻击sql注入攻击
- C# sql语句拼接时 like情况的防sql注入的用法
- ASP.NET网站程序防SQL注入式攻击方法
- 简单高效防注入攻击的动态多参数、动态SQL语句拼接方法,提高网站的安全性
- 简单高效防注入攻击的动态多参数、动态SQL语句拼接方法,提高网站的安全性
- 插值法经验123
- 莫名其妙
- 【转】gcc 和 g++ 的区别
- 简单高效防注入攻击的动态多参数、动态SQL语句拼接方法,提高网站的安全性
- 转正申请书
- VC文本编辑框获取汉字内码
- History(查看历史命令)的用法
- uuencode工具的使用
- ELF和a.out文件格式的比较
- 迅雷笔试归来总结
- 对自己微笑一下 坚强些 洒脱些
- 鉴录记
原创粉丝点击
热门IT博客
热门问题
老师的惩罚
人脸识别
我在镇武司摸鱼那些年
重生之率土为王
我在大康的咸鱼生活
盘龙之生命进化
天生仙种
凡人之先天五行
春回大明朝
姑娘不必设防,我是瞎子
巴罗克
巴洛克时期
巴洛克式建筑
巴洛克建筑风格
巴洛克艺术
生活家巴洛克地板
中华巴洛克
巴洛克珍珠是天然的吗
巴洛克风格衣服
巴洛克家装风格
巴洛克珍珠项链
巴洛克风格家具品牌
巴洛克戒指
巴洛克婚纱摄影
巴洛克浴室柜价格
巴洛克艺术特点
巴洛克风格装修价格
巴洛克风格装修图片
巴洛克风格服装
巴洛克风
巴洛克装修风格
什么是巴洛克风格
巴洛克风格图片
巴洛克风格建筑
巴洛克风格建筑代表
巴洛克风格特点
巴洛克建筑代表
巴洛克工作室
巴洛克风格室内设计
巴洛克钢琴
巴洛克工作社
巴洛克服装
巴洛克酒吧
巴洛特风格
巴浪鱼
清蒸巴浪鱼
巴浪鱼的做法
巴浪鱼的营养价值
巴浪鱼干的做法
巴浪鱼有毒吗
巴浪鱼图片