简单高效防注入攻击的动态多参数、动态SQL语句拼接方法,提高网站的安全性
2010-10-24 22:43
871 查看
并非人人是高手,并非人人是神仙,我也有不懂的地方,我也有不注意的技术问题,多交流多学习就是最好的提高方法
其实对与初学者来说,进行的动态的查询语句拼接也不是那么好做的事情,就是做出来了,也未必是经得起考验的足够灵活好用的,未必是能拿得出手可以进行推广的,是否能拿得出就是其中的关键。
今天检查公司的软件项目质量,发现有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));
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=1AND , 而是巧妙的运用了 DeleteMark 字段,是值得学习的。
8:SQL语句中关键字都进行了大写,是比较符合行业规范的,大家也值得参考。
9:不管如何,对自己写的每行代码,每行注释,都有了深入的讲解、深入的认识,这是大家值得学习的,若哪里写得不好,有错就改的精神,分享的精神是值得学习的。
10:先关注好身边的事情、才能关注网上的事情,是大家值得学习的,别总是有过于远大的理想,过于理想化的梦想,把身边的事情都做好,把身边的同事都关注好,就是干得最出色最及格了,这个务实的精神也是大家值得学习的。
11: 查询代码思路严谨得有些过分,实在是过分,区区一个动态查询居然分了9个步骤来实现,思路细腻严谨得让人实在是佩服啊,不佩服不行啊,菜鸟程序员的骄傲、学习模仿的楷模,呵呵。
先就写到这里吧,再夸下去,估计很多人都要吐了。
相应的源码给大家敬上,若能起到参考,我也很荣幸了
/Files/jirigala/DotNet.CommonV3.0.rar
/Files/jirigala/handbookV3.0.pdf
将权限管理、工作流管理做到我能力的极致,一个人只能做好那么很少的几件事情。
posted on 2010-07-28 19:49 吉日嘎拉 不仅权通用权限 阅读(4339)评论(78) 编辑 收藏
#1楼 回复 引用 查看 前排强势就坐
2010-07-28 20:02 | sheng.chao
热烈欢迎鹏程的好朋友们。
2010-07-28 20:04 | 吉日嘎拉 不仅权限管理
2010-07-28 20:06 | 风枫峰
2010-07-28 20:06 | 邀月
都不按推荐啊,只是支持啊?
2010-07-28 20:07 | 吉日嘎拉 不仅权限管理
引用邀月:支持!
2010-07-28 20:08 | 吉日嘎拉 不仅权限管理
下面是我公司商城的商品高级搜索SQL语句,也可以用参数化查询?
请教。。。
view source
print?
2010-07-28 20:29 | 牛腩
不敢多言...。
2010-07-28 20:40 | Eric Liao
2010-07-28 20:45 | 钧梓昊逑
2010-07-28 20:56 | 夏天爱上雨
2010-07-28 21:12 | 型格小妖
2010-07-28 21:27 | 爱的释放
可以的
2010-07-28 21:28 | 爱的释放
也学习...
2010-07-28 21:28 | 爱的释放
说来说去,关键的MakeInParam方法还是没有公布出来 ,不过我想也就是检查一下是否有危险字符,然后拼接成字符串!
dbParameters这个类,不知道是继承的参数类还是自己写的,如果是自己写的,完全是多此一举,用参数类加sqlhelper类,安全得很!
另外要说的是folderId字段既然是查询参数,为什么还要考虑是否是有可能人工输入呢?直接放在MakeInParam搞一下不是更安全?况且,这个参数肯定是前台传到后台的,人工输入是不可能了,但如果是注入程序,一样可以利用这个参数!
2010-07-28 21:54 | szyicol
2010-07-28 21:55 | 总想拥有自己的天空
当然也不能怪罪人家,他们也是刚参加工作1-2年,还没有像我这么丰富的技术经验、安全意识。
过两天我也写一篇大作,教大家如何跨上自动扶梯。
2010-07-28 22:20 | Cheney Shue
2010-07-28 22:36 | John Liu
2010-07-28 22:40 | 菩提小鸟
2010-07-28 22:54 | marr
考虑了下,可以这样
sqlQuery += " AND " + BaseNewsTable.FieldFolderId + " = '" + folderId + "'";
你这里既然这样嘛~~我可以
string folderId = @"0';
DROP TABLE T_Orders;
UPDATE
[T_Users]
SET
[Password] = '000000' --"; //SQL的--注释就是要把folderId + "'";后面的'干掉,方法还有很多.我不列举了.
伪SQL是
WHERE FieldDeleteMark = delete AND
FieldFolderId = '0';
DROP TABLE T_Orders; --亮点在这行
UPDATE
[T_Users]
SET
[Password] = '000000' -- '
2010-07-28 23:20 | dotNetDR_
多表查询,尽量最多只对三个表关联起来查询。
2010-07-28 23:26 | Jeffrey.Dan
一两年经验还会让SQL注入攻击漏洞存在?
不敢多言...。
一、二十年经验还会让SQL注入攻击漏洞存在!
2010-07-28 23:27 | 我是打酱油的
你的这个说法没有任何根据啊,没有任何道理说多表查询尽量最多只对三个表查询,表的连接多少要看具体的业务,需要用到多少表,就用到多少表。我这里经常七八个表进行join。
2010-07-29 08:22 | ocean
2010-07-29 08:24 | 贺臣
当然也不能怪罪人家,他们也是刚参加工作1-2年,还没有像我这么丰富的技术经验、安全意识。
过两天我也写一篇大作,教大家如何使用筷子。
2010-07-29 08:54 | 张磊_larry.zhang
谢谢LZ分享~~
2010-07-29 08:54 | Tonny Lau
这个强!学习了!!
2010-07-29 09:03 | dax.net
也让人学到了一定的东西
2010-07-29 09:20 | 星云一点
王婆卖瓜,自卖自夸,不过你的瓜确实很好,夸的也很过分啊!
2010-07-29 09:59 | yanglover
谢谢支持,哈哈。
2010-07-29 10:12 | 吉日嘎拉 不仅权限管理
引用Eric Liao:
一两年经验还会让SQL注入攻击漏洞存在?
不敢多言...。
2010-07-29 10:15 | 吉日嘎拉 不仅权限管理
引用型格小妖:拼sql之类的东西就不要上首页了,污染大家视线
2010-07-29 10:17 | 吉日嘎拉 不仅权限管理
引用贺臣:菜包,肉包,饭桶的我来了,哈哈!顶一下 继续关注一下
2010-07-29 10:17 | 吉日嘎拉 不仅权限管理
引用dax.net:
4:函数的注释写得很棒,对初学者学习模仿起了一个好榜样
这个强!学习了!!
2010-07-29 10:18 | 吉日嘎拉 不仅权限管理
引用星云一点:
嗯 支持一下 分享精神很好
也让人学到了一定的东西
2010-07-29 10:18 | 吉日嘎拉 不仅权限管理
引用Tonny Lau:
虽然把自己夸的天花乱坠,分享精神还是值得肯定的。。
谢谢LZ分享~~
2010-07-29 10:18 | 吉日嘎拉 不仅权限管理
引用我是打酱油的:
引用Eric Liao:
一两年经验还会让SQL注入攻击漏洞存在?
不敢多言...。
一、二十年经验还会让SQL注入攻击漏洞存在!
2010-07-29 10:19 | 吉日嘎拉 不仅权限管理
引用菩提小鸟:吉日又出来吓人了!
2010-07-29 10:20 | 吉日嘎拉 不仅权限管理
2010-07-29 10:30 | Rioyang
2010-07-29 10:31| 深山老林
我一般不看吉日文章的内容,只看评论.
因为评论比内容精彩多了...
2010-07-29 10:46 | 透明梦柯
引用例如查询条件输入“吉日'嘎拉”其中有单引号,很可能这个查询的页面就崩溃了出现了错误页面,或者跳转到出错页面了,若有这样的情况发生,几乎99.3721%都可以看做是有潜在的SQL注入攻击漏洞。
这个倒是未必,因为进攻式编程,设计者可能会按常人正确的操作进行设计,发现意外情况,即报错误,例如int.Parse(),这样虽然错了,但是并不会引起注入
2010-07-29 10:55 | 人生就是赌
2010-07-29 11:05 | Mr.R[未注册用户]
....
点击量高我觉得多半是冲作者来的....
2010-07-29 11:08 | 安静的瞬间
2010-07-29 11:24 | 陈梓瀚(vczh)
2010-07-29 11:26 | 绯雨
2:写parameter数组,难道就自己不拼接sql语句了?这个是哪里跟哪里啊?
引用陈梓瀚(vczh):.NET创建query的时候可以给你自己传入parameter数组,就跟string.Format一样。类库已经帮你排除了所有的注入的可能,你为什么还要自己拼接字符串呢?
2010-07-29 11:40 | 吉日嘎拉 不仅权限管理
引用绯雨:我是来看评论的,文章压根没看
2010-07-29 11:41| 吉日嘎拉 不仅权限管理
2010-07-29 11:47 | Capricornus
引用Capricornus:我想请问下楼主. 存储过程会不会好点? 感觉拼接有些性能影响呀. 而且被注入基本都是字符串拼接的问题.
2010-07-29 11:53 | 吉日嘎拉 不仅权限管理
lz拼sql已经成瘾,食古不化的家伙
2010-07-29 12:26 | 型格小妖
引用型格小妖:
引用陈梓瀚(vczh):.NET创建query的时候可以给你自己传入parameter数组,就跟string.Format一样。类库已经帮你排除了所有的注入的可能,你为什么还要自己拼接字符串呢?
lz拼sql已经成瘾,食古不化的家伙
2010-07-29 12:39 | 吉日嘎拉 不仅权限管理
还好,我是其余40的人。:)
2010-07-29 13:14 | bravf[未注册用户]
2010-07-29 13:15 | 箜
%是数据
2010-07-29 13:54 | _Kong_[未注册用户]
1.
引用int delete = deleteMark ? 1: 0;
数据库中bool类型和int类型会自动隐式转换,此处代码冗余
2.
引用string sqlQuery = string.Empty;
sqlQuery = " SELECT " + BaseNewsTable.FieldId
+ " ," + BaseNewsTable.FieldFolderId
+ " ," + BaseNewsTable.FieldTitle
+ " ," + BaseNewsTable.FieldFilePath
+ " ," + BaseNewsTable.FieldFileSize
+ " ," + BaseNewsTable.FieldReadCount
+ " ," + BaseNewsTable.FieldDescription
+ " ," + BaseNewsTable.FieldCategoryCode
+ " ," + BaseNewsTable.FieldEnabled ...
如此多的字符串拼接还不用StringBuilder,实在说不过去
3.
引用if (searchValue.IndexOf("%")< 0)
此处先取索引值后与0比较,建议改为searchValue.Contains("%")
2010-07-29 14:32 | Roy Ming
其实对与初学者来说,进行的动态的查询语句拼接也不是那么好做的事情,就是做出来了,也未必是经得起考验的足够灵活好用的,未必是能拿得出手可以进行推广的,是否能拿得出就是其中的关键。
今天检查公司的软件项目质量,发现有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));
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=1AND , 而是巧妙的运用了 DeleteMark 字段,是值得学习的。
8:SQL语句中关键字都进行了大写,是比较符合行业规范的,大家也值得参考。
9:不管如何,对自己写的每行代码,每行注释,都有了深入的讲解、深入的认识,这是大家值得学习的,若哪里写得不好,有错就改的精神,分享的精神是值得学习的。
10:先关注好身边的事情、才能关注网上的事情,是大家值得学习的,别总是有过于远大的理想,过于理想化的梦想,把身边的事情都做好,把身边的同事都关注好,就是干得最出色最及格了,这个务实的精神也是大家值得学习的。
11: 查询代码思路严谨得有些过分,实在是过分,区区一个动态查询居然分了9个步骤来实现,思路细腻严谨得让人实在是佩服啊,不佩服不行啊,菜鸟程序员的骄傲、学习模仿的楷模,呵呵。
先就写到这里吧,再夸下去,估计很多人都要吐了。
相应的源码给大家敬上,若能起到参考,我也很荣幸了
/Files/jirigala/DotNet.CommonV3.0.rar
/Files/jirigala/handbookV3.0.pdf
将权限管理、工作流管理做到我能力的极致,一个人只能做好那么很少的几件事情。
posted on 2010-07-28 19:49 吉日嘎拉 不仅权通用权限 阅读(4339)评论(78) 编辑 收藏
评论
1915183#1楼 回复 引用 查看 前排强势就坐
2010-07-28 20:02 | sheng.chao
#2楼[楼主] 回复 引用 查看
@sheng.chao热烈欢迎鹏程的好朋友们。
2010-07-28 20:04 | 吉日嘎拉 不仅权限管理
#3楼 回复 引用 查看
"先就写到这里吧,再夸下去,估计很多人都要吐了。" 呵呵2010-07-28 20:06 | 风枫峰
#4楼 回复 引用 查看
支持!2010-07-28 20:06 | 邀月
#5楼[楼主] 回复 引用 查看
@风枫峰都不按推荐啊,只是支持啊?
2010-07-28 20:07 | 吉日嘎拉 不仅权限管理
#6楼[楼主] 回复 引用 查看
强烈要求,按推荐,哈哈。引用邀月:支持!
2010-07-28 20:08 | 吉日嘎拉 不仅权限管理
#7楼 回复 引用 查看
看不太懂。得下源码来看看,像一般的商城,商品高级搜索一般会用到inner join自身N次的,像这样的也可以用参数化查询?下面是我公司商城的商品高级搜索SQL语句,也可以用参数化查询?
请教。。。
view source
print?
01 | with temptbl as ( |
02 | select ROW_NUMBER()OVER ( ORDER BY proid desc ) AS Row,proid,proname 型号,brdname 品牌,proimage 首图, |
03 | propricebulk 批发价,propricemarket零售价, dbo.[fn_productparam](proid)参数 |
04 | from tb_product p |
05 | inner join tb_Brand b on b.brdid=p.probrand |
06 | inner join [tb_Product-Param] pp on pp.propproductid=p.proid |
07 | and (pp.propparamid=3 and pp.propparamvalue= 'LGA 775' ) |
08 | inner join [tb_Product-Param] pp2 on pp2.propproductid=p.proid |
09 | and (pp2.propparamid=5 and pp2.propparamvalue= '0.045um' ) |
10 | inner join [tb_Product-Param] pp3 on pp3.propproductid=p.proid |
11 | and (pp3.propparamid=4 and pp3.propparamvalue= 'Wolfdale' ) |
12 | where b.brdid=16 and protype=21 and propricemarket between 600 and 800 |
13 | ) |
14 | SELECT * FROM temptbl where Row between 1 and 5 |
#8楼 回复 引用 查看
一两年经验还会让SQL注入攻击漏洞存在?不敢多言...。
2010-07-28 20:40 | Eric Liao
#9楼 回复 引用 查看
我最近都只用linq to EF了,可以不考虑这些了2010-07-28 20:45 | 钧梓昊逑
#10楼 回复 引用 查看
学习。。。。。2010-07-28 20:56 | 夏天爱上雨
#11楼 回复 引用 查看
拼sql之类的东西就不要上首页了,污染大家视线2010-07-28 21:12 | 型格小妖
#12楼 回复 引用 查看
好2010-07-28 21:27 | 爱的释放
#13楼 回复 引用 查看
@爱的释放可以的
2010-07-28 21:28 | 爱的释放
#14楼 回复 引用 查看
@夏天爱上雨也学习...
2010-07-28 21:28 | 爱的释放
#15楼 回复 引用 查看
神似唐骏,就会吹!说来说去,关键的MakeInParam方法还是没有公布出来 ,不过我想也就是检查一下是否有危险字符,然后拼接成字符串!
dbParameters这个类,不知道是继承的参数类还是自己写的,如果是自己写的,完全是多此一举,用参数类加sqlhelper类,安全得很!
另外要说的是folderId字段既然是查询参数,为什么还要考虑是否是有可能人工输入呢?直接放在MakeInParam搞一下不是更安全?况且,这个参数肯定是前台传到后台的,人工输入是不可能了,但如果是注入程序,一样可以利用这个参数!
2010-07-28 21:54 | szyicol
#16楼 回复 引用 查看
吉日兄,顶一个,谢谢分享2010-07-28 21:55 | 总想拥有自己的天空
#17楼 回复 引用 查看
我发现,我们这边两个工作了1~2年的程序员,去乘地铁时上自动扶梯,那个跨步总是踩不稳,经常摔个狗吃屎。当然也不能怪罪人家,他们也是刚参加工作1-2年,还没有像我这么丰富的技术经验、安全意识。
过两天我也写一篇大作,教大家如何跨上自动扶梯。
2010-07-28 22:20 | Cheney Shue
#18楼 回复 引用 查看
吉日的文档写的不错。2010-07-28 22:36 | John Liu
#19楼 回复 引用 查看
吉日又出来吓人了!2010-07-28 22:40 | 菩提小鸟
#20楼 回复 引用 查看
支持!!!2010-07-28 22:54 | marr
#21楼 回复 引用 查看
刚刚发的打错了.考虑了下,可以这样
sqlQuery += " AND " + BaseNewsTable.FieldFolderId + " = '" + folderId + "'";
你这里既然这样嘛~~我可以
string folderId = @"0';
DROP TABLE T_Orders;
UPDATE
[T_Users]
SET
[Password] = '000000' --"; //SQL的--注释就是要把folderId + "'";后面的'干掉,方法还有很多.我不列举了.
伪SQL是
WHERE FieldDeleteMark = delete AND
FieldFolderId = '0';
DROP TABLE T_Orders; --亮点在这行
UPDATE
[T_Users]
SET
[Password] = '000000' -- '
2010-07-28 23:20 | dotNetDR_
#22楼 回复 引用 查看
@牛腩多表查询,尽量最多只对三个表关联起来查询。
2010-07-28 23:26 | Jeffrey.Dan
#23楼 回复 引用 查看
引用Eric Liao:一两年经验还会让SQL注入攻击漏洞存在?
不敢多言...。
一、二十年经验还会让SQL注入攻击漏洞存在!
2010-07-28 23:27 | 我是打酱油的
#24楼 回复 引用 查看
@Jeffrey.Dan你的这个说法没有任何根据啊,没有任何道理说多表查询尽量最多只对三个表查询,表的连接多少要看具体的业务,需要用到多少表,就用到多少表。我这里经常七八个表进行join。
2010-07-29 08:22 | ocean
#25楼 回复 引用 查看
菜包,肉包,饭桶的我来了,哈哈!顶一下 继续关注一下2010-07-29 08:24 | 贺臣
#26楼 回复 引用 查看
我发现,我们这边两个工作了1~2年的程序员,吃饭时不会用筷子,总是夹不住,经常插进鼻孔里。当然也不能怪罪人家,他们也是刚参加工作1-2年,还没有像我这么丰富的技术经验、安全意识。
过两天我也写一篇大作,教大家如何使用筷子。
2010-07-29 08:54 | 张磊_larry.zhang
#27楼 回复 引用 查看
虽然把自己夸的天花乱坠,分享精神还是值得肯定的。。谢谢LZ分享~~
2010-07-29 08:54 | Tonny Lau
#28楼 回复 引用 查看
4:函数的注释写得很棒,对初学者学习模仿起了一个好榜样这个强!学习了!!
2010-07-29 09:03 | dax.net
#29楼 回复 引用 查看
嗯 支持一下 分享精神很好也让人学到了一定的东西
2010-07-29 09:20 | 星云一点
#30楼 回复 引用 查看
"查询代码思路严谨得有些过分,实在是过分,区区一个动态查询居然分了9个步骤来实现,思路细腻严谨得让人实在是佩服啊,不佩服不行啊,菜鸟程序员的骄傲、学习模仿的楷模,呵呵"王婆卖瓜,自卖自夸,不过你的瓜确实很好,夸的也很过分啊!
2010-07-29 09:59 | yanglover
#31楼[楼主] 回复 引用 查看
@yanglover谢谢支持,哈哈。
2010-07-29 10:12 | 吉日嘎拉 不仅权限管理
#32楼[楼主] 回复 引用 查看
听到你这句话后,很多人都要跳楼了,呵呵。引用Eric Liao:
一两年经验还会让SQL注入攻击漏洞存在?
不敢多言...。
2010-07-29 10:15 | 吉日嘎拉 不仅权限管理
#33楼[楼主] 回复 引用 查看
一直见N多人,都在写有漏洞的SQL拼接,这也是时代的需要,其实我们需要的就是实实在在的,而不是云里雾里的什么狗屁云技术等忽悠人的东西,呵呵。引用型格小妖:拼sql之类的东西就不要上首页了,污染大家视线
2010-07-29 10:17 | 吉日嘎拉 不仅权限管理
#34楼[楼主] 回复 引用 查看
谢谢支持啊。引用贺臣:菜包,肉包,饭桶的我来了,哈哈!顶一下 继续关注一下
2010-07-29 10:17 | 吉日嘎拉 不仅权限管理
#35楼[楼主] 回复 引用 查看
很多人写程序思路凌乱,没注释没说明,让维护的人是头疼啊。引用dax.net:
4:函数的注释写得很棒,对初学者学习模仿起了一个好榜样
这个强!学习了!!
2010-07-29 10:18 | 吉日嘎拉 不仅权限管理
#36楼[楼主] 回复 引用 查看
谢谢支持啊引用星云一点:
嗯 支持一下 分享精神很好
也让人学到了一定的东西
2010-07-29 10:18 | 吉日嘎拉 不仅权限管理
#37楼[楼主] 回复 引用 查看
我不自夸,别人是不会自动夸我的呀,哈哈。引用Tonny Lau:
虽然把自己夸的天花乱坠,分享精神还是值得肯定的。。
谢谢LZ分享~~
2010-07-29 10:18 | 吉日嘎拉 不仅权限管理
#38楼[楼主] 回复 引用 查看
大哥,你总是把话说得这么实在,让人不得不佩服啊引用我是打酱油的:
引用Eric Liao:
一两年经验还会让SQL注入攻击漏洞存在?
不敢多言...。
一、二十年经验还会让SQL注入攻击漏洞存在!
2010-07-29 10:19 | 吉日嘎拉 不仅权限管理
#39楼[楼主] 回复 引用 查看
未必是吓人了,你看点击量,推荐量,就应该知道这篇文章是否有价值了,是吓人吗?引用菩提小鸟:吉日又出来吓人了!
2010-07-29 10:20 | 吉日嘎拉 不仅权限管理
#40楼 回复 引用 查看
NHIBERNATE吧2010-07-29 10:30 | Rioyang
#41楼 回复 引用 查看
拼SQL的话,可以在sql的统一入口把这些特殊字符过滤掉。2010-07-29 10:31| 深山老林
#42楼 回复 引用 查看
我是来看评论的...我一般不看吉日文章的内容,只看评论.
因为评论比内容精彩多了...
2010-07-29 10:46 | 透明梦柯
#43楼 回复 引用 查看
把易变化的查询字段剥离出来,带来微弱性能影响,但是却极大的改善了表结构变化带来的困难。确实是个好办法引用例如查询条件输入“吉日'嘎拉”其中有单引号,很可能这个查询的页面就崩溃了出现了错误页面,或者跳转到出错页面了,若有这样的情况发生,几乎99.3721%都可以看做是有潜在的SQL注入攻击漏洞。
这个倒是未必,因为进攻式编程,设计者可能会按常人正确的操作进行设计,发现意外情况,即报错误,例如int.Parse(),这样虽然错了,但是并不会引起注入
2010-07-29 10:55 | 人生就是赌
#44楼 回复 引用
吉日思想不够坚定,一个B2C就把你一直标榜的信念/目标给打碎了~~~2010-07-29 11:05 | Mr.R[未注册用户]
#45楼 回复 引用 查看
为什么要拼接呢....这是为什么呢?....
点击量高我觉得多半是冲作者来的....
2010-07-29 11:08 | 安静的瞬间
#46楼 回复 引用 查看
.NET创建query的时候可以给你自己传入parameter数组,就跟string.Format一样。类库已经帮你排除了所有的注入的可能,你为什么还要自己拼接字符串呢?2010-07-29 11:24 | 陈梓瀚(vczh)
#47楼 回复 引用 查看
我是来看评论的,文章压根没看2010-07-29 11:26 | 绯雨
#48楼[楼主] 回复 引用 查看
1:string.Format 有那么强的功能吗?2:写parameter数组,难道就自己不拼接sql语句了?这个是哪里跟哪里啊?
引用陈梓瀚(vczh):.NET创建query的时候可以给你自己传入parameter数组,就跟string.Format一样。类库已经帮你排除了所有的注入的可能,你为什么还要自己拼接字符串呢?
2010-07-29 11:40 | 吉日嘎拉 不仅权限管理
#49楼[楼主] 回复 引用 查看
你知道为啥自己总是不提高了吧?就是因为没看文章,没学到重点知识,没能抓住重点。引用绯雨:我是来看评论的,文章压根没看
2010-07-29 11:41| 吉日嘎拉 不仅权限管理
#50楼 回复 引用 查看
我想请问下楼主. 存储过程会不会好点? 感觉拼接有些性能影响呀. 而且被注入基本都是字符串拼接的问题.2010-07-29 11:47 | Capricornus
#51楼[楼主] 回复 引用 查看
存储过程与sql语句本质上差别不是很大,若在存储过程里拼接了SQL语句,照样存在注入攻击的问题,存储过程的移植性不大好,例如sqlserver上写了一大对存储过程,要在Oracle上运行,那会出人命的,改动量不是开玩笑的。引用Capricornus:我想请问下楼主. 存储过程会不会好点? 感觉拼接有些性能影响呀. 而且被注入基本都是字符串拼接的问题.
2010-07-29 11:53 | 吉日嘎拉 不仅权限管理
#52楼 回复 引用 查看
引用陈梓瀚(vczh):.NET创建query的时候可以给你自己传入parameter数组,就跟string.Format一样。类库已经帮你排除了所有的注入的可能,你为什么还要自己拼接字符串呢?lz拼sql已经成瘾,食古不化的家伙
2010-07-29 12:26 | 型格小妖
#53楼[楼主] 回复 引用 查看
也不是人人都能跟上时代的步伐了,毕竟拼接sql还是大多数人在用的方法了,若没猜错,至少占 60% 是有的。引用型格小妖:
引用陈梓瀚(vczh):.NET创建query的时候可以给你自己传入parameter数组,就跟string.Format一样。类库已经帮你排除了所有的注入的可能,你为什么还要自己拼接字符串呢?
lz拼sql已经成瘾,食古不化的家伙
2010-07-29 12:39 | 吉日嘎拉 不仅权限管理
#54楼 回复 引用
@吉日嘎拉 不仅权限管理还好,我是其余40的人。:)
2010-07-29 13:14 | bravf[未注册用户]
#55楼 回复 引用 查看
我是来看评论的2010-07-29 13:15 | 箜
#56楼 回复 引用
我想知道,如果查询的内容本身就包括%会怎样,结果会如何?%是数据
2010-07-29 13:54 | _Kong_[未注册用户]
#57楼 回复 引用 查看
挑几个刺1.
引用int delete = deleteMark ? 1: 0;
数据库中bool类型和int类型会自动隐式转换,此处代码冗余
2.
引用string sqlQuery = string.Empty;
sqlQuery = " SELECT " + BaseNewsTable.FieldId
+ " ," + BaseNewsTable.FieldFolderId
+ " ," + BaseNewsTable.FieldTitle
+ " ," + BaseNewsTable.FieldFilePath
+ " ," + BaseNewsTable.FieldFileSize
+ " ," + BaseNewsTable.FieldReadCount
+ " ," + BaseNewsTable.FieldDescription
+ " ," + BaseNewsTable.FieldCategoryCode
+ " ," + BaseNewsTable.FieldEnabled ...
如此多的字符串拼接还不用StringBuilder,实在说不过去
3.
引用if (searchValue.IndexOf("%")< 0)
此处先取索引值后与0比较,建议改为searchValue.Contains("%")
2010-07-29 14:32 | Roy Ming
#58楼 回复 引用 查看
引用吉�%相关文章推荐
- 简单高效防注入攻击的动态多参数、动态SQL语句拼接方法,提高网站的安全性
- 简单高效防注入攻击的动态多参数、动态SQL语句拼接方法,提高网站的安全性
- 简单高效防注入攻击的动态多参数、动态SQL语句拼接方法,提高网站的安全性
- 简单高效防注入攻击的动态多参数、动态SQL语句拼接方法,提高网站的安全性
- 简单高效防注入攻击的动态多参数、动态SQL语句拼接方法,提高网站的安全性
- 简单高效防注入攻击的动态多参数、动态SQL语句拼接方法,提高网站的安全性
- 简单高效防注入攻击的动态多参数、动态SQL语句拼接方法,提高网站的安全性
- 简单高效防注入攻击的动态多参数、动态SQL语句拼接方法,提高网站的安全性
- 简单高效防注入攻击的动态多参数、动态SQL语句拼接方法,提高网站的安全性
- 简单高效防注入攻击的动态SQL语句拼接方法,提高网站的安全性
- MySQL中limit使用动态参数的解决方法(拼接SQL字符串语句来执行SQL)
- 使用动态SQL语句是最简单的处理方法。
- 参数化提交SQL语句和拼接SQL语句安全性分析 SQL注入 简单对比分析
- 参数化提交SQL语句和拼接SQL语句安全性分析 SQL注入 简单对比分析
- 一个数据库查询方法(可以动态设置查询参数,设置查询条件),很巧妙的组合sql语句
- MyBatis 向Sql语句中动态传参数·动态SQL拼接
- 多条件查询--使用dapper命令参数动态拼接出最安全的sql语句
- 存储过程update吧 sql语句拼接(列是动态参数)
- SQL注入专题--整理帖 && like 语句拼sql 如何防止注入攻击。
- 动态执行SQL语句,并输出参数