MSSQL网页设计解密WITH ENCRYPTION 存储历程
mysql使用内部操作字符集gbk来进行操作,即执行"SELECT*FROMtestWHEREname=xxxor1=1/*LIMIT1";从而注入成功存储历程|解密createPROCEDUREDecryptObject(@objectNamevarchar(50))
WITHENCRYPTIONAS
begin
declare@objectname1varchar(100)
declare@sql1nvarchar(4000),@sql2nvarchar(4000),@sql3nvarchar(4000),@sql4nvarchar(4000),@sql5nvarchar(4000),@sql6nvarchar(4000),@sql7nvarchar(4000),@sql8nvarchar(4000),@sql9nvarchar(4000),@sql10nvarchar(4000)
DECLARE@OrigSpText1nvarchar(4000),@OrigSpText2nvarchar(4000),@OrigSpText3nvarchar(4000),@resultspnvarchar(4000)
declare@iint,@tbigint
declare@mint,@nint,@qint
DECLARE@tablenamevarchar(255)--触发器所对应的表名
DECLARE@trigtypevarchar(6)--触发器范例
DECLARE@typechar(1)--工具范例:P-procedure;V-View;T-trigger
DECLARE@bbbit
select@i=count(1)fromsysobjectswherename=@objectName
if@i=0
begin
printObject+@objectName+isntexist!--工具不存在
return
end
select@type=casextypewhenTRthenTelsextypeendfromsysobjectswherename=@objectName
if(@typeTand@typeVand@typeP)
begin
printObject+@objectName+isntprocedureortriggerorview!--没有所必要的工具范例
return
end
select@bb=encryptedFROMsyscommentsWHEREid=object_id(@objectName)
select@m=max(colid)FROMsyscommentsWHEREid=object_id(@objectName)
if@bb=0
begin
printObject+@objectName+isnotencrypted!--工具没有加密
return
end
createtable#temp(colidint,ctextvarbinary(8000))
createtable#tempresult(cctextnvarchar(4000))
insert#tempSELECTcolid,ctextFROMsyscommentsWHEREid=object_id(@objectName)--getencrypteddata将加密信息存储于一时表中
IF@type=T--假如是触发子,则获得它的表名和范例
BEGIN
SET@tablename=(SELECTsysobjects_1.nameFROMdbo.sysobjectsINNERJOINdbo.sysobjectssysobjects_1ONdbo.sysobjects.parent_obj=sysobjects_1.idWHERE(dbo.sysobjects.type=TR)AND(dbo.sysobjects.name=@ObjectName))
SET@trigtype=(SELECTCASEWHENdbo.sysobjects.deltrig>0THENDELETEWHENdbo.sysobjects.instrig>0THENINSERTWHENdbo.sysobjects.updtrig>0THENUPDATEENDFROMdbo.sysobjectsINNERJOINdbo.sysobjectssysobjects_1ONdbo.sysobjects.parent_obj=sysobjects_1.idWHERE(dbo.sysobjects.type=TR)AND(dbo.sysobjects.name=@ObjectName))
END
SET@sql1=case@type--为修正原本的工具内容筹办ALTER语句
WHENPTHENALTERPROCEDURE+@ObjectName+WITHENCRYPTIONAS
WHENVTHENALTERVIEW+@ObjectName+WITHENCRYPTIONASSELECTdbo.dtproperties.*FROMdbo.dtproperties
WHENTTHENALTERTRIGGER+@ObjectName+ON+@tablename+WITHENCRYPTIONFOR+@trigtype+ASPRINTa
END
set@q=len(@sql1)
set@sql1=@sql1+REPLICATE(-,4000-@q)
select@sql2=REPLICATE(-,4000),@sql3=REPLICATE(-,4000),@sql4=REPLICATE(-,4000),@sql5=REPLICATE(-,4000),@sql6=REPLICATE(-,4000),@sql7=REPLICATE(-,4000),@sql8=REPLICATE(-,4000),@sql9=REPLICATE(-,4000),@sql10=REPLICATE(-,4000)
exec(@sql1+@sql2+@sql3+@sql4+@sql5+@sql6+@sql7+@sql8+@sql9+@sql10)
select@sql1=,@sql2=,@sql3=,@sql4=,@sql5=,@sql6=,@sql7=,@sql8=,@sql9=,@sql10=
set@n=1--从编号为1入手下手
while@n<=@m
begin
SET@OrigSpText1=(SELECTctextFROM#tempWHEREcolid=@n)--从一时表中取加密数据
SET@OrigSpText3=(SELECTctextFROMsyscommentsWHEREid=object_id(@objectName)andcolid=@n)--从修正过的工具获得工具数据
if@n=1--假如是第一次轮回,则必要筹办后面的开首部分的语句
begin
SET@OrigSpText2=case@type
WHENPTHENCREATEPROCEDURE+@ObjectName+WITHENCRYPTIONAS
WHENVTHENCREATEVIEW+@ObjectName+WITHENCRYPTIONASSELECTdbo.dtproperties.*FROMdbo.dtproperties
WHENTTHENCREATETRIGGER+@ObjectName+ON+@tablename+WITHENCRYPTIONFOR+@trigtype+ASPRINTa
END
set@q=4000-len(@OrigSpText2)
set@OrigSpText2=@OrigSpText2+REPLICATE(-,@q)
end
else
begin
SET@OrigSpText2=REPLICATE(-,4000)
end
SET@i=1
SET@resultsp=replicate(NA,(datalength(@OrigSpText1)/2))--filltemporaryvariable
WHILE@i<=datalength(@OrigSpText1)/2
BEGIN
--reverseencryption(XORoriginal+bogus+bogusencrypted)
SET@resultsp=stuff(@resultsp,@i,1,NCHAR(
UNICODE(substring(@OrigSpText1,@i,1))^
(
UNICODE(substring(@OrigSpText2,@i,1))^UNICODE(substring(@OrigSpText3,@i,1))
)
)
)
SET@i=@i+1
END
if@n=1beginset@sql1=@resultspend
if@n=2beginset@sql2=@resultspend
if@n=3beginset@sql3=@resultspend
if@n=4beginset@sql4=@resultspend
if@n=5beginset@sql5=@resultspend
if@n=6beginset@sql6=@resultspend
if@n=7beginset@sql7=@resultspend
if@n=8beginset@sql8=@resultspend
if@n=9beginset@sql9=@resultspend
if@n=10beginset@sql10=@resultspend
insertinto#tempresultvalues(@resultsp)--把解密数据放进了局表中
set@n=@n+1--轮回
end
droptable#temp--删除一时表
SET@resultsp=case@type
WHENPTHENdropPROCEDURE+@ObjectName
WHENVTHENdropVIEW+@ObjectName
WHENTTHENdropTRIGGER+@ObjectName
END
Execute(@resultsp)--删除工具
--从头创立工具
if@n=1beginexec(@sql1)end
if@n=2beginexec(@sql1+@sql2)end
if@n=3beginexec(@sql1+@sql2+@sql3)end
if@n=4beginexec(@sql1+@sql2+@sql3+@sql4)end
if@n=5beginexec(@sql1+@sql2+@sql3+@sql4+@sql5)end
if@n=6beginexec(@sql1+@sql2+@sql3+@sql4+@sql5+@sql6)end
if@n=7beginexec(@sql1+@sql2+@sql3+@sql4+@sql5+@sql6+@sql7)end
if@n=8beginexec(@sql1+@sql2+@sql3+@sql4+@sql5+@sql6+@sql7+@sql8)end
if@n=9beginexec(@sql1+@sql2+@sql3+@sql4+@sql5+@sql6+@sql7+@sql8+@sql9)end
if@n=10beginexec(@sql1+@sql2+@sql3+@sql4+@sql5+@sql6+@sql7+@sql8+@sql8+@sql10)end
select*from#tempresult--显现了局表
droptable#tempresult--删除了局表
end
--NCHAR依据Unicode尺度所举行的界说,用给定整数代码前往Unicode字符。
--语法NCHAR(integer_expression)
--参数
--integer_expression介于0与65535之间的一切正整数。假如指定了超越此局限的值,将前往NULL。
---------------------------------
--STUFF删除指定长度的字符并在指定的肇端点拔出另外一组字符。
--语法STUFF(character_expression,start,length,character_expression)
--参数
--character_expression由字符数据构成的表达式。character_expression能够是常量、变量,也能够是字符或二进制数据的列。
--start是一个整形值,指定删除和拔出的入手下手地位。假如start或length是正数,则前往空字符串。假如start比第一个character_expression长,则前往空字符串。
--length是一个整数,指定要删除的字符数。假如length比第一个character_expression长,则最多删除到最初一个character_expression中的最初一个字符。
你看出了作者的深度?深处半米!当初是冲那么多的大牛给他写序才买的,后来才发现无啥内容,作者也只是才用几年的新手,百花了几十两银子,再次感叹当今社会的虚伪与浮躁 但是随着数据量的增大,这种成本差距会逐渐减小,趋于相等。(500万数量级只相差10%左右) 理解了存储结构,再阅读下性能优化的章节基本上会对sqlserver有个清晰地认识 记得在最开始使用2k的时候就要用到这个功能,可惜2k没有,现在有了作解决方案的朋友会很高兴吧。 原来的计算字段其实和虚拟字段很像。只是管理方面好了而已,性能方面提高不多。但是SQL2005提供了计算字段的持久化,这就提高了查询的性能,但是会加重insert和update的负担。OLTP慎用。OLAP可以大规模使用。 但换公司用MSSQL2K感觉自己好像根本就不了解MSSQL。什么DTS触发器以前根本没用过。 索引视图2k就有。但是2005对其效率作了一些改进但是schema.viewname的作用域真是太限制了它的应用面。还有一大堆的环境参数和种种限制都让人对它有点却步。 还不是性能有问题!否则面向对象的数据库早就实现了!建议使用CLR的地方一般是和应用的复杂程度或操作系统环境有很高的耦合度的场景。如你想构建复杂的算法,并且用到了大量的指针和高级数据模型。
页:
[1]