SQL 注入露洞相关知识整理
上上个星期,有人反馈,CSDN有SQL注入露洞,汗颜,几年前为SQL注入露洞,部门专门对所有代码做过一次非常大的检查,竟然那次检查还有遗漏的地方。最近这几个星期,就是一直再对代码做再次复查,看有没有SQL注入露洞。
存在SQL注入露洞,就因为你的SQL语句是自己拼凑的,在拼凑的时候,没有考虑用户可能拼凑进有问题的语句造成的。
之前我们采去的避免措施是,对接受的参数的校验进行封装,所有参数的获得,都必须通过这个封装的函数来获得。但是实际开发中,总有些地方,有些代码没有调用这个封装的函数来进行校验。
上周末,公司内部讨论会的时候,决定换种思路。从避免自己拼凑SQL语句的方式来实现,具体就是开发规范中有一条,不允许用拼凑的SQL语句,要传参数,就用SqlParameter。比如下面的代码是不允许的。
string strSQL = "select UserID,UserName,Email from User where UserName = '"+aa.replace("'","''")+"'";
SqlDataReader sdr = SqlHelper.ExecuteReader(strConnStr,CommandType.Text,strSQL)
而下面的代码是允许的:
SqlParameter[] parm1 = new SqlParameter[]{
new SqlParameter("@UserName",SqlDbType.NVarChar,50)
};
parm1[0].Value = strUserName;
string strSQL = "select UserID,UserName,Email from user where UserName = @UserName ";
SqlDataReader sdr = SqlHelper.ExecuteReader(strConnStr,CommandType.Text,strSQL,parm1)
原因:SqlParameter 会自动处理参数的校验,就类似使用存储过程是不会出现SQL注入露洞的问题一样。
一些SQL注入有关的知识点:
如何SQL注入:
http://www.54nb.com/Read.Asp?ID=1451672&Type=71
SQL注入中有用的几个SQL语句
[N] = 第N個表
ID=1 and (Select top 1 name from(Select top [N] id,name from sysobjects where xtype=char(85)) T order by id desc)>1
[T] = 表名
[N] = 第N個字段
ID=1 and (Select Top 1 col_name(object_id('[T]'),[N]) from sysobjects)>1
SQL注入表名和字段名的获得
相关文档:
/*第几页必须大于1
select top 每页数量 * id
from @t a
where id not in
(select top (第几页-1)*每页数量 id
from @t b
)
*/
declare @lcSqlCommand nvarchar(100)
declare @t table (id int IDENTITY,orderDate datetime)
insert into @t
select orderDate
&nb ......
索引类型
唯一索引:唯一索引不允许两行具有相同的索引值
主键索引:为表定义一个主键将自动创建主键索引,主键索引是唯一索引的特殊类型。主键索引要求主键中的每个值是唯一的,并且不能为空
聚集索引(Clustered):表中各行的物理顺序与键值的逻辑(索引)顺序相同,每个表只能有一个
非聚集索引(Non-clustered):非聚 ......
(转载)SQL 2K 数据类型
(1)char、varchar、text和nchar、nvarchar、ntext
char和varchar的长度都在1到8000之间,它们的区别在于char是定长字符数据,而varchar是变长字符数据。所谓定长就是长度固定的,当输入的数据长度没有达到指定的长度时将自动以英文空格在其后面填充,使长度达到相应的长度;而变长字符数据 ......
存储过程代码:
--drop procedure p_page
--go
create procedure p_page
(
@Tables varchar(1000), --表名如testtable
@PrimaryKey varchar(100),--表的主键,必须唯一性
@Sort varchar(200) = NULL,--排序字段如f_Name asc或f_name desc(注意只能有一个排序字段)
@CurrentPage int = 1,--当 ......
SQL面试题
Sql常用语法
下列语句部分是Mssql语句,不可以在access中使用。
SQL分类:
DDL—数据定义语言(CREATE,ALTER,DROP,DECLARE)
DML—数据操纵语言(SELECT,DELETE,UPDATE,INSERT)
DCL—数据控制语言(GRANT,REVOKE,COMMIT,ROLLBACK) 首先,简要介绍基础语句:
1、说明:创建 ......