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注入表名和字段名的获得
相关文档:
如果你经常遇到下面的问题,你就要考虑使用SQL Server的模板来写规范的SQL语句了:
SQL初学者。
经常忘记常用的DML或是DDL SQL 语句。
在多人开发维护的SQL中,每个人都有自己的SQL习惯,没有一套统一的规范。
在SQL Server Management Studio中,已经给大家提供了很多常用的现成SQL规范模板。
SQL Server Management ......
文本 nvarchar(n)
备注 ntext
数字(长整型) int
数字(整型) smallint
数字(单精度) real
数字(双精度) float
数字(字节) tinyint
货币 money
日期 smalldatetime
布尔 bit
附:转换成SQL的脚本。
ALTER TABLE tb ALTER COLUMN aa Byte 数字[字节]
ALTER TABLE tb ALTER COLUMN aa Long 数字[长整型]
ALTER T ......
1.bzscs(沙虫 我爱小美)用函數的好辦法:
CREATE function [dbo].[calc_date](@time smalldatetime,@now smalldatetime)
returns nvarchar(10)
as
begin
declare @year int,@month int,@day int
select @year = datediff(yy,@time,@now)
if (month(@now)=month(@time)) and (day ......
(转载)SQL 2K 数据类型
(1)char、varchar、text和nchar、nvarchar、ntext
char和varchar的长度都在1到8000之间,它们的区别在于char是定长字符数据,而varchar是变长字符数据。所谓定长就是长度固定的,当输入的数据长度没有达到指定的长度时将自动以英文空格在其后面填充,使长度达到相应的长度;而变长字符数据 ......
这两天都没有好好学习,今天终于算投入了些,由于课程的关系,我的sql也是同vb一起学习的。虽然知道贪多嚼不烂,可是按照实际情况,我完全没有理由抛弃sql的。
最近都把时间投入到vb和面向对象中,sql今天好好复习了下,从create database 开始,create table,alter table , add constraint …&h ......