仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 775|回复: 7
打印 上一主题 下一主题

[学习教程] MSSQL网页设计解密WITH ENCRYPTION 存储历程

[复制链接]
飘飘悠悠 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-16 22:32:15 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
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中的最初一个字符。


你看出了作者的深度?深处半米!当初是冲那么多的大牛给他写序才买的,后来才发现无啥内容,作者也只是才用几年的新手,百花了几十两银子,再次感叹当今社会的虚伪与浮躁
再现理想 该用户已被删除
沙发
发表于 2015-1-19 16:17:38 | 只看该作者
但是随着数据量的增大,这种成本差距会逐渐减小,趋于相等。(500万数量级只相差10%左右)
乐观 该用户已被删除
板凳
发表于 2015-1-26 12:50:30 | 只看该作者
理解了存储结构,再阅读下性能优化的章节基本上会对sqlserver有个清晰地认识
冷月葬花魂 该用户已被删除
地板
发表于 2015-2-4 15:17:39 | 只看该作者
记得在最开始使用2k的时候就要用到这个功能,可惜2k没有,现在有了作解决方案的朋友会很高兴吧。
谁可相欹 该用户已被删除
5#
发表于 2015-2-10 02:52:07 | 只看该作者
原来的计算字段其实和虚拟字段很像。只是管理方面好了而已,性能方面提高不多。但是SQL2005提供了计算字段的持久化,这就提高了查询的性能,但是会加重insert和update的负担。OLTP慎用。OLAP可以大规模使用。
灵魂腐蚀 该用户已被删除
6#
发表于 2015-2-28 17:17:25 | 只看该作者
但换公司用MSSQL2K感觉自己好像根本就不了解MSSQL。什么DTS触发器以前根本没用过。
活着的死人 该用户已被删除
7#
发表于 2015-3-17 04:12:14 | 只看该作者
索引视图2k就有。但是2005对其效率作了一些改进但是schema.viewname的作用域真是太限制了它的应用面。还有一大堆的环境参数和种种限制都让人对它有点却步。
分手快乐 该用户已被删除
8#
发表于 2015-3-23 19:48:13 | 只看该作者
还不是性能有问题!否则面向对象的数据库早就实现了!建议使用CLR的地方一般是和应用的复杂程度或操作系统环境有很高的耦合度的场景。如你想构建复杂的算法,并且用到了大量的指针和高级数据模型。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-5-7 02:54

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表