sqlserver
电脑系统安装-virtual cd
2023年4月4日发(作者:windows7系统怎么样)ufeff========================================第1页========================================如何查看sqlserver日志的方法定期分析sqlserver日志是DBA很重要的任务,那如何才能查看sqlserver日志呢? 在SQL Server 7.0和SQL Server2000中,可以用下面的命令查看: DBCC log ( {dbid|dbname}, [, type={0|1|2|3|4}] ) 参数: Dbid or dbname - 任一数据库的ID或名字 type - 输出结果的类型: 0 - 最少信息(operation, context, transaction id) 1 - 更多信息(plus flags, tags, row length) 2 - 非常详细的信息(plus object name, index name,page id, slot id) 3 - 每种操作的全部信息 4 - 每种操作的全部信息加上该事务的16进制信息 默认 type = 0 要查看MSATER数据库的事务日志可以用以下命令: DBCC log (master) 释放日志空间释放日志空间释放日志空间释放日志空间1.清空日志 DUMP TRANSACTION 库名 WITH NO_LOG 2.截断事务日志: BACKUP LOG 数据库名 WITH NO_LOG 3.收缩数据库文件(如果不压缩,数据库的文件不会减小 企业管理器--右键你要压缩的数据库--所有任务--收缩数据库--收缩文件 --选择日志文件--在收缩方式里选择收缩至XXM,这里会给出一个允许收缩到的最小M数,直接输入这个数,确定就可以了 --选择数据文件--在收缩方式里选择收缩至XXM,这里会给出一个允许收缩到的最小M数,直接输入这个数,确定就可以了 也可以用SQL语句来完成 --收缩数据库 ========================================第2页========================================DBCC SHRINKDATABASE(客户资料) --收缩指定数据文件,1是文件号,可以通过这个语句查询到:select * from sysfiles DBCC SHRINKFILE(1) 4.为了最大化的缩小日志文件(如果是sql 7.0,这步只能在查询分析器中进行) a.分离数据库: 企业管理器--服务器--数据库--右键--分离数据库 b.在我的电脑中删除LOG文件 c.附加数据库: 企业管理器--服务器--数据库--右键--附加数据库 此法将生成新的LOG,大小只有500多K 或用代码: 下面的示例分离 pubs,然后将 pubs 中的一个文件附加到当前服务器。 a.分离 E X E C sp_detach_db @dbname = 'pubs' b.删除日志文件 c.再附加 E X E C sp_attach_single_file_db @dbname = 'pubs文件大小) --SQL语句的设置方式: alter database 数据库名 modify file(name=逻辑文件名,maxsize=20) 特别注意: 请按步骤进行,未进行前面的步骤,请不要做后面的步骤 否则可能损坏你的数据库. 一般不建议做第4,6两步 第4步不安全,有可能损坏数据库或丢失数据 第6步如果日志达到上限,则以后的数据库处理会失败,在清理日志后才能恢复. 另外提供一种更简单的方法,建议大家使用。 更简单的方法: 1。右建数据库属性窗口--故障还原模型--设为简单 2。右建数据库所有任务--收缩数据库 3。右建数据库属性窗口--故障还原模型--设为大容量日志记录 ========================================第3页========================================ASP制作显IP签名图片 <%tType = "image/gif" ConnDatabase Dim tempip,myipnumeber,sql,rs1 Dim country,city tempip=ReqIP tempip = Split(tempip,".") if Ubound(tempip)=3 then For i=0 To Ubound(tempip) tempip(i)=left(tempip(i),3) if isnumeric(tempip(i)) then tempip(i)=cint(tempip(i)) else tempip(i)=0 end if next myipnumeber=tempip(0)*256*256*256+tempip(1)*256*256+tempip(2)*256+tempip(3) End If sql="select country,city from DV_Address where IP1="&myipnumeber set rs1=e(sql) if not Then country = rs1(0) city = rs1(1) Else country = "" city = "" End If : Set rs1 = Nothing CloseDatabase Dim LocalFile,TargetFile LocalFile = h("") Dim Jpeg Set Jpeg = Object("") If -2147221005=Err then "没有这个组件,请安装!" '检查是否安装AspJpeg组件 () ========================================第4页========================================End If (LocalFile) '打开图片 If then "打开图片失败,请检查路径!" () End if Dim aa aa= '将原始数据赋给aa '=========加文字水印====/============= = &H000000 '水印文字颜色 = "宋体" '字体 = False '是否加粗 = 12 '字体大小 Color = &Hffffff '阴影色彩 YOffset = 1 XOffset = 1 = False y = 4 ' '输出质量 ext 30,30,"-------------------------------------" '水印位置及文字 ext 30,50," 你的IP: "& ReqIP ext 30,70," 你的位置: "&country&" "&city ext 30,90," 操作系统: "&ClientInfo(0) ext 30,110," 浏 览 器: "&RegExpFilter("Microsoft® ", ClientInfo(1), 0, "") ext 30,130,"-------------------------------------" ext 30,145,"个性签名来自风易在线 " bb= '将文字水印处理后的值赋给bb,这时,文字水印没有不透明度 '============调整文字透明度================ Set MyJpeg = Object("") nary aa Set Logo = Object("") nary bb age 0,0, Logo, 0.9 '0.3是透明度 cc= '将最终结果赋值给cc,这时也可以生成目标图片了 Write cc '将二进输出给浏览器 set aa=nothing set bb=nothing set cc=nothing : Set Jpeg = Nothing ========================================第5页======================================== : Set MyJpeg = Nothing : Set Logo = Nothing %> '-------------------------------------------------- 'File: <%dim conn,dbpath,UserIP sub ConnDatabase On Error Resume next set conn=object("tion") DBPath = h("") "Provider=.4.0;Data Source=" & DBPath If Err Then Set Conn = Nothing "数据库正在更新中,请稍后再试!" End If End Sub Sub CloseDatabase Set Conn = Nothing End Sub%> '------------------------------------------------- 'File: <% Dim User_Agent User_Agent = Variables("HTTP_USER_AGENT") ' ============================================ ' 获取客户端配置 ' ============================================ Public Function ClientInfo(sType) If sType = 0 Then If InStr(User_Agent, "Windows 98") Then ClientInfo = "Windows 98" ElseIf InStr(User_Agent, "Win 9x 4.90") Then ClientInfo = "Windows ME" ElseIf InStr(User_Agent, "Windows NT 5.0") Then ClientInfo = "Windows 2000" ElseIf InStr(User_Agent, "Windows NT 5.1") Then ========================================第6页========================================ClientInfo = "Windows XP" ElseIf InStr(User_Agent, "Windows NT 5.2") Then ClientInfo = "Windows 2003" ElseIf InStr(User_Agent, "Windows NT") Then ClientInfo = "Windows NT" ElseIf InStr(User_Agent, "unix") or InStr(User_Agent, "Linux") or InStr(User_Agent, "SunOS") or InStr(User_Agent, "BSD") Then ClientInfo = "Unix & Linux" Else ClientInfo = "Other" End If ElseIf sType = 1 Then If InStr(User_Agent, "MSIE 7") Then ClientInfo = "Microsoft® Internet Explorer 7.0" ElseIf InStr(User_Agent, "MSIE 6") Then ClientInfo = "Microsoft® Internet Explorer 6.0" ElseIf InStr(User_Agent, "MSIE 5") Then ClientInfo = "Microsoft® Internet Explorer 5.0" ElseIf InStr(User_Agent, "MSIE 4") Then ClientInfo = "Microsoft® Internet Explorer 4.0" ElseIf InStr(User_Agent, "Netscape") Then ClientInfo = "Netscape®" ElseIf InStr(User_Agent, "Opera") Then ClientInfo = "Opera®" Else ClientInfo = "Other" End If End If End Function ' ============================================ ' 按照指定的正则表达式替换字符 ' ============================================ Public Function RegExpFilter(Patrn, Str, sType, ReplaceWith) Dim RegEx Set RegEx = New RegExp If sType = 1 Then = True Else = False End If n = Patrn ========================================第7页========================================Case = True RegExpFilter = e(Str, ReplaceWith) End Function Public Function ReqIP() ReqIP = Variables("HTTP_X_FORWARDED_FOR") If ReqIP = "" or IsNull(ReqIP) Then ReqIP = Variables("REMOTE_ADDR") End Function %> 网站被上传木马(网站被黑)如何处理有时会收到一些客户反映网站被黑,或被上传木马,当用户访问网站时就会下载病毒或者木马,杀毒软件弹出病毒的提示. 这种情况是以下2种情况导致的. 第一种情况第一种情况第一种情况第一种情况: : : : 客户网站存在文件上传漏洞客户网站存在文件上传漏洞客户网站存在文件上传漏洞客户网站存在文件上传漏洞....导致黑客可以使用这漏洞导致黑客可以使用这漏洞导致黑客可以使用这漏洞导致黑客可以使用这漏洞,,,,上传黑客上传黑客上传黑客上传黑客文件文件文件文件.... 然后黑客可以对该用户网站所有文件进行任意修改,这种情况比较普遍.针对这种情况, 用户需要找技术人员. 检查出网站漏洞并彻底修复,并检查看网站是否还有黑客隐藏的恶意文件. 原因: 很多网站都需要使用到文件上传功能,例如很多网站需要发布产品图片等. 文件上传功能本来应该具有严格的限定. 例如:只允许用户只能上传JPG,GIF等图片. 但由于程序开发人员考虑不严谨,或者直接是调用一些通用的文件上传组件, 导致没对文件上传进行严格的检查. 处理: 处理关键是要用户自己知道自己网站哪些地方使用到了文件上传功能. 重点针对这个文件上传功能进行检查, 同时针对网站所有文件进行检查,排查可疑信息. 同时也利用网站日志,对文件被修改时间进行检查, 1) 查到哪个文件被加入代码: 用户要查看自己网页代码.根据被加入代码的位置,确定到底是哪个页面被黑, 一般黑客会去修改数据库连接文件或网站顶部/底部 文件, 因为这样修改后用户网站所有页面都会被附加代码. 2) 查到被篡改文件后,使用Ftp查看文件最后被修改时间, 例如 Ftp里面查看到文件被黑,最后修改时间是 2008-2-22 10:34 分, 那么可以确定在 2008-2-22日10:34 分这个时间 有黑客使用他留下的黑客后门,篡改了你的这个文件. 到底是哪个文件? 可以使用网站日志查出来. 在 的虚拟主机管理里面. 使用获取网站日志功能. 获得到 2008-2-20 日的网站日志. 由于日志记录和真实时间有8小时时间差, 所以您要检查的时间是 2:34分 左右. 以下是一个日志记录案例. ========================================第8页========================================2008-02-22 02:34:16 W3SVC23 211.155.230.227 GET / 2008-02-22 02:34:29 W3SVC23 211.155.230.227 GET / 2008-02-22 02:34:29 W3SVC23 211.155.230.227 POST /news/uppic/ 2008-02-22 02:36:03 W3SVC23 211.155.230.227 GET /prod_ id=59 2008-02-22 02:38:56 W3SVC23 211.155.230.227 GET /prod_ id=63 用户可以根据日志判定 /news/uppic/ 这个文件 应该是黑客上传的文件. 3) 再重复2) 步. 查看文件修改时间,再查出到底是哪个文件 导致上传了 这个文件. 查看到 文件修改时间是2008-02-20 18:58分, 找到有问题的文件. 结果追查到有问题的文件是 . 2008-02-20 10:57:37 W3SVC23 211.155.230.227 GET /prod_ cid=18 2008-02-20 10:58:03 W3SVC23 211.155.230.227 POST /news/admin/ 2008-02-20 11:08:43 W3SVC23 211.155.230.227 GET /uploadpic/ 4) 就这样循环.最后可以查出是哪个文件有文件上传漏洞, 要修复这些文件上传漏洞,并彻底检查网站代码,彻底删除黑客其他隐藏的黑客文件. 注意注意注意注意:::: 1) 1) 1) 1) 很多用户网站被黑后很多用户网站被黑后很多用户网站被黑后很多用户网站被黑后,,,,只是将被串改的文件修正过来只是将被串改的文件修正过来只是将被串改的文件修正过来只是将被串改的文件修正过来....或重新上传或重新上传或重新上传或重新上传, , , , 这样是这样是这样是这样是没多大作用没多大作用没多大作用没多大作用. . . . 如果网站不修复漏洞如果网站不修复漏洞如果网站不修复漏洞如果网站不修复漏洞....黑客可以很快再次利用这漏洞黑客可以很快再次利用这漏洞黑客可以很快再次利用这漏洞黑客可以很快再次利用这漏洞,,,,对用户网站对用户网站对用户网站对用户网站再次入侵再次入侵再次入侵再次入侵.... 2) 2) 2) 2) 网站漏洞的检查和修复需要一定的技术人员才能处理网站漏洞的检查和修复需要一定的技术人员才能处理网站漏洞的检查和修复需要一定的技术人员才能处理网站漏洞的检查和修复需要一定的技术人员才能处理....用户需要先做好文件用户需要先做好文件用户需要先做好文件用户需要先做好文件的备份的备份的备份的备份.... 第二种情况: 用户本地机器中毒了. 修改了用户自己本地的网页文件.然后用户自己将这些网页文件上传到服务器空间上了. 这种情况比较少. 如是这种情况用户要先彻底检查自己网站. 1. 这种病毒一般是搜索本地磁盘的文件,在网页文件的源代码中插入一段带有病毒的代码,而一般最常见的方式是插入一个 iframe ,然后将这个 iframe 的 src 属性指向到一个带有病毒的网址。 2. 如何检测这种情况呢? (1).浏览网站,右键查看源代码,在源代码里搜索 iframe ,看看有没有被插入了一些不是自己网站的页面,如果有,一般就是恶意代码。 (2). 也是右键查看源代码,搜索 "script" 这个关键字,看看有没有被插入一些不是自己域名下的的脚本,如果有,并且不是自己放上去的,那很可能也有问题。 ========================================第9页========================================3.这种病毒怎么杀呢? (1).有些人会说用查毒程序查过本地没有发现病毒,这就要看看本地的网站文件是否带有这些恶意代码,如果有,那基本上可以肯定你的机器是曾经中过毒的,这些病毒可能不是常驻内存的,并且有可能执行一次之后就将自己删除,所以用查毒程序查不出来是很正常的。 (2).就算这些病毒是常驻内存,杀毒程序也可能查不出来,因为这种病毒的原理很简单,其实就是执行一下文件磁盘扫描,找到那些网页文件(如 asp php html)等格式的文件,然后打开它插入一段代码,然后再保存一下。因为它修改的不是什么系统文件,病毒防火墙一般不会发出警告,如果它不是挂在一些系统进程里,而是在某个特定的时刻运行一下就退出,这样被查出的可能性更少。 (3).手工删除这些病毒的一般方法: a. 调出任务管理器,看看有没有一些不知名的程序在运行,如果有,用windows的文件查找功能找到这个文件,右键查看属性,如果这个可执行文件的摘要属性没有任何信息,而自己又不知道是什么东西,那很可能有问题,然后上google搜索一个这个文件的信息,看看网上的资料显示是不是就是病毒,如果是就先将其改名。。 b. 打开注册表编辑器,查看一下 HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionRun有没有一可疑的启动项,有的话就删除. c. 查看本地机器的 windows 控制面板,看看“任务计划”那里有没有一些不是自己定义的任务,如果有查看属性,找到这个任务所执行的可执行文件是哪个,重复前面步骤 a 的方法进行查杀。 可能还有其它一些方法,暂时没想到。。。 4. 中毒的常见原因: 一般是因为上了一些烂网站,这些网站有木马,然后机器就中毒了,我们的服务器一般不会中毒的,因为我们的工作人员不会在服务器上上一些乱七八糟的网站,中毒的可能性很少。至于说其它客户上传了一些有问题的程序然后令服务器中毒也是不成立的,因为普通的客户的IIS进程是没有权限去修改其它客户的网站的。ASP网站漏洞解析及黑客入侵防范方法如何更好的达到防范黑客攻击,本人提一下个人意见!第一,免费程序不要真的就免费用,既然你可以共享原码,那么攻击者一样可以分析代码。如果在细节上注意防范,那样你站点的安全性就大大的提高了。即使出现了SQL Injection这样的漏洞,攻击者也不可能马上拿下你的站点。 由于ASP的方便易用,越来越多的网站后台程序都使用ASP脚本语言。但是, 由于ASP本身存在一些安全漏洞,稍不小心就会给黑客提供可乘之机。事实上,安全不仅是网管的事,编程人员也必须在某些安全细节上注意,养成良好的安全习惯,否则会给自己的网站带来巨大的安全隐患。目前,大多数网站上的ASP程序有这样那样的安全漏洞,但如果编写程序的时候注意一点的话,还是可以避========================================第10页========================================免的。 1、用户名与口令被破解 攻击原理:用户名与口令,往往是黑客们最感兴趣的东西,如果被通过某种方式看到源代码,后果是严重的。 防范技巧:涉及用户名与口令的程序最好封装在服务器端,尽量少在ASP文件里出现,涉及与数据库连接的用户名与口令应给予最小的权限。出现次数多的用户名与口令可以写在一个位置比较隐蔽的包含文件中。如果涉及与数据库连接,在理想状态下只给它以执行存储过程的权限,千万不要直接给予该用户修改、插入、删除记录的权限。2、验证被绕过 攻击原理:现在需要经过验证的ASP程序大多是在页面头部加一个判断语句,但这还不够,有可能被黑客绕过验证直接进入。 防范技巧:需要经过验证的ASP页面,可跟踪上一个页面的文件名,只有从上一页面转进来的会话才能读取这个页面。 3、inc文件泄露问题 攻击原理:当存在ASP的主页正在制作且没有进行最后调试完成以前,可以被某些搜索引擎机动追加为搜索对象。如果这时候有人利用搜索引擎对这些网页进行查找,会得到有关文件的定位,并能在浏览器中查看到数据库地点和结构的细节,并以此揭示完整的源代码。 防范技巧:程序员应该在网页发布前对它进行彻底的调试;安全专家则需要加固ASP文件以便外部的用户不能看到它们。首先对.inc文件内容进行加密,其次也可以使用.asp文件代替.inc文件使用户无法从浏览器直接观看文件的源代码。inc文件的文件名不要使用系统默认的或者有特殊含义容易被用户猜测到的名称,尽量使用无规则的英文字母。 4、自动备份被下载 攻击原理:在有些编辑ASP程序的工具中,当创建或者修改一个ASP文件时,编辑器自动创建一个备份文件,比如:UltraEdit就会备份一个.bak文件,如你创建或者修改了,编辑器会自动生成一个叫文件,如果你没有删除这个bak文件,攻击者可以直接下载文件,这样的源程序就会被下载。 防范技巧:上传程序之前要仔细检查,删除不必要的文档。对以BAK为后缀的文件要特别小心。 ========================================第11页========================================5、特殊字符 攻击原理:输入框是黑客利用的一个目标,他们可以通过输入脚本语言等对用户客户端造成损坏;如果该输入框涉及数据查询,他们会利用特殊查询语句,得到更多的数据库数据,甚至表的全部。因此必须对输入框进行过滤。但如果为了提高效率仅在客户端进行输入合法性检查,仍有可能被绕过。 防范技巧:在处理类似留言板、BBS等输入框的ASP程序中,最好屏蔽掉HTML、JavaScript、VBScript语句,如无特殊要求,可以限定只允许输入字母与数字,屏蔽掉特殊字符。同时对输入字符的长度进行限制。而且不但要在客户端进行输入合法性检查,同时要在服务器端程序中进行类似检查。 6、数据库下载漏洞 攻击原理:在用Access做后台数据库时,如果有人通过各种方法知道或者猜到了服务器的Access数据库的路径和数据库名称,那么他也能够下载这个Access数据库文件,这是非常危险的。 防范技巧: (1)为你的数据库文件名称起个复杂的非常规的名字,并把它放在几层目录下。所谓 “非常规”, 打个比方说,比如有个数据库要保存的是有关书籍的信息, 可不要给它起个“”的名字,而要起个怪怪的名称,比如, 并把它放在如./kdslf/i44/studi/的几层目录下,这样黑客要想通过猜的方式得到你的Access数据库文件就难上加难了。 (2)不要把数据库名写在程序中。有些人喜欢把DSN写在程序中,比如: DBPath = h(“”) “driver={Microsoft Access Driver (*.mdb)};dbq=” & DBPath 假如万一给人拿到了源程序,你的Access数据库的名字就一览无余了。因此建议你在ODBC里设置数据源,再在程序中这样写: “shujiyuan” (3)使用Access来为数据库文件编码及加密。首先在“工具→安全→加密/解密数据库”中选取数据库(如:),然后按确定,接着会出现“数据库加密后另存为”的窗口,可存为:“”。 要注意的是,以上的动作并不是对数据库设置密码,而只是对数据库文件加以编码,目的是为了防止他人使用别的工具来查看数据库文件的内容。 ========================================第12页========================================接下来我们为数据库加密,首先打开经过编码了的 ,在打开时,选择“独占”方式。然后选取功能表的“工具→安全→设置数据库密码”,接着输入密码即可。这样即使他人得到了文件,没有密码他也是无法看到 中的内容。 7、防范远程注入攻击 这类攻击在以前应该是比较常见的攻击方式,比如POST攻击,攻击者可以随便的改变要提交的数据值已达到攻击目的.又如:COOKIES 的伪造,这一点更值得引起程序编写者或站长的注意,不要使用COOKIES来做为用户验证的方式,否则你和把钥匙留给贼是同一个道理. 比如: If trim(Request. cookies ("uname"))="fqy" and s("upwd") =”fqy#” then ……..more……… End if 我想各位站长或者是喜好写程序的朋友千万别出这类错误,真的是不可饶恕.伪造COOKIES 都多少年了,你还用这样的就不能怪别人跑你的密码.涉及到用户密码或者是用户登陆时,你最好使用session 它才是最安全的.如果要使用COOKIES就在你的COOKIES上多加一个信息,SessionID,它的随机值是64位的,要猜解它,不可能.例: if not ( or ) then login="true" Session("username"&sessionID) = Username Session("password"& sessionID) = Password ‘s(“username”)= Username ‘s(“Password”)= Password 下面我们来谈谈如何防范远程注入攻击,一般的攻击都是将单表提交文件拖到本地,将Form ACTION=”” 指向你服务器中处理数据的文件即可.如果你全部的数据过滤都在单表页上,那么恭喜你,你将已经被脚本攻击了. 怎么才能制止这样的远程攻击?好办,请看代码如下: 程序体(9) <% server_v1=Cstr(Variables("HTTP_REFERER")) server_v2=Cstr(Variables("SERVER_NAME")) if mid(server_v1,8,len(server_v2))<>server_v2 then ========================================第13页======================================== "<br><br><center>" " " "你提交的路径有误,禁止从站点外部提交数据请不要乱改参数!" " " end if %> ‘个人感觉上面的代码过滤不是很好,有一些外部提交竟然还能堂堂正正的进来,于是再写一个. ‘这个是过滤效果很好,建议使用. if instr(variables("http_referer"),"http://"&rvariables("host") )<1 then "处理 URL 时服务器上出错。 如果您是在用任何手段攻击服务器,那你应该庆幸,你的所有操作已经被服务器记录,我们会第一时间通知公安局与国家安全部门来调查你的IP. " end if 程序体(9) 本以为这样就万事大吉了,在表格页上加一些限制,比如maxlength啦,等等..但天公就是那么不作美,你越怕什么他越来什么.你别忘了,攻击者可以突破sql注入攻击时输入框长度的限制.写一个SOCKET程序改变HTTP_REFERER?我不会。网上发表了这样一篇文章: ----------------------------- Windows Registry Editor Version 5.00 [HKEY_CURRENT_USERSoftwareMicrosoftInternet ExplorerMenuExt扩展(&E)] @="C:Documents and SettingsAdministrator桌面" "contexts"=dword:00000004 -----------end---------------------- ----------------------------- ----------end----------------------- ========================================第14页========================================用法:先把导入注册表(注意文件路径) 然后把拷到注册表中指定的地方. 打开网页,光标放在要改变长度的输入框上点右键,看多了一个叫扩展的选项了吧 单击搞定! 后记:同样的也就可以对付那些限制输入内容的脚本了. 怎么办?我们的限制被饶过了,所有的努力都白费了?不,举起你de键盘,说不。让我们继续回到脚本字符的过滤吧,他们所进行的注入无非就是进行脚本攻击。我们把所有的精力全都用到ACTION以后的页面吧,在页中,我们将非法的字符全部过滤掉,结果如何?我们只在前面虚晃一枪,叫他们去改注册表吧,当他们改完才会发现,他们所做的都是那么的徒劳。 8、ASP木马 已经讲到这里了,再提醒各位论坛站长一句,小心你们的文件上传:为什么论坛程序被攻破后主机也随之被攻击者占据。原因就在……对!ASP木马!一个绝对可恶的东西。病毒么?非也.把个文件随便放到你论坛的程序中,您老找去吧。不吐血才怪哦。如何才能防止ASP木马被上传到服务器呢?方法很简单,如果你的论坛支持文件上传,请设定好你要上传的文件格式,我不赞成使用可更改的文件格式,直接从程序上锁定,只有图象文件格式,和压缩文件就完全可以,多给自己留点方便也就多给攻击者留点方便。怎么判断格式,我这里收集了一个,也改出了一个,大家可以看一下: 程序体(10) ’判断文件类型是否合格 Private Function CheckFileExt (fileEXT) dim Forumupload Forumupload="gif,jpg,bmp,jpeg" Forumupload=split(Forumupload,",") for i=0 to ubound(Forumupload) if lcase(fileEXT)=lcase(trim(Forumupload(i))) then CheckFileExt=true exit Function else CheckFileExt=false end if next End Function ‘验证文件内容的合法性 ========================================第15页========================================set MyFile = Object ("stemObject") set MyText = xtFile (sFile, 1) ’ 读取文本文件sTextAll = lcase(l): ’判断用户文件中的危险操作 sStr ="8 .getfolder .createfolder .deletefolder .createdirectory.deletedirectory" sStr = sStr & " .saveas " sNoString = split(sStr," ") for i = 1 to sNoString(0) if instr(sTextAll, sNoString(i)) <> 0 then sFile = & sFileSave: File sFile "<center><br><big>"& sFileSave &"文件中含有与操作目录等有关的命令"&_ "<br><font color=red>"& mid(sNoString(i),2) &"</font>,为了安全原因,<b>不能上传。<b>"&_"</big></center></html>" end if next 把他们加到你的上传程序里做一次验证,那么你的上传程序安全性将会大大提高. 还不放心?拿出杀手锏,请你的虚拟主机服务商来帮忙吧。登陆到服务器,将PROG ID 中的"ation"项和"ation.1"项改名或删除。再将””项和”.1”这两项都要改名或删除。 ASP中获取地址栏字符函数Function GetLocationURL() Dim Url Dim ServerPort,ServerName,ScriptName,QueryString ServerName = Variables("SERVER_NAME") ServerPort = Variables("SERVER_PORT") ScriptName = Variables("SCRIPT_NAME") ========================================第16页========================================QueryString = Variables("QUERY_STRING") Url="http://"&ServerName If ServerPort "80" Then Url = Url & ":" & ServerPort Url=Url&ScriptName If QueryString "" Then Url=Url&"?"& QueryString GetLocationURL=Url End Function GetLocationURL() 禁止让别人对自己用p2pover 如果是Vista 系统,开始,输入:“cmd” 步骤①,查找所属网络连接。方法如下:在命令提示符下面直接输入:netsh i i show in 会出来以下内容:C:UsersGaoYx>netsh i i show in Idx Met MTU 状态名称--- --- ----- ----------- ------------------- 1 50 4294967295 connected Loopback Pseudo-Interface 1 8 25 1500 disconnected 无线网络连接9 20 1500 connected 本地连接如果你用的是有线网络,就是9(无线网络就是8,这里以有线网络为例)。步骤②,查找网关的IP地址和MAC地址。方法如下:========================================第17页========================================在命令提示符下面直接输入:arp -a 会出来以下内容:C:UsersGaoYx>arp -a 接口: 192.168.0.111 --- 0x9 Internet 地址物理地址类型192.168.0.1 00-0f-3d-1d-e5-99 动态其中,192.168.0.1是机器的网关(当然该网关有可能是192.168.1.1或者其他,这里以192.168.0.1为例)其中,00-0f-3d-1d-e5-99 是网关的MAC地址。步骤③,绑定网关的IP地址和MAC地址。方法如下:新建记事本文件,内容为:netsh -c "i i" add neighbors 9 "192.168.0.1" "00-0f-3d-1d-e5-99" 保存为.bat文件。文件名可以任意取,如: 然后右键,以管理员身份运行。说明:这里9,是指步骤①中的本地连接;192.168.0.1是指网关的IP地址;00-0f-3d-1d-e5-99是指网关的MAC地址。步骤④,验证是否已经绑定成功。在命令提示符下面直接输入:arp -a 会出来以下内容:C:UsersGaoYx>arp -a 接口: 192.168.0.111 --- 0x9 Internet 地址物理地址类型192.168.0.1 00-0f-3d-1d-e5-99 静态========================================第18页========================================从刚才的动态,到现在的静态,表明已经绑定成功。这样,别人用p2pover就不能对你产生作用。如果你的机子是XP,方法如下:步骤①,查找网关的IP地址和MAC地址。方法如下:在命令提示符下面直接输入:arp -a 会出来以下内容:C:UsersGaoYx>arp -a 接口: 192.168.0.111 --- 0x9 Internet 地址物理地址类型192.168.0.1 00-0f-3d-1d-e5-99 动态其中,192.168.0.1是机器的网关(当然该网关有可能是192.168.1.1或者其他,这里以192.168.0.1为例)其中,00-0f-3d-1d-e5-99 是网关的MAC地址。步骤②,绑定网关的IP地址和MAC地址。方法如下:新建记事本文件,内容为:arp -s 192.168.0.1 00-0f-3d-1d-e5-99 保存为.bat文件。文件名可以任意取,如: 然后双击运行。说明:这里192.168.0.1是指网关的IP地址;00-0f-3d-1d-e5-99是指网关的MAC地址。========================================第19页========================================P2Pover类软件的分析与解决p2pover是一个在局域网中用来限制其他用户上网流量以及自动限制p2p下载软件的工具,这款软件本来是用于商业公司内部的,但是被一些人破解以后在网上流传,便变成了恶意限制他人的工具了. p2pover的原理无非是ARP嗅探和ARP欺骗 ARP(Address Resolution Protocol)是地址解析协议,是一种将IP地址转化成物理地址的协议.从IP地址到物理地址的映射有两种方式:表格方式和非表格方式.ARP具体说来就是将网络层(IP层,也就是相当于OSI的第三层)地址解析为数据连接层(MAC层,也就是相当于OSI的第二层)的MAC地址. 在网络中当A向B通信时,首先会查询本地的ARP缓存表,找到B的IP地址对应的MAC地址后,就会进行数据传输.如果没有找到,A会向B发送一个则ARP请求报文,此报文中会有A的IP地址,MAC地址以及B的IP地址等,请求B回应它本机的IP地址和MAC地址,网络上的所有主机都会收到此报文,但是只有B能够识别自己的IP,因此只有B才会向回应A,同理回应中也会包括B的IP地址,MAC地址,以及A的IP地址和MAC地址等.A接收到B的应答后,就会更新本地的ARP缓存,接着使用这个MAC地址发送数据.所谓的ARP地址解析协议实际上是,当计算机接受到APR应答的数据包之后,其会将此数据包中的IP和MAC存储在本地的ARP缓存中. 那么局域网中是怎么实现限制别人上网的呢,或者干脆使别人断网. 假设A是网络中的路由,当B回应A的ARP应答时,如果B回应的数据包中的IP是C的,MAC地址是一个伪造的,由于网络中流通是按照MAC地址来进行传输的,所以A就会更新它本地的ARP缓存表,而这个缓存表中C的MAC地址是伪造的,也就是使C的网络不通了. 建议解决方法: 第一,就是修改自己本机的MAC地址了,不过这个方法自己觉的不是很好,在"开始"--"运行"--输入regedit,HKEY_LOCAL_MACHINESystemCurrentControlSetControlClass {4D36E972-E325-11CE-BFC1-08002BE103 18}子键,在子键下的0000,0001,0002等分支中查找DriverDesc(如果你有一块以上的网卡,就有0001,0002......在这里保存了有关你的网卡的信息),假设你的网卡在0000子键,在0000子键下添加一个字符串,命名为"NetworkAddress",键值为修改后的MAC地址,要求为连续的12个16进制数,然后在"0000"子键下的NDIparams中新建一项名为NetworkAddress的子键,在该子键下添加名为"default"的字符串,键值为修改后的MAC地址,在NetworkAddress的子键下继续建立名为"ParamDesc"的字符串,其作用为指定Network Address的描述,其值可为"MAC Address",这样以后打开网络邻居的"属性",双击相应的网卡就会发现有一个"高级"设置,其下存在MAC ========================================第20页========================================Address的选项,它就是你在注册表中加入的新项"NetworkAddress",以后只要在此修改MAC地址就可以了.关闭注册表,重新启动,你的网卡地址已经改变.打开网络邻居的属性,双击相应网卡项会发现有一个MAC Address的高级设置项,用于直接修改MAC地址. 第二,p2pover这种软件都是发给你一个伪造的网关的MAC地址,使你无法上网的,所以我们可以绑定本机IP和MAC地址,以及网关的IP和MAC "开始"--"运行"--cmd 先ping一下你的网关,然后用arp -a命令,会出现你局域网的网关的MAC,然后用"arp -s 网关ip 网关mac",来绑定,如果ip后面的状态是"static",说明绑定成功,这样在你被封的时候就可以用这两条命令解封了,你也可以做成一个批处理文件,新建记事本,把 arp -s 网关ip 网关mac 写入,保存为.bat结尾的文件.另外绑定之前可用arp -d 删除一下以前的绑定,如果想取消绑定也可以用这个命令. 第三,我们可以利用一些网络上的反p2p软件,典型的有网络剪刀手,和arp防火墙,这里就不提供下载了,如果需要的话就在google上搜吧,多的很. 第四,我们要找到对方是谁在搞鬼,可以利用Arpkiller的"Sniffer杀手",扫描整个局域网IP段,然后查找处在"混杂"模式下的计算机,就可以发现对方了.运行Arpkiller,点击"Sniffer监测工具",出现的"Sniffer杀手"窗口中输入检测的起始和终止IP,单击"开始检测".如果相应的IP是绿帽子图标,说明这个IP处于正常模式,如果是红帽子则说明该网卡处于混杂模式.那么它就是搞鬼的人,用网络剪刀手把它KA了.然后再用你的p2pover来控制它,当然这种做法不推荐了(p2pover是那个在先,哪个就有控制权)或者可以装一个Anti ARP Sniffer防火墙. 第五,linux环境下: 需要用 #ifconfig eth0 down 先把网卡禁用 再用ifconfig eth0 hw ether 1234567890ab 这样就可以改成功了 要想永久改就这样 在/etc/rc.d/里加上这三句(也可以在/etc/init.d/network里加下面三行) ifconfig eth0 down ifconfig eth0 hw ether 1234567890ab ifconfig eth0 up 第六,还有一种防止限制流量的方法,把默认设置子网掩码255.255.255.0改成255.240.0.0,还可以上网,P2POVER就没法限制了. ========================================第21页========================================CSS图片的垂直居中CSS代码 1.ul{ listlistlistlist----stylestylestylestyle----typetypetypetype:none; paddingpaddingpaddingpadding:0; marginmarginmarginmargin:0 auto; widthwidthwidthwidth:602px; backgroundbackgroundbackgroundbackground----colorcolorcolorcolor:#CDCDCD; borderborderborderborder:#0000001pxsolid; overfoverfoverfoverflowlowlowlow:hidden; positionpositionpositionposition:relative} 2.li{listlistlistlist----stylestylestylestyle----typetypetypetype:none; widthwidthwidthwidth:200px; floatfloatfloatfloat:left; paddingpaddingpaddingpadding:0 0 30px0; marginmarginmarginmargin:0; verticalverticalverticalvertical----alignalignalignalign:middle;positionpositionpositionposition:relative;displaydisplaydisplaydisplay:inline; fontfontfontfont:150px/normal"Times new roman"; *paddingpaddingpaddingpadding:0;*fontfontfontfont----sizesizesizesize:180px; texttexttexttext----alignalignalignalign:center} 3.li img {verticalverticalverticalvertical----alignalignalignalign:middle;backgroundbackgroundbackgroundbackground:#fff;fontfontfontfont----sizesizesizesize:12px;paddingpaddingpaddingpadding:2px; borderborderborderborder:solid1px#555;} 4.li a:hover{ texttexttexttext----indentindentindentindent:0;/*IE6 使用的 :hover*/} 5.li a:hover img{paddingpaddingpaddingpadding:1px;borderborderborderborder:solid2px#336699;} 6.li strong{displaydisplaydisplaydisplay:block; fontfontfontfont:12px/150% Arial;positionpositionpositionposition:absolute;bottombottombottombottombottom:0;left:0;widthwidthwidthwidth:100%; } 7.li strong a{displaydisplaydisplaydisplay:block; paddingpaddingpaddingpadding:8px4px;colorcolorcolorcolor:#336699;texttexttexttext----decoratidecoratidecoratidecorationononon:none;} XML/HTML代码 1.2.3.4.图文垂直居中,图文垂直居中,图文垂直居中,图文垂直居中,5.6.7.8.开发的上课了9.10. 11. 12. 开发的上课了13. ========================================第22页========================================14. 15. 16. 开发的上课了17. 18. 19. 20. 开发的上课了21. 22. 23. 24. 开发的上课了25. 26.>>什么是DOCTYPE DOCTYPE是是是是document type(文档类型文档类型文档类型文档类型)的简写的简写的简写的简写,,,,用来说明你用来说明你用来说明你用来说明你用的用的用的用的XHTML或者或者或者或者HTML是什么版本是什么版本是什么版本是什么版本。。。。其中的DTD(例如上例中的)叫文档类型定义,里面包含了文档的规则,浏览器就根据你定义的DTD来解释你页面的标识,并展现出来。要建立符合标准的网页,DOCTYPE声明是必不可少的关键组成部分;除非你的XHTML确定了一个正确的DOCTYPE,否则你的标识和CSS都不会生效。XHTML 1.0 提供了三种DTD声明可供选择:过渡的(Transitional):要求非常宽松的DTD,它允许你继续使用HTML4.01的标识(但是要符合xhtml的写法)。完整代码如下: 严格的(Strict):要求严格的DTD,你不能使用任何表现层的标识和属性,例如。完整代码如下: 框架的(Frameset):专门针对框架页面设计使用的DTD,如果你的页面中包含有框架,需要采用这种DTD。完整代码如下: 我们选择什么样的DOCTYPE 理想情况当然是严格的DTD,但对于我们大多数刚接触web标准的设计师来说,过渡的DTD(XHTML 1.0 Transitional)是目前理想选择(包括本站,使用的也是过渡型DTD)。因为这种DTD还允许我们使用表现层的标识、元素和属性,也比较容易通过W3C的代码校验。注:上面说的"表现层的标识、属性"是指那些纯粹用来控制表现的tag,例如用于排版的表格、背景颜色标识等。在XHTML中标识是用来表示结构的,而不是用来实现表现形式,我们过渡的目的是最终实现数据和表现相分离。打个比方:人体模特换衣服。模特就好比数据,衣服则是表现形式,模特和衣服是分离的,这样你就可以随意换衣服。而原来HTML4中,数据和表现是混杂在一起的,要一次性换个表现形式非常困难。呵呵,有点抽象了,这个概念需要我们在应用过程中逐步领会。补充DOCTYPE声明必须放在每一个XHTML文档最顶部,在所有代码和标识之上。C#中StringBuilder类的使用String 对象是不可改变的。每次使用 类中的方法之一时,都要在内存中创建一个新的字符串对象,这就需要为该新对象分配新的空间。在需要对字符串执行重复修改的情况下,与创建新的String 对象相关的系统开销可能会非常昂贵。如果要修改字符串而不创建新的对象,则可以使用Builder 类。例如,当在一个循环中将许多字符串连接在一起时,使用StringBuilder 类可以提升性能。通过用一个重载的构造函数方法初始化变量,可以创建StringBuilder 类的新实例,正如以下示例中所阐释的那样。StringBuilder MyStringBuilder = new StringBuilder("Hello World!"); (一)设置容量和长度虽然StringBuilder 对象是动态对象,允许扩充它所封装的字符串中字符的数量,但是您可以为它可容纳的最大字符数指定一个值。此值称为该对象的容量,不应将它与当前StringBuilder 对象容纳的字符串长度混淆在一起。例如,可以创建StringBuilder 类的带有字符串“Hello”(长度为5)的一个新实例,同时可以指定该对象的最大容量为25。当修改StringBuilder 时,在达到容量之前,它不会为其自己重新分配空间。当达到容量时,将自动分配新的空间且容量翻倍。可以使用重载的构造函数之一来指定StringBuilder 类的容量。========================================第24页========================================以下代码示例指定可以将MyStringBuilder 对象扩充到最大25 个空白。StringBuilder MyStringBuilder = new StringBuilder("Hello World!", 25); 另外,可以使用读/写Capacity 属性来设置对象的最大长度。以下代码示例使用Capacity 属性来定义对象的最大长度。ty = 25; (二)下面列出了此类的几个常用方法:(1)Append 方法可用来将文本或对象的字符串表示形式添加到由当前StringBuilder 对象表示的字符串的结尾处。以下示例将一个StringBuilder 对象初始化为“Hello World”,然后将一些文本追加到该对象的结尾处。将根据需要自动分配空间。StringBuilder MyStringBuilder = new StringBuilder("Hello World!"); (" What a beautiful day."); ine(MyStringBuilder); 此示例将Hello World! What a beautiful day. 显示到控制台。(2)AppendFormat 方法将文本添加到StringBuilder 的结尾处,而且实现了IFormattable 接口,因此可接受格式化部分中描述的标准格式字符串。可以使用此方法来自定义变量的格式并将这些值追加到StringBuilder 的后面。以下示例使用AppendFormat 方法将一个设置为货币值格式的整数值放置到StringBuilder 的结尾。int MyInt = 25; StringBuilder MyStringBuilder = new StringBuilder("Your total is "); Format("{0:C} ", MyInt); ine(MyStringBuilder); 此示例将Your total is $25.00 显示到控制台。(3)Insert 方法将字符串或对象添加到当前StringBuilder 中的指定位置。以下示例使用此方法将一个单词插入到StringBuilder 的第六个位置。StringBuilder MyStringBuilder = new StringBuilder("Hello World!"); (6,"Beautiful "); ine(MyStringBuilder); 此示例将Hello Beautiful World! 显示到控制台。(4)可以使用Remove 方法从当前StringBuilder 中移除指定数量的字符,移除过程从指定的从零开始的索引处开始。以下示例使用Remove 方法缩短StringBuilder。StringBuilder MyStringBuilder = new StringBuilder("Hello World!"); (5,7); ine(MyStringBuilder); 此示例将Hello 显示到控制台。(5)使用Replace 方法,可以用另一个指定的字符来替换StringBuilder 对象内的字符。以下示例使用Replace 方法来搜索StringBuilder 对象,查找所有的感叹号字符(!),并用问号字符(?) 来替换它们。StringBuilder MyStringBuilder = new StringBuilder("Hello World!"); e('!path = h("/news/"); Encoding code = oding("gb2312"); // 读取模板文件 stringtemp = h("/news/"); StreamReader sr=null; StreamWriter sw=null; stringstr=""; try{ sr = newStreamReader(temp, code); str = End(); // 读取文件 } catch(Exception exp) { (e); (); (); } 此函数放在基类中了 在添加新闻的代码中引用 注:工程名为Hover ========================================第26页========================================if(ng),this.String),this.ng))) { ("添加成功"); } else{ ("生成HTML出错!"); } 模板页代码 Code: ShowArticlebiaoti contentauthor biaoti contentauthor ========================================第27页======================================== 牢记!SQL Server数据库开发的二十一条军规如果你正在负责一个基于SQL Server的项目,或者你刚刚接触SQL Server,你都有可能要面临一些数据库性能的问题,这篇文章会为你提供一些有用的指导(其中大多数也可以用于其它的DBMS)。在这里,我不打算介绍使用SQL Server的窍门,也不能提供一个包治百病的方案,我所做的是总结一些经验----关于如何形成一个好的设计。这些经验来自我过去几年中经受的教训,一直来,我看到许多同样的设计错误被一次又一次的重复。一、了解你用的工具不要轻视这一点,这是我在这篇文章中讲述的最关键的一条。也许你也看到有很多的SQL Server程序员没有掌握全部的T-SQL命令和SQL Server提供的那些有用的工具。“什么?我要浪费一个月的时间来学习那些我永远也不会用到的SQL命令???”,你也许会这样说。对的,你不需要这样做。但是你应该用一个周末浏览所有的T-SQL命令。在这里,你的任务是了解,将来,当你设计一个查询时,你会记起来:“对了,这里有一个命令可以完全实现我需要的功能”,于是,到MSDN查看这个命令的确切语法。二、不要使用游标让我再重复一遍:不要使用游标。如果你想破坏整个系统的性能的话,它们倒是你最有效的首选办法。大多数的初学者都使用游标,而没有意识到它们对性能造成的影响。它们占用内存,还用它们那些不可思议的方式锁定表,另外,它们简直就像蜗牛。而最糟糕的是,它们可以使你的DBA所能做的一切性能优化等于没做。不知你是否知道每执行一次FETCH就等于执行一次SELECT命令?这意味着如果你的游标有10000条记录,它将执行10000次SELECT!如果你使用一组SELECT、UPDATE或者DELETE来完成相应的工作,那将有效率的多。初学者一般认为使用游标是一种比较熟悉和舒适的编程方式,可很不幸,这会导致糟糕的性能。显然,SQL的总体目的是你要实现什么,而不是怎样实现。我曾经用T-SQL重写了一个基于游标的存储过程,那个表只有100,000条记录,原来的存储过程用了40分钟才执行完毕,而新的存储过程只用了10秒钟。在这里,我想你应该可以看到一个不称职的程序员究竟在干了什么!!!我们可以写一个小程序来取得和处理数据并且更新数据库,这样做有时会更有效。记住:对于循环,T-SQL无能为力。我再重新提醒一下:使用游标没有好处。除了DBA的工作外,我从来没有看到过使用游标可以有效的完成任何工作。三、规范化你的数据表为什么不规范化数据库?大概有两个借口:出于性能的考虑和纯粹因为懒惰。至于第二点,你迟早得为此付出代价。而关于性能的问题,你不需要优化根本就不慢的东西。我经常看到一些程序员“反规范化”数据库,他们的理由是“原来的设计太慢了”,可结果却常常是他们让系统更慢了。DBMS被设计用来处理规范数据库的,因此,记住:按照规范化的要求设计数据库。========================================第28页========================================四、不要使用SELECT * 这点不太容易做到,我太了解了,因为我自己就经常这样干。可是,如果在SELECT中指定你所需要的列,那将会带来以下的好处:1 减少内存耗费和网络的带宽2 你可以得到更安全的设计3 给查询优化器机会从索引读取所有需要的列五、了解你将要对数据进行的操作为抽薪,这些问题统统不存在了。十二、在程序编码时使用大数据量的数据库程序员在开发中使用的测试数据库一般数据量都不大,可经常的是最终用户的数据量都很大。我们通常的做法是不对的,原因很简单:现在硬盘不是很贵,可为什么性能问题却要等到已经无可挽回的时候才被注意呢?========================================第29页========================================十三、不要使用INSERT导入大批的数据请不要这样做,除非那是必须的。使用UTS或者BCP,这样你可以一举而兼得灵活性和速度。十四、注意超时问题查询数据库时,一般数据库的缺省都比较小,比如15秒或者30秒。而有些查询运行时间要比这长,特别是当数据库的数据量不断变大时。十五、不要忽略同时修改同一记录的问题有时候,两个用户会同时修改同一记录,这样,后一个修改者修改了前一个修改者的操作,某些更新就会丢失。处理这种情况不是很难:创建一个timestamp字段,在写入前检查它,如果允许,就合并修改,如果存在冲突,提示用户。十六、在细节表中插入纪录时,不要在主表执行SELECT MAX(ID) 这是一个普遍的错误,当两个用户在同一时间插入数据时,这会导致错误。你可以使用SCOPE_IDENTITY,IDENT_CURRENT和IDENTITY。如果可能,不要使用IDENTITY,因为在有触发器的情况下,它会引起一些问题(详见这里的讨论)。十七、避免将列设为NULLable 如果可能的话,你应该避免将列设为NULLable。系统会为NULLable列的每一行分配一个额外的字节,查询时会带来更多的系统开销。另外,将列设为NULLable使编码变得复杂,因为每一次访问这些列时都必须先进行检查。我并不是说NULLS是麻烦的根源,尽管有些人这样认为。我认为如果你的业务规则中允许“空数据”,那么,将列设为NULLable有时会发挥很好的作用,但是,如果在类似下面的情况中使用NULLable,那简直就是自讨苦吃。CustomerName1 CustomerAddress1 CustomerEmail1 CustomerName2 CustomerAddress2 CustomerEmail3 CustomerName1 CustomerAddress2 CustomerEmail3 如果出现这种情况,你需要规范化你的表了。十八、尽量不要使用TEXT数据类型除非你使用TEXT处理一个很大的数据,否则不要使用它。因为它不易于查询,速度慢,用的不好还会浪费大量的空间。一般的,VARCHAR可以更好的处理你的数据。十九、尽量不要使用临时表尽量不要使用临时表,除非你必须这样做。一般使用子查询可以代替临时表。使用临时况下, 回滚段(rollback segments ) 用来存放可以被恢复的信息. 如果你没有COMMIT事务,ORACLE会将数据恢复到删除之前的状态(准确地说是恢复到执行删除命令之前的状况) 而当运用TRUNCATE时, 回滚段不再存放任何可被恢复的信息.当命令运行后,数据不能被恢复.因此很少的资源被调用,执行时间也会很短. (译者按: TRUNCATE只在删除全表适用,TRUNCATE是DDL不是DML) (10)尽量多使用COMMIT:只要有可能,在程序中尽量多使用COMMIT, 这样程序的性能得到提高,需求也会因为COMMIT所释放的资源而减少: COMMIT所释放的资源: a. 回滚段上用于恢复数据的信息. b. 被程序语句获得的锁c. redo log buffer 中的空间d. ORACLE为管理上述3种资源中的内部花费========================================第31页========================================(11)用Where子句替换HAVING子句:避免使用HAVING子句, HAVING 只会在检索出所有记录之后才对结果集进行过滤. 这个处理需要排序,总计等操作. 如果能通过WHERE子句限制记录的数目,那就能减少这方面的开销. (非oracle中)on、where、having这三个都可以加条件的子句中,on是最先执行,where次之,having最后,因为on是先把不符合条件的记录过滤后才进行统计,它就可以减少中间运算要处理的数据,按理说应该速度是最快的,where也应该比having快点的,因为它过滤数据后才进行sum,在两个表联接时才用on的,所以在一个表的时候,就剩下where跟having比较了。在这单表查询统计的情况下,如果要过滤的条件没有涉及到要计算字段,那它们的结果是一样的,只是where可以使用rushmore技术,而having就不能,在速度上后者要慢如果要涉及到计算的字段,就表示在没计算之前,这个字段的值是不确定的,根据上篇写的工作流程,where的作用时间是在计算之前就完成的,而having就是在计算后才起作用的,所以在这种情况下,两者的结果会不同。在多表联接查询时,on比where更早起作用。系统首先根据各个表之间的联接条件,把多个表合成一个临时表后,再由where进行过滤,然后再计算,计算完后再由having进行过滤。由此可见,要想过滤条件起到正确的作用,首先要明白这个条件应该在什么时候起作用,然后再决定放在那里(12)减少对表的查询:在含有子查询的SQL语句中,要特别注意减少对表的查询.例子:SELECT TAB_NAME FROM TABLES //匹配由26个英文字母的小写组成的字符串 14。^[A-Za-z0-9]+$ //匹配由数字和26个英文字母组成的字符串 15。^w+$ //匹配由数字、26个英文字母或者下划线组成的字符串 16。^[w-]+(.[w-]+)*@[w-]+(.[w-]+)+$ //匹配email地址 17。^[a-zA-z]+://匹配(w+(-w+)*)(.(w+(-w+)*))*(?S*)?$ //匹配url 18。匹配中文字符的正则表达式: [u4e00-u9fa5] 19。匹配双字节字符(包括汉字在内):[^x00-xff] 20。应用:计算字符串的长度(一个双字节字符长度计2,ASCII字符计1) =function(){returnthis.replace([^x00-xff]/g,"aa").length;} 21。匹配空行的正则表达式:[s| ]* 22。匹配HTML标记的正则表达式:/.*|/ 23。匹配首尾空格的正则表达式:(^s*)|(s*$) * 正则表达式用例 * 1、^S+[a-z A-Z]$ 不能为空 不能有空格 只能是英文字母 * 2、S{6,} 不能为空 六位以上 * 3、^d+$ 不能有空格 不能非数字 ========================================第33页========================================* 4、(.*)(.jpg|.bmp)$ 只能是jpg和bmp格式 * 5、^d{4}-d{1,2}-d{1,2}$ 只能是2004-10-22格式 * 6、^0$ 至少选一项 * 7、^0{2,}$ 至少选两项 * 8、^[s|S]{20,}$ 不能为空 二十字以上 * 9、^+?[a-z0-9](([-+.]|[_]+)?[a-z0-9]+)*@([a-z0-9]+(.|-))+[a-z]{2,6}$邮件 * 10、w+([-+.]w+)*@w+([-.]w+)*.w+([-.]w+)*([,;]s*w+([-+.]w+)*@w+([-.]w+)*.w+([-.]w+)*)* 输入多个地址用逗号或空格分隔邮件 * 11、^(([0-9]+))?[0-9]{7,8}$电话号码7位或8位或前面有区号例如(022)87341628 * 12、^[a-z A-Z 0-9 _]+@[a-z A-Z 0-9 _]+(.[a-z A-Z 0-9 _]+)+(,[a-z A-Z 0-9 _]+@[a-z A-Z 0-9 _]+(.[a-z A-Z 0-9 _]+)+)*$ "^w+((-w+)|(.w+))*@[A-Za-z0-9]+((.|-)[A-Za-z0-9]+)*.[A-Za-z0-9]+$" * 只能是字母、数字、下划线;必须有@和.同时格式要规范 邮件 * 13 ^w+@w+(.w+)+(,w+@w+(.w+)+)*$上面表达式也可以写成这样子,更精练。 14 ^w+((-w+)|(.w+))*@w+((.|-)w+)*.w+$ 固定电话的正则表达式 0d{2,3}-d{5,9}|0d{2,3}-d{5,9} 不区分区号的 ((d{3})|d{3}-)?d{8} 邮政编码或区号 /^d{6}$/ 最新手机号码正则表达式 ^1[3,5]{1}[0-9]{1}[0-9]{8}$ 关于从客户端中检测到有潜在危险的 值的最优解决方案(转 1.1后引入了对提交表单自动检查是否存在XSS(跨站脚本攻击)的能力。当用户试图用之类的输入影响页面返回结果的时候,的引擎会引发一个 HttpRequestValidationExceptioin。默认情况下会返回如下文字的页面: 以下是引用片段: Server Error in '/YourApplicationPath' Application A potentially dangerous value was detected from the client (txtName=""). ========================================第34页========================================Description: Request Validation has detected a potentially dangerous client input value, and processing of the request has been aborted. This value may indicate an attempt to compromise the security of your application, such as a cross-site scripting attack. You can disable request validation by setting validateRequest=false in the Page directive or in the configuration section. However, it is strongly recommended that your application explicitly check all inputs in this case. Exception Details: questValidationException: A potentially dangerous value was detected from the client (txtName=""). .... 这是提供的一个很重要的安全特性。因为很多程序员对安全没有概念,甚至都不知道XSS这种攻击的存在,知道主动去防护的就更少了。在这一点上做到默认安全。这样让对安全不是很了解的程序员依旧可以写出有一定安全防护能力的网站。 但是,当我Google搜索 HttpRequestValidationException 或者 "A potentially dangerous value was detected from the client"的时候,惊奇的发现大部分人给出的解决方案竟然是在页面描述中通过设置 validateRequest=false 来禁用这个特性,而不去关心那个程序员的网站是否真的不需要这个特性。看得我这叫一个胆战心惊。安全意识应该时时刻刻在每一个程序员的心里,不管你对安全的概念了解多少,一个主动的意识在脑子里,你的站点就会安全很多。 为什么很多程序员想要禁止 validateRequest 呢?有一部分是真的需要用户输入""之类的字符。这就不必说了。还有一部分其实并不是用户允许输入那些容易引起XSS的字符,而是讨厌这种报错的形式,毕竟一大段英文加上一个典型异常错误信息,显得这个站点出错了,而不是用户输入了非法的字符,可是自己又不知道怎么不让它报错,自己来处理报错。 对于希望很好的处理这个错误信息,而不使用默认异常报错信息的程序员们,你们不要禁用validateRequest=false。 正确的做法是在你当前页面添加Page_Error()函数,来捕获所有页面处理过程中发生的而没有处理的异常。然后给用户一个合法的报错信息。如果当前页面没有Page_Error(),这个异常将会送到的Application_Error()来处理,你也可以在那里写通用的异常报错处理函数。如果两个地方都没有写异常处理函数,才会显示这个默认的报错页面呢。 举例而言,处理这个异常其实只需要很简短的一小段代码就够了。在页面的Code-behind页面中加入这么一段代码: ========================================第35页========================================以下是引用片段: protected void Page_Error(object sender, EventArgs e) { Exception ex = tError(); if (ex is HttpRequestValidationException) { ("请您输入合法字符串。"); rror(); // 如果不ClearError()这个异常会继续传到Application_Error()。 } } 这样这个程序就可以截获 HttpRequestValidationException 异常,而且可以按照程序员的意愿返回一个合理的报错信息。 这段代码很简单,所以我希望所有不是真的要允许用户输入之类字符的朋友,千万不要随意的禁止这个安全特性,如果只是需要异常处理,那么请用类似于上面的代码来处理即可。 而对于那些通过 明确禁止了这个特性的程序员,自己一定要明白自己在做什么,而且一定要自己手动的检查必须过滤的字符串,否则你的站点很容易引发跨站脚本攻击。 关于存在Rich Text Editor的页面应该如何处理? 如果页面有富文本编辑器的控件的,那么必然会导致有类的HTML标签提交回来。在这种情况下,我们不得不将validateRequest="false"。那么安全性怎么处理?如何在这种情况下最大限度的预防跨站脚本攻击呢? 根据微软的建议,我们应该采取安全上称为“默认禁止,显式允许”的策略。 首先,我们将输入字符串用 code()来编码,将其中的HTML标签彻底禁止。 然后,我们再对我们所感兴趣的、并且是安全标签,通过Replace()进行替换。比如,我们希望有""标签,那么我们就将""显式的替换回""。 示例代码如下: 以下是引用片段: void submitBtn_Click(object sender, EventArgs e) ...{ // 将输入字符串编码,这样所有的HTML标签都失效了。 StringBuilder sb = new StringBuilder( code()========================================第36页========================================); // 然后我们选择性的允许 和 e("<b>", ""); e("</b>", ""); e("<i>", ""); e("</i>", ""); (ng()); } 这样我们即允许了部分HTML标签,又禁止了危险的标签。 根据微软提供的建议,我们要慎重允许下列HTML标签,因为这些HTML标签都是有可能导致跨站脚本攻击的。 以下是引用片段: # # # # #