软考复习资料.doc_第1页
软考复习资料.doc_第2页
软考复习资料.doc_第3页
软考复习资料.doc_第4页
软考复习资料.doc_第5页
已阅读5页,还剩130页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

上学吧 数据窗口自适应打印纸张大小函数名: f_dw_ZoomWritten by Vial.Z参数: datawindow dw_print- 要打印的数据窗口 integer nMinZoom - 极限缩小比例(缩小范围不能太大,否则不清晰)返回值: -1 error 0 找不到合适的值 0 找到的合理值作用:纸张大小满足数据窗口的要求,返回100; 当数据窗口宽度太大,无法在一页纸张上打印时,该程序寻找一个最佳缩小比例值, 使得数据窗口的内容恰好能在当前设定的纸张下打印出来。 如窗口缩小到85%可以在一页上打印时,返回值为85-*/ if not IsValid(dw_print) thenreturn -1end ifdw_print.object.datawindow.print.preview = true /*预览模式必须打开*/dw_print.SetRedraw(FALSE)/*调整放大比例过程中,停止重绘控件,节省程序时间*/string ls_H_Page/*水平打印占据的页数*/string ls_zoom/*设定的缩小百分比整数值*/Integer li_max = 100/*从百分百大小开始测试*/integer li_min /*极限缩小值,最多缩小到nn%*/Integer li_use /*当前测试值*/Integer li_OK = 0/*最优可用值*/Integer li_count = 0/*算法循环执行的次数*/li_min = nMinZoom /*赋最小测试值*/li_use = li_max/*从原始大小(100)开始测试。逐渐缩小放大比例*/do while li_min = li_maxli_count +/*调整 zoom值,并测试当前宽度打印时横向所占的面数*/ls_zoom = string(li_use)dw_print.modify(datawindow.zoom = + ls_zoom)ls_H_Page = dw_print.describe( evaluate(PageCountAcross(),+string(dw_print.object.datawindow.firstrowonpage)+) )if Integer(ls_H_Page) = 1 then/*一页足以打印出来*/li_OK = li_use /*记录这个可用的缩小比例*/li_min = li_use + 1elseli_max = li_use - 1end ifchoose case li_max - li_mincase IS 0exitcase 0li_use = li_mincase 1li_use = li_mincase elseli_use = Int(li_max + li_min)/2) /*小于等于的最小整数*/end chooseloop/*还原窗口原大小*/if li_OK 100 thendw_print.modify(datawindow.zoom = 100 )end ifdw_print.object.datawindow.print.preview = falsedw_print.SetRedraw(TRUE) /*恢复重绘控件*/return li_OK 使用框架跨域运行不丢失session的方法首先说明原理:系统是认一个一个程序范围的,一般来说,一个IE默认为一个程序范围.框架因为有了跨域的内容,所以它首先默认的是框架程序本身的程序范围,这样使得框架内的程序范围得不到确认.为了让这个IE默认为框架内的程序范围,所以我使用了多次跳转.首先,跳出本框架,进入一个无框架的需要session值的网站页面(就叫它B服务器的页面),并在这个页面中生成一个session以便系统自动生成一个sessionID,然后又跳回到有框架的页面.因为系统已经为这个IE生成了一个sessionID,所以只要不关掉这个IE,系统一直以为这个IE是本程序范围的.这样,再次生成的session值就得以在这个ID中生存下来.也就达到了骗过系统的目的.再补充一点,二次跳转使用了不同的方式,原因是我需要把框架外的信息丢弃,而要保存框架内的信息.而不同的跳转方式会丢弃或保存跳转前的信息的。程序实现方式:文件1:框架文件:index.htm(运行在服务器A上)奇豪门业 此网页使用了框架,但您的浏览器不支持框架。 文件2:index.asp (运行在服务器B上,作用跳转和生成sessionID)if (top.location != self.location) top.location=self.location;/这个JS的目的是跳出框架运行经过以上的跳转,本IE已经有了服务器B上的sessionID,也就是说,框架虽然是在服务器A上的主框架运行,但它可以确保服务器B上的session不丢失,达到跨域运行的目的。使用MD5变换算法防穷举(冲撞)破译密码MD5是在Web应用程序中最常用的密码加密算法。由于MD5是不可逆的,因而经过MD5计算得到后的密文,不能通过逆向算法得到原文。 回顾在Web应用程序中使用MD5加密文本密码的初衷,就是为了防止数据库中保存的密码不幸泄露后被直接获得。但攻击者不但拥有数据量巨大的密码字典,而且建立了很多MD5原文/密文对照数据库,能快速地找到常用密码的MD5密文,是破译MD5密文的高效途径。然而,MD5密文数据库所使用的是最常规的MD5加密算法:原文-MD5-密文。因此,我们可以使用变换的MD5算法,使现成的MD5密文数据库无所作为。 下面演示一些变换算法的例子当然,在其它的Web开发语言中,也大同小异,完全能得到相同的结果。 变换一:循环MD5 最容易理解的变换就是对一个密码进行多次的MD5运算。自定义一个函数,它接受$data和$times两个形参,第一个是要加密的密码,第二个是重复加密的次数。实现这种变换有两种算法 ?php /迭代算法 functionmd5_1_1($data,$times=32) /循环使用MD5 for($i=0;$i0) $data=md5($data); $times-; returnmd5_1_2($data,$times);/实现递归 else return$data; ? 变换二:密文分割MD5 尽管用户的密码是不确定的字符串,但是只要经过一次MD5运算后,就会得到一个由32个字符组成的字符串,这时可以再针对这个定长字符串变换。有点BT的算法是,把这段密文分割成若干段,对每段都进行一次MD5运算,然后把这堆密文连成一个超长的字符串,最后再进行一次MD5运算,得到仍然是长度为32位的密文。 ?php /把密文分割成两段,每段16个字符 functionmd5_2_1($data) /先把密码加密成长度为32字符的密文 $data=md5($data); /把密码分割成两段 $left=substr($data,0,16); $right=substr($data,16,16); /分别加密后再合并 $data=md5($left).md5($right); /最后把长字串再加密一次,成为32字符密文 returnmd5($data); /把密文分割成32段,每段1个字符 functionmd5_2_2($data) $data=md5($data); /循环地截取密文中的每个字符并进行加密、连接 for($i=0;$i当然,这种密文分割的具体算法是数之不尽的,比如可以把原密文分割成16段每段两字符、8段每段4字符,或者每一段的字符数不相等 变换三:附加字符串干涉 在加密过程的一个步骤中,附加一个内容确定的字符串(比如说用户名),干涉被加密的数据。不可以用随机字串,因为这样会使原算法无法重现。这种算法在某些情况下是很具有优势的,比如说用于大量的用户密码加密,可以把用户名作为附加干涉字串,这样攻击者就算知道你的算法,也很难从他们手中的字典中一下子生成海量的对照表,然后大量地破译用户密码,只能有针对性的穷举为数不多的用户。 变换四:大小写变换干涉 由于PHP所提供的md5()函数返回的密文中的英文字母全部都是小写的,因此我们可以把它们全部转为大写,然后再进行一次MD5运算。 变换五:字符串次序干涉 把MD5运算后的密文字符串的顺序调转后,再进行一次MD5运算。 变换六、变换七、变换八 MD5变换算法是数之不尽的,甚至无须自己再去创造,就用上面的五个互相组合就可以搞出很BT的算法。比如说先循环加密后再分割,并在每一段上附加一个字符串再分别加密,然后变换大小写并颠倒字符串顺序后连成一个长字符串再进行MD5运算 如果真的很不幸,由于某些漏洞,比如说SQLInjection或者文件系统中的数据库被下载而异致用户密码数据暴露,那么MD5变换算法就能大大地增加破译出密码原文的难度,首先就是使网上很多的MD5原文/密文对照数据库(要知道,这是破译MD5最高效的方法)没有用了,然后就是使攻击者用常规算法去穷举一串由变换算法得到的密文而搞得焦头烂额。当然,MD5变换算法特别适合用于非开源的Web程序使用,虽说用在开源的程序中优势会被削弱(大家都知道算法),但是也能抑制MD5原文/密文对照数据库的作用。要进行这些复杂的变换运算,当然就要花费的更多的系统开销了,然而对于安全性要求很严格的系统来说,多付出一些来换取高一点的安全性,是完全值得的。使用Java范型需要注意的地方1、静态方法要想范化,需要指定其类型参数2、非范化类型中的实例方法要想范化,也需要制定其类型参数。3、范化类型中的实力方法可以直接使用其类型本身的类型参数。4、范型不是协变的,即List不是List的子类。5、不能实例化范型类型的数组,即new List3 是不合法的,提示除非类型参数是一个未绑定的通配符,即new List3 是合法的。6、构造延迟,在代码编写时我们不能通过类型参数来构造一个该类型的实例,原因是我们不知道如何构造,类型参数的实际类型是在运行时确定的。7、对于注意5所描述的问题我们有一个解决方法是List list = (List) new Object3;但是如果是运行时建立数组呢,类型信息是运行时确定的,那就换种写法T tarray = (T) new Object3;8、上面的数组构造是不被推荐的,最好的方法是将类型信息传递到方法中,如method(Class type) V array = (V)Array.newInstance(type, length); ,可以参考ArrayList类的toArray(T a)方法的实现。9、构造通配符引用,如果set是一个Set类型,则Set set2 = new HashSet(set);是不合法的,改成Set set2 = new HashSet(set);就合法了。使用C#编写查询IP段功能的程序本文将通过一个实例来向大家讲解如何使用C#来编写一个具备查询IP段功能的小程序。 主要功能:查询一个IP所有的IP段.关键:从Byte数组到ulong的转换出来的数字和 IPAddress.Address 返回值的是不一样的.以下是引用片段:usingSystem; usingSystem.Collections.Generic; usingSystem.Text; usingSystem.Net; namespaceIPUtility classProgram staticvoidMain(stringargs) IPRangeManageirm=newIPRangeManage(); irm.Add(newIPRange(石家庄,,55); irm.Add(newIPRange(石家庄,,55); irm.Add(newIPRange(唐山,,55); irm.Add(newIPRange(保定,,55); Console.WriteLine(irm.Search().Name); Console.ReadLine(); publicclassIPRange privatestring_Name=string.Empty; privateulong_BeginIP=0; privateulong_EndIP=Int32.MaxValue; /*/ /IP段名称 / publicstringName getreturn_Name; set_Name=value; /*/ /?始IP / publiculongBeginIP getreturn_BeginIP; set_BeginIP=value; /*/ /?束IP / publiculongEndIP getreturn_EndIP; set_EndIP=value; /*/ /此IP段的范? / publiculongRange get returnEndIP-BeginIP; publicIPRange(stringname,stringipBegin,stringipEnd) this.Name=name; this.BeginIP=IP2A(ipBegin); this.EndIP=IP2A(ipEnd); publicstaticulongIP2A(stringip) bytebytes=IPAddress.Parse(ip).GetAddressBytes(); ulongret=0; foreach(bytebinbytes) rety.Range) return1; elsereturn-1; publicclassIPRangeManage publicIPRangeManage() privateList_IPRangeList=newList(); privatebool_NeedSort=true; publicvoidAdd(IPRangeipRange) _IPRangeList.Add(ipRange); _NeedSort=true; privatevoidSort() if(_NeedSort) _IPRangeList.Sort(newComparison(IPRange.Compare); publicIPRangeSearch(stringipString) ulongip=IPRange.IP2A(ipString); this.Sort(); foreach(IPRangeirin_IPRangeList) if(ir.BeginIP=ip) returnir; returnnull; 设计模式不是什么很高深的东西,有了这些知识大胆地学习吧。很多人说,看了很多设计模式的文章,为什么就是看不懂呢?我觉得原因可能有两个,第一就是你没有花时间认真看,第二就是看的文章不适合作为切入点。不管学习什么,切入点非常重要,如果切入点不是那么平易近人的话很可能会把你拒之门外,对于初学者来说从实例切入最合适。最好是能碰到自己做过的项目的实例作为切入点,这样你一比较就知道为什么设计模式好了。如果要把设计模式的学习境界分一下级的话,我这么分:l 第一重:能看懂设计模式的文章l 第二重:能自己写一个设计模式的骨架l 第三重:能自己编一个新的运用设计模式的例子l 第四重:能在写代码的时候想到似乎有设计模式适合,在翻阅资料后找到了这种设计模式l 第五重:在理解项目的需求后就能意识到哪里可以使用哪种设计模式进行优化l 第六重:完全掌握了设计模式的精髓,灵活使用各种设计模式以及其变种不管怎么样,多看多做多替换才是学习的办法,别人举例十个都不及自己做一个例子,被动十个原则都不及自己体会出一个原则。每一种设计模式虽然都有一个骨架,但是也不必过于强调这个形式,很多时候根据自己的需求简化一点,改变一点,或者混杂一些其它的设计模式,只要能实现目的了,也是一个不错的选择。很多人会觉得这么多种设计模式没有几种能用得上。我觉得这不是什么问题,用不上那就用不上,这些设计模式是大师经历无数大型项目后的精华,如果能在自己做的一个小项目中用上两三个就很不错了,用上二三十个的项目绝对是怪胎。用不上千万别强求,否则既不利于项目的可维护性又增加了工作量。还有很多人会觉得这些设计模式很多都是相似的。而且每个人的感觉还不一样,有人觉得A和B很相似,有人却觉得A和B很好区分,但是B和C却很相似啊。感觉很好区分,说明你看准设计模式的着重点的,感觉一样说明你看到的还是它的形。双胞胎虽然形一样,但是神肯定不一样的,只要认准设计模式解决的问题,就不会看错。 关于本系列文章本来这些内容都是用来进行公司内部每周知识分享活动的,既然有一些内容了,想想不妨就整理一下贴出来吧。也正由于这个原因,文章中的一些例子都基于团队内部成员所能理解的一些项目,可能这些项目对大家来说比较陌生,不过好处是例子相对比较贴近实际一点。本系列一共有20篇左右,除了介绍23种GOF设计模式中常用的一部分之外(一些设计模式的思想在C#语言中有了更简单的实现,一些设计模式不是很常用)还可能会介绍一些其它有用的设计模式。在这些文章中,我不会过多去说一些理论上的东西,也不会有结构图(这些内容网上到处都是),所有的内容都是围绕相对实际例子展开。我想,只有这样才能更快的吸收设计模式的神而不是其形。在看文章的时候建议你结合设计模式一书以及博客园的其它设计模式相关文章一起看,这样才能对设计模式理解的全面和充分一点。每一篇文章都会有以下部分:l 意图:抄设计模式一书的,因为意图实在是太重要,所以不得不首先列出。l 场景:以一个实际的场景来说明为什么要引入设计模式。使用C#编写DES加密程序的framework这个例子中演示了如何使用c#中的加密包进行DES算法加密,由于NGWNET中带的帮助实在是简单,和没有一样,呵呵,不过大家可以借助这个例子一窥DES加密的用法。des_demo.cs代码如下:using System;using System.Security.Cryptography;using System.IO;using System.Text;public class EncryptStringDES public static void Main(String args) if (args.Length 1) Console.WriteLine(Usage: des_demo , args0);return; / 使用UTF8函数加密输入参数UTF8Encoding utf8Encoding = new UTF8Encoding();byte inputByteArray = utf8Encoding.GetBytes(args0.ToCharArray(); / 方式一:调用默认的DES实现方法DES_CSP.DES des = DES.Create();/ 方式二:直接使用DES_CSP()实现DES的实体/DES_CSP DES = new DES_CSP(); / 初始化DES加密的密钥和一个随机的、8比特的初始化向量(IV)Byte key = 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef;Byte IV = 0x12, 0x34, 0x56, 0x78, 0x90, 0xab, 0xcd, 0xef;des.Key = key;des.IV = IV; / 建立加密流SymmetricStreamEncryptor sse = des.CreateEncryptor(); / 使用CryptoMemoryStream方法获取加密过程的输出CryptoMemoryStream cms = new CryptoMemoryStream(); / 将SymmetricStreamEncryptor流中的加密数据输出到CryptoMemoryStream中sse.SetSink(cms); / 加密完毕,将结果输出到控制台sse.Write(inputByteArray);sse.CloseStream(); / 获取加密数据byte encryptedData = cms.Data; / 输出加密后结果Console.WriteLine(加密结果:);for (int i = 0; i csc des_demo.csMicrosoft (R) C# Compiler Version 7.00.8905 NGWS runtime 2000.14.1812.10Copyright (C) Microsoft Corp 2000. All rights reserved.运行实例:D:csharpdes_demo.exe 使用C#编写DES加密程序的framework加密结果:3D 22 64 C6 57 D1 C4 C3 CF 77 CE 2F D0 E1 78 2A 4D ED 7A A8 83 F9 0E 14 E1 BA 387B 06 41 8D B5 E9 3F 00 0D C3 28 D1 F9 6D 17 4B 6E A7 41 68 40解密后数据:使用C#编写DES加密程序的framework 使用ASP重启服务器大家知道直接使用ASP是不能够重启服务器的,这时我们需要制作一个组件来实现功能,ASP通过这个组件调用系统API,然后按照不同的重启和关机方式进行操作! 下面先说COM的制作,在VB中新建一工程,当然是AceiveX dll的! 1)先修改工程属性,在工程属性窗口将工程名称改为system,在类模块窗口将模块名称改为contral,保存工程; 2)然后添加一个模块,用来声明需要使用的API和常数!下面是模块中的内容! Declare Function ExitWindowsEx Lib user32 (ByVal uFlags As Long, ByVal dwReserved As Long) As Long 3)在类模块中输入下列代码: Public Function reboot(atype As Variant) t& = ExitWindowsEx(1, atype) End Function 该函数需要传入一个参数,用来控制启动方式,这个参数是从ASP程序中传入的,等一下就可以看到具体的使用方法! 编写完上面的代码,保存工程,将工程编译为system.dll。下面就写ASP程序! ASP中的代码非常简单: 其中atype可以使用0、1、2、4,0、1和4均为关机,2用来重启。写完后执行ASP就可以了!JAVA 6.0 之后,其中JDK自带有个轻量级的web service 服务器。如果你比较细心一定发现在你安装java的路径下,有java webservice 的示例代码。java开发过web service ,但是当初用了一个apache 下axis 开源项目。如果axis夜进化了,不过java自带有何必舍近求远呢。最简单java webservice 范例过程记录下来,netbeans 6,首先建立一个java 应用程序工程,名为WebServices。建立一个服务端程序。package WebServices;import javax.jws. * ;import javax.xml.ws.Endpoint;/* author hecm*/WebService(targetNamespace = /JAVA-HE , serviceName = HelloService )public class WSProvider/ WebResult(name = Greetings) / 自定义该方法返回值在WSDL中相关的描述WebMethod(action = sayHi , operationName = sayHi )public String sayHi(WebParam(name = MyName ) String name)return Hi, + name; / WebParam是自定义参数name在WSDL中相关的描述Oneway / 表明该服务方法是单向的,既没有返回值,也不应该声明检查异常WebMethod(action = printSystemTime , operationName = printSystemTime ) / 自定义该方法在WSDL中相关的描述public void printTime()System.out.println(System.currentTimeMillis();public static void main(String args)Thread wsPublisher = new Thread( new WSPublisher();wsPublisher.start();private static class WSPublisher implements Runnablepublic void run()/ 发布WSProvider到http: / localhost:8888/hechangmin/WSProvider这个地址,之前必须调用wsgen命令/ 生成服务类WSProvider的支持类,命令如下:/ wsgen -cp . WebServices.WSProviderEndpoint.publish(http:/localhost:8888/JAVA-HE/WSProvider, new WSProvider();实战JDK6.0自带webservice当然建立对应的包,就不用说了。然后编译文件。进入命令提示符下,进入classes目录,运行:wsgen -cp . WebServices.WSProvider可以看到将刚才的class 生成了几个java文件和class文件。现在要做的是发布ws到http:/localhost:8888/chinajash/WSProvider而实际上的动作就是:Endpoint.publish(http:/localhost:8888/chinajash/WSProvider,new WSProvider();当然直接运行WSProvider 。然后输入http:/localhost:8888/JAVA-HE/WSProvider?wsdl就已经查看到生成的wsdl (webservice 描述语言)。也就是服务端就OK了。保持运行。编写一个测试客户端:首先选择项目,右键新建 web服务客户端。其中ws url填入刚才生成的wsdl地址:http:/localhost:8888/JAVA-HE/WSProvider?wsdl(实际上:和wsimport http:/localhost:8888/JAVA-HE/WSProvider?wsdl 一样的效果)产生一个效果:在classes下 按照 之前指定的名字空间产生的包下(目录结构)生成了7个帮助class。然后我们建立一个包 client 建立测试文件:/* To change this template, choose Tools | Templates* and open the template in the editor.*/package client;import net.blogjava.java_he. * ;/* author hecm*/public class Test public static void main(String args)HelloService hs = new HelloService();WSProvider ws = hs.getWSProviderPort();System.out.println(ws.sayHi( hechangmin );ws.printSystemTime();运行这个测试类:Hi,hechangmin输出了。顺利完成!提示:一发布的地址最好写成可配置。还有就是wsdl 中会严格按照你指定的url来访问,比如你指定的 那么你用本机IP的时候也许并不能顺利访问。实现基于IDEA算法的加密工具/*-文件名:idea.c */*- */*-功能: 利用idea加密算法实现文件的加密 */*- */*-说明: */*- 这是利用IDEA算法实现的文件加密工具可以在法律允许范围内以非商 */*-业形式自由使用,该程序的所有权利由作者吴真保留 */*- */*-版本号:1.0.0(2002.6) */*- */#include#include#include#include#include#include idea.htypedef int INT32;typedef char INT8;typedef unsigned char ULONG8;typedef unsigned short ULONG16;typedef unsigned long ULONG32;#define SUCCESS 0#define FAIL -1#define WZ_COMMEND_NUM 4#define WZUSEHELPNUM 7#define READFILESIZE 512 /*一次从文件中读取多少字节,可以根据内存的大小调节*/INT32 file_enc( FILE *readfile, FILE *writefile,ULONG8 *key);/*加密文件*/INT32 file_dec( FILE *readfile, FILE *writefile,ULONG8 *key);/*解密文件*/INT32 hextofile( ULONG8 *buf ,FILE *writefile, ULONG32 length);/*以16进制写入文件*/INT32 encodehex(ULONG8 *tobuf,ULONG8 *frombuf,ULONG32 len);/*16进制解码*/void wz_printhelp();/*打印帮助*/

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论