IIS作为一款流行的Web服务器,在当今互联网环境中占有很大的比重,绝大多数的asp、asp.net网站都运行在它上面。因此,也引来了无数黑客们关注的目光。目前针对IIS的攻击技术已经非常成熟,而且相对技术门槛较低,所以很多初学者拿它来练手。许多网站因为网站管理员的安全意识不高或技术上的疏忽而惨遭毒手。本文通过实例来谈谈针对IIS的攻击技术与安全加固措施。 攻击实例 IIS写权限漏洞利用 我们先通过一个攻击实例来演示如何利用IIS权限配置不当来快速攻陷一个网站,以此来提高广大读者对IIS安全性的重视。 目标网站IP:192.168.1.105 利用漏洞:IIS写权限漏洞 用到的工具:IIS PUT Scaner、桂林老兵写权限利用工具 1 检测目标网站是否存在写权限漏洞 打开IIS PUT Scanner,输入目标网站的IP、端口号(默认为80端口),然后点击“Scan”按钮开始扫描,很快就返回了结果,如图1所示: 图1 2 IIS写权限漏洞利用过程 根据扫描结果,我们可以确定目标网站存在IIS写权限漏洞。下面我们来看下如何利用这个漏洞,来得到一个WebShell。 我们先将“”这段一句话木马代码保存成一个txt文档,名字随意。我这里命名为test.txt。接着打开桂林老兵写权限利用工具,输入目标网站的IP或域名,在“数据包格式”处的下拉菜单中选择“PUT”数据包提交方式,最后点击“数据包提交”按钮,我们来看服务器返回的结果。如图2所示: 图2 服务器返回了201响应码,这标志着我们成功上传了文件。 现在我们需要将刚刚上传的txt文本修改为asp文件,否则服务器不会将它解析为asp文件。在“数据包格式”的下拉菜单中选择“MOVE”数据包提交方式,在“Destination”处修改文件名称,默认为shell.asp,这里我修改为cmd.asp。然后点击“提交数据包”按钮,我们来看服务器返回的信息。如图3所示: 图3 服务器同样返回了“201”响应码,说明我们成功将test.txt修改为cmd.asp了。 现在我们用一句话木马客户端来连接刚上传的一句话木马,可以成功访问。如图4所示: 图4 这样我们就得到了一个WebShell。从整个攻击过程来看,用的时间很短,而且技术门槛很低,一个普通人运用工具也可以很快拿下一个网站。但遗憾的是,在实际的渗透测试过程中,依然有不少站点存在这样的漏洞,希望通过这个实例能够引起广大网络管理员对安全的重视。 IIS作为一款流行的Web服务器,在当今互联网环境中占有很大的比重,绝大多数的asp、asp.net网站都运行在它上面。因此,也引来了无数黑客们关注的目光。 IIS6.0解析漏洞利用 a. 在WEB目录下,当文件名称为类似“a.asp;b.jpg”这种格式的时候,IIS会将它解析为asp文件,如图5所示。 图5 b. 在WEB目录下,IIS6.0会将以“x.asp”这种格式命名的文件夹下的所有文件都解析为asp文件,如图6所示。 图6 上面这两点属于IIS设计的缺陷,但可惜微软认为这是IIS的特性,一直没有推出相应的安全补丁。 在尝试绕过文件上传检测时,这两种方法有时非常有效,下面是在实际渗透测试过程中遇到的一个例子。 先登录网站后台,直接上传一个asp木马,提示非法文件,不允许上传。接下来将它的名称改为1.asp;2.jpg后再次上传,发现成功上传至网站目录,如图7所示。 安全加固 这部分我们通过跟踪IIS从安装到配置的整个过程,分析其中可能面临的安全风险,并给出相应的加固措施。 IIS安装及版本的选择 在IIS安装过程中,根据具体的业务需求,只安装必要的组件,以避免安装其他一切不必要的组件带来的安全风险。如网站正常运行只需要ASP环境,那我们就没必要安装.net组件。 对于IIS版本,至少要在6.0以上,IIS5.0存在严重的安全漏洞,不过现在运行IIS5.0的服务器已经非常少了,对于这一点不用太过担心。 IIS配置 1 删除IIS默认站点 把IIS默认安装的站点删除或禁用掉。 2 禁用不必要的Web服务扩展 打开IIS 管理器,检查是否有不必要的“Web服务扩展”,如果有则禁用掉。如图8所示: 3 IIS访问权限配置 如果IIS中有多个网站,建议为每个网站配置不同的匿名访问账户。 方法: a. 新建一个账号,加入Guests组 b. “网站属性”—>“目录安全性”—>“身份验证和访问控制”,把“启用匿名访问”处,用刚新建的账户代替默认账户,如图9所示。 图9 4 网站目录权限配置 原则(如图10): 目录有写入权限,一定不要分配执行权限 目录有执行权限,一定不要分配写入权限 网站上传目录和数据库目录一般需要分配“写入”权限,但一定不要分配执行权限 其他目录一般只分配“读取”和“记录访问”权限即可 图10 5 只保留必要的应用程序扩展 根据网站的实际情况,只保留必要的应用程序扩展,其他的一律删除,尤其是像cer、asa这样极其危险的扩展,而且一般网站也不需要它,如图11。 图11 6 修改IIS日志文件配置 无论是什么服务器,日志都是应该高度重视的部分。当发生安全事件时,我们可以通过分析日志来还原攻击过程,否则将无从查起。有条件的话,可以将日志发送到专门的日志服务器保存。 先检查是否启用了日志记录,如未启用,则启用它。日志格式设置为W3C扩展日志格式,IIS中默认是启用日志记录的。 接着修改IIS日志文件保存路径,默认保存在“C:\WINDOWS\system32\LogFiles”目录下,这里修改为自定义路径。建议保存在非系统盘路径,并且IIS日志文件所在目录只允许Administrators组用户和SYSTEM用户访问,如图12。 图12 7 防止信息泄露 a. 禁止向客户端发送详细的ASP错误信息 “IIS管理器”—>“属性”—>“主目录”—>“配置”—>“调试”,选择“向客户端发送下列文本错误消息”项,自定义出错时返回的错误信息,如图13。 图13 b. 修改默认错误页面 “IIS管理器”—>“属性”—>“自定义错误”,用自定义的错误页面替换默认的默认页面。下面是我自定义的一个404错误页面,当网站发生404错误时,将向客户端返回这个页面,如图14。 8 自定义IIS Banner信息 默认Banner信息会泄露服务器类型、版本等相关信息,我们需要对其进行修改,这样可以防止信息泄露,还可以骗过一些自动化扫描、攻击工具。 a. 修改默认HTTP头信息 在修改之前,我们先来看下默认的HTTP头信息是什么样的。我们向IIS服务器发一个请求,然后用抓包工具分析它返回的数据,就可以发现HTTP头信息,如图15所示: 上图用红框标注的地方就是HTTP头信息,通过它我们就可以确定目标网站使用的是IIS服务器。 现在我们来看下如何自定义HTTP头信息。首先,打开“IIS管理器”—>“属性”—>“HTTP头”,在“自定义HTTP头”选中默认的HTTP头信息,进行编辑,或者删除掉默认的,自己添加一个新的HTTP头信息。图16中是我随便自定义的一个HTTP头。 图16 在修改完成后,我们再来抓包分析一下,如图17所示: 从图上可以看到,现在IIS服务器返回的HTTP头已经是我们自定义了。 b. 修改默认IIS头信息 修改默认IIS头信息需要通过工具来完成。这里推荐使用ServerMask,它是一款专门用来隐藏或修改IIS服务器默认Banner信息,防止信息泄露的工具。下图18是该软件的界面: 图18 根据服务器返回的信息,我们很容易判断出目标网站使用的服务器是IIS,版本是6.0,操作系统是Windows Server 2003,这些信息对攻击者确定下一步行动是非常有帮助的。 我们也可以使用扫描工具来完成刺探目标网站服务器相关信息的任务,这类工具非常多,而且使用非常简单,如图20。 现在我们来把默认的IIS头信息隐藏或修改掉,首先打开软件,选中要保护的网站,在“Security Profile”处的下拉菜单中选择相应的策略,这里我自定义一个。 图21 如图21所示,我把IIS默认的头信息修改成了Apache服务器的信息。这样就可以迷惑攻击者,有效隐藏网站的真实信息。现在我们再来分析下修改后的IIS服务器返回的头信息,如图22: 现在IIS服务器返回的头信息已经是我们自定义的了,这里伪装成了Apache服务器。 我们再用扫描工具扫描一下,看能否得到目标网站的真实服务器类型,结果如图23: 根据上图,我们可以看到现在扫描器已经获取不到目标网站的服务器类型了。 对于一些自动化攻击工具来说,因为获取不到目标服务器的类型和版本相关信息,自然也就无法进行下一步攻击了。 总结 通过上面对IIS攻击和安全加固的实例,相信读者对IIS服务器的安全有了更加深入的认识。其实对于IIS的安全加固并不难,很多时候更重要的是管理员的安全意识,只要有足够的安全意识,加上上面介绍的安全加固方法,相信你一定可以打造一个安全的IIS服务器。 转自:http://sec.chinabyte.com/278/12496778.shtml
View Detailscanonical 标签已经存在两年了,但我想至今一定还有很多人不知道canonical 标签是个什么东东,下面我会详细讲解一下,让大家认识它,理解它。 简单而言,canonical 标签可以为搜索引擎指明当前页面权重的侧重点在于哪个链接,从而有助于SEO. canonical 标签是在09年二月份由Google、Yahoo、Microsoft 共同发布,用来解决由于 URL 形式不同而造成的重复内容的问题。因为重复内容是SEO中的大忌,但对于一些页面而言,重复内容又是在所难免的。 为了给搜索引擎留下友好的印象,我们可以利用网站SEO优化中的一个小技巧即canonical 标签来实现。这样不但可以为搜索引擎分担一些工作,还能告诉他们哪个才是真正的权重高的页面,从而不用再费力气到处爬到处找了。 使用canonical 标签还有3个作用,其实这3个作用在前面的文章中我有提到,但为了让大家更好的理解,我再强调一下: 1.使用Canonical标签使网址规范化。 2.避免内容重复页面,搜索引擎收录更准确。 3.集中传递页面权重。 Canonical链接标签只能作用于同一个域名所在的网址,不能作用于不同域名上的重复内容。如果是跨站,可以使用301重定向。 具体使用方法,您可以通过以下两种方式指定规范网址: ?在每个非规范版本的 HTML 网页的部分中,添加一个 rel="canonical" 链接。 要指定指向网页 http://www.example.com/product.php?item=swedish-fish 的规范链接,请按以下形式创建元素: http://www.example.com/product.php?item=swedish-fish"/>将上述链接复制到某网页(例如 http://www.example.com/product.php?item=swedish-fish&sort=price)所有非规范版本的部分中。 如果您在 http://www.example.com/product.php?item=swedish-fish 和 https://www.example.com/product.php?item=swedish-fish 上都发布了内容,则可以指定该网页的规范版本。创建元素: http://www.example.com/product.php?item=swedish-fish"/>将上述链接添加到 https://www.example.com/product.php?item=swedish-fish 的部分中。 ?使用 Linkrel="canonical" HTTP 标头进行回应,从而指明网址的规范版本。向网页中的 head 部分添加rel="canonical" 的方法适用于 HTML 内容,但是不适用于 PDF 以及其他由"Google 网页搜索"编入索引的文件类型。在这种情况下,您可以使用Link rel="canonical" HTTP 标头进行回应,从而指明规范版本的网址,如下所示(请注意,要使用该选项,您需要拥有配置服务器的权限): Link: <http://www.example.com/downloads/white-paper.pdf>;rel="canonical" 目前,Google 仅针对"Google 网页搜索"支持这些链接标头元素。 更详细可以参见:http://www.google.com/support/webmasters/bin/answer.py?answer=139394 注意:不要耍小聪明,使用 canonical 标签把其他不相关的页面指定想提高权重的页面,如果被发现的话,你的网站肯定会死的很惨。 文章地址:http://www.fkseo.net/thread-194099-1-1.html
View Details效果展示: ActionScript 提供了10类过渡效果,即遮帘过渡、淡化过渡、飞行过渡、光圈过渡、照片过渡、溶解过渡、旋转过渡、挤压过渡、划入/划出过渡、缩放过渡,虽然表面上看和利用遮罩完成的过渡效果没有区别,但从本质上是有很大的区别的,并且利用时要比使用遮罩完成的效果简单而有效,因此,特整理以下供大家参考。 1.遮帘过渡使用逐渐消失或逐渐出现的矩形来显示影片剪辑对象。向内容目标影片剪辑 img1_mc 应用“遮帘过渡”。import mx.transitions.*;import mx.transitions.easing.*;TransitionManager.start(img1_mc, {type:Blinds, direction:Transition.IN, duration:2, easing:None.easeNone, numStrips:10, dimension:0});numStrips,“遮帘”效果中的遮罩条纹数。建议的范围是 1 到 50。dimension,一个整数,指示遮帘条纹是垂直的 (1) 还是水平的 (0)。duration,一个整数,指完成过渡的时间(单位为秒)。 2.淡化过渡淡入或淡出影片剪辑对象。向内容目标影片剪辑 img2_mc 应用“淡化过渡”。import mx.transitions.*;import mx.transitions.easing.*;TransitionManager.start(img2_mc, {type:Fade, direction:Transition.IN, duration:3, easing:None.easeNone});Duration,一个整数,指完成过渡的时间(单位为秒)。 3.飞行过渡从某一指定方向滑入影片剪辑对象。向内容目标影片剪辑 img3_mc 应用“飞行过渡”。import mx.transitions.*;import mx.transitions.easing.*;TransitionManager.start(img3_mc, {type:Fly, direction:Transition.IN, duration:3, easing:Elastic.easeOut, startPoint:8});startPoint,一个指示起始位置的整数;范围是 1 到 9:左上,1;上中,2;右上,3;左中,4;中心,5;右中,6;左下,7;下中,8;右下,9。duration,一个整数,指完成过渡的时间(单位为秒)。easing:Elastic.easeOut,有缓动效果,没有Elastic.easeOut选项时无缓动效果。 4.光圈过渡使用可以缩放的方形或圆形动画遮罩来显示或隐藏影片剪辑对象。向内容目标影片剪辑 img4_mc 应用“光圈过渡”。import mx.transitions.*; import mx.transitions.easing.*;TransitionManager.start(img4_mc, {type:Iris, direction:Transition.IN, duration:5, easing:Strong.easeOut, startPoint:5, shape:Iris.CIRCLE});startPoint,一个指示起始位置的整数;范围是 1 到 9:左上,1;上中,2;右上,3;左中,4;中心,5;右中,6;左下,7;下中,8;右下,9。shape,值为 mx.transitions.Iris.SQUARE(方形)或 mx.transitions.Iris.CIRCLE(圆形)的遮罩形状。duration,一个整数,指完成过渡的时间(单位为秒)。easing:Strong.easeOut,具有“强制”缓动,无easing:Strong.easeOut选项时无缓动 5.照片过渡使影片剪辑对象像放映照片一样出现或消失。向内容目标影片剪辑 img5_mc 应用“照片”过渡。import mx.transitions.*;import mx.transitions.easing.*;TransitionManager.start (img5_mc, {type:Photo, direction:Transition.IN, duration:3, easing:None.easeNone});duration,一个整数,指完成过渡的时间(单位为秒)。 6.溶解过渡使用随机出现或消失的棋盘图案矩形来显示或隐藏影片剪辑对象。向内容目标影片剪辑 img6_mc 应用“溶解”过渡。import mx.transitions.*;import mx.transitions.easing.*;TransitionManager.start(img6_mc, {type:PixelDissolve, direction:Transition.IN, duration:3, easing:None.easeNone, xSections:20, ySections:20});xSections,一个整数,指示沿水平轴的遮罩矩形部分的数目。建议的范围是 1 到 50。ySections,一个整数,指示沿垂直轴的遮罩矩形部分的数目。建议的范围是 1 到 50。duration,一个整数,指完成过渡的时间(单位为秒)。 7.旋转过渡旋转影片剪辑对象。向内容目标影片剪辑 img7_mc 应用“旋转”过渡。import mx.transitions.*;import mx.transitions.easing.*;TransitionManager.start(img7_mc, {type:Rotate, direction:Transition.IN, duration:3, ccw:false, degrees:180});ccw,一个布尔值:对于顺时针旋转为 false;对于逆时针旋转为 true。degrees,一个整数,指示对象要旋转的度数。建议是范围是 1 到 9999。例如,degrees 设置为 1080 时,会将对象完全旋转三次。duration,一个整数,指完成过渡的时间(单位为秒)。 8.挤压过渡水平或垂直缩放影片剪辑对象。向内容目标影片剪辑 img8_mc 应用“挤压”过渡。import mx.transitions.*;import mx.transitions.easing.*;TransitionManager.start(img8_mc, {type:Squeeze, direction:Transition.IN, duration:3, dimension:0});dimension,一个整数,指示“挤压”效果应是水平的 (1) 还是垂直的 (0)。duration,一个整数,指完成过渡的时间(单位为秒)。 9.划入/划出过渡使用水平移动的动画遮罩形状来显示或隐藏影片剪辑对象。向内容目标影片剪辑 img9_mc 应用“划入/划出”过渡。import mx.transitions.*;import mx.transitions.easing.*;TransitionManager.start(img9_mc, {type:Wipe, direction:Transition.IN, duration:3, easing:None.easeNone, startPoint:1});startPoint,一个整数,指示开始位置。范围是 1 到 4 和 6 到 9:左上,1;上中,2;右上,3;左中,4;右中,6;左下,7;下中,8;右下,9。duration,一个整数,指完成过渡的时间(单位为秒)。 10.缩放过渡通过按比例缩放来放大或缩小影片剪辑对象。向内容目标影片剪辑 img10_mc 应用“缩放”过渡。import mx.transitions.*;import mx.transitions.easing.*;TransitionManager.start(img10_mc, {type:Zoom, direction:Transition.IN, duration:3});duration,一个整数,指完成过渡的时间(单位为秒)。 应用非常简单,复制以上相应的AS到需要过渡的帧处即可,并修改MC的名称。具体可查看原文件。 源文件:过渡效果.rar 转自:http://www.68design.net/Web-Guide/Flash/30869-1.html
View Details转自:http://www.dedecms.com/web-art/JSPjiaocheng/20060330/23987.html 作者:边城狂人 常常在网上看到有人询问:如何把 java 程序编译成 .exe 文件。通常回答只有两种,一种是制作一个可执行的 JAR 文件包,然后就可以像.chm 文档一样双击运行了;而另一种是使用 JET 来进行 编译。但是 JET 是要用钱买的,而且据说 JET 也不是能把所有的 Java 程序都编译成执行文件,性能也要打些折扣。所以,使用制作可执行 JAR 文件包的方法就是最佳选择了,何况它还能保持 Java 的跨平台特性。下面就来看看什么是 JAR 文件包吧:1. JAR 文件包JAR 文件就是 Java Archive File,顾名思意,它的应用是与 Java 息息相关的,是 Java 的一种文档格式。JAR 文件非常类似 ZIP 文件——准确的说,它就是 ZIP 文件,所以叫它文件包。JAR 文件与 ZIP 文件唯一的区别就是在 JAR 文件的内容中,包含了一个 META-INF/MANIFEST.MF 文件,这个文件是在生成 JAR 文件的时候自动创建的。举个例子,如果我们具有如下目录结构的一些文件:==– test– Test.class把它压缩成 ZIP 文件 test.zip,则这个 ZIP 文件的内部目录结构为:test.zip– test– Test.class如果我们使用 JDK 的 jar 命令把它打成 JAR 文件包 test.jar,则这个 JAR 文件的内部目录结构为:test.jar|– META-INF| – MANIFEST.MF– test–Test.class2. 创建可执行的 JAR 文件包制作一个可执行的 JAR 文件包来发布你的程序是 JAR 文件包最典型的用法。Java 程序是由若干个 .class 文件组成的。这些 .class 文件必须根据它们所属的包不同而分级分目录存放;运行前需要把所有用到的包的根目录指定给 CLASSPATH 环境变量或者 java 命令的 -cp 参数;运行时还要到控制台下去使用 java 命令来运行,如果需要直接双击运行必须写 Windows 的批处理文件 (.bat) 或者 Linux 的 Shell 程序。因此,许多人说,Java 是一种方便开发者苦了用户的程序设计语言。其实不然,如果开发者能够制作一个可执行的 JAR 文件包交给用户,那么用户使用起来就方便了。在 Windows 下安装 JRE (Java Runtime Environment) 的时候,安装文件会将 .jar 文件映射给 javaw.exe 打开。那么,对于一个可执行的 JAR 文件包,用户只需要双击它就可以运行程序了,和阅读 .chm 文档一样方便 (.chm 文档默认是由 hh.exe 打开的)。那么,现在的关键,就是如何来创建这个可执行的 JAR 文件包。创建可执行的 JAR 文件包,需要使用带 cvfm 参数的 jar 命令,同样以上述 test 目录为例,命令如下:jar cvfm test.jar manifest.mf test这里 test.jar 和 manifest.mf 两个文件,分别是对应的参数 f 和 m,其重头戏在 manifest.mf。因为要创建可执行的 JAR 文件包,光靠指定一个 manifest.mf 文件是不够的,因为 MANIFEST 是 JAR 文件包的特征,可执行的 JAR 文件包和不可执行的 JAR 文件包都包含 MANIFEST。关键在于可执行 JAR 文件包的 MANIFEST,其内容包含了 Main-Class 一项。这在 MANIFEST 中书写格式如下:Main-Class: 可执行主类全名(包含包名)例如,假设上例中的 Test.class 是属于 test 包的,而且是可执行的类 (定义了 public static void main(String[]) 方法),那么这个 manifest.mf 可以编辑如下:Main-Class: test.Test <回车>这个 manifest.mf 可以放在任何位置,也可以是其它的文件名,只需要有 Main-Class: test.Test 一行,且该行以一个回车符结束即可。创建了 manifest.mf 文件之后,我们的目录结构变为:==|– test| – Test.class`– manifest.mf这时候,需要到 test 目录的上级目录中去使用 jar 命令来创建 JAR 文件包。也就是在目录树中使用“==”表示的那个目录中,使用如下命令:jar cvfm test.jar manifest.mf test之后在“==”目录中创建了 test.jar,这个 test.jar 就是执行的 JAR 文件包。运行时只需要使用 java -jar test.jar 命令即可。需要注意的是,创建的 JAR 文件包中需要包含完整的、与 Java 程序的包结构对应的目录结构,就像上例一样。而 Main-Class 指定的类,也必须是完整的、包含包路径的类名,如上例的 test.Test;而且在没有打成 JAR 文件包之前可以使用 java <类名> 来运行这个类,即在上例中 java test.Test 是可以正确运行的 (当然要在 CLASSPATH 正确的情况下)。
View Details作废函数如下: call_user_method()(使用 call_user_func() 替代) call_user_method_array() (使用 call_user_func_array() 替代) define_syslog_variables() dl() ereg() (使用 preg_match() 替代) ereg_replace() (使用 preg_replace() 替代) eregi() (使用 preg_match() 配合 ‘i’ 修正符替代) eregi_replace() (使用 preg_replace() 配合 ‘i’ 修正符替代) set_magic_quotes_runtime() 以及它的别名函数 magic_quotes_runtime() [color=olive]session_register() (使用 $_SESSION 超全部变量替代) session_unregister() (使用 $_SESSION 超全部变量替代) session_is_registered() (使用 $_SESSION 超全部变量替代) set_socket_blocking() (使用 stream_set_blocking() 替代) split() (使用 preg_split() 替代) spliti() (使用 preg_split() 配合 ‘i’ 修正符替代) sql_regcase() mysql_db_query() (使用 mysql_select_db() 和 mysql_query() 替代) mysql_escape_string() (使用 mysql_real_escape_string() 替代) 废弃以字符串传递区域设置名称. 使用 LC_* 系列常量替代. mktime() 的 is_dst 参数. 使用新的时区处理函数替代. 处理方法:editplus编辑器中,正则替换 替换ereg(),eregi():用preg_match替换 ereg\(“([^"]+)”替换为:preg_match(“/\1/” ereg\(‘([^"]+)’替换为:preg_match(‘/\1/’ eregi\(“([^"]+)”替换为:preg_match(“/\1/i” eregi\(‘([^"]+)’替换为:preg_match(‘/\1/i’ 替换ereg_replace(),eregi_replace():用preg_replace()替换 ereg_replace\(“([^"]+)”替换为:preg_replace(“/\1/” ereg_replace\(‘([^"]+)’替换为:preg_replace(‘/\1/’ ereg_ireplace\(“([^"]+)”替换为:preg_replace(“/\1/i” ereg_ireplace\(‘([^"]+)’替换为:preg_replace(‘/\1/i’ 如果 ereg_replace 的第一个参数不是正则表达式,可以用 str_replace 直接来替换 split用explode替换或preg_split替换=&使用=替换 出处:http://blog.duteba.com/technology/article/38.htm
View Details因为是在Drupal中遇到的问题,所以就在Drupal中解决。原因很简单,就是Drupal 6.x不支持PHP 5.3,Drupal 7没有这个问题,解决办法也很多。最简单的莫过于降级到PHP 5.2.x,如果由于一些特别的原因必须使用PHP 5.3+的话,可以尝试下列办法。 打开Drupal安装目录下的includes/common.inc文件,找到590行(如果没有修改过的话),显示的应该是
1 |
if ($errno & (E_ALL ^ E_NOTICE)) { |
将这一行替换成
1 |
if ($errno & (E_ALL & ~E_NOTICE & ~E_DEPRECATED)) { |
这一句将禁止所有Deprecated错误信息。如果你安装了Developer Tools模块的话,那么还需要修改devel/devel.module的460行,方法相同。 如果这个办法不好用的话,可以尝试修改php.ini。 打开php.ini,找到
1 |
error_reporting = E_ALL |
改成
1 |
error_reporting = E_ALL & ~E_DEPRECATED |
道理是一样的。 如果还不行,或者因为各种原因改不了以上两处的话,还有办法。 打开drupal\includes\file.inc文件,找到895行,如下。
1 |
elseif ($depth >= $min_depth && ereg($mask, $file)) { |
注意,如果895行不是这句的话,就在附近找找,或者直接搜索这句,找到以后把这句改为
1 |
elseif ($depth >= $min_depth && mb_ereg($mask, $file)) { |
这样怎么着应该都行了。 养成良好的编程习惯,修改之前务必备份。 from url:http://www.baifeng.me/web/hosting/2010/03/1240/
View Details静态方法的规则和静态变量是相同的。使用ststic关键字可以将方法标识为静态方法,通过类的名称和作用域限定操作符::可以访问静态方法。 静态方法和非静态方法之间有一个很重要的区别,就是在调用静态方法时,我们不需要创建类的实例。 Program List:用类名作为参数 用类名作为参数可以解决非继承的静态问题。 01 <?php 02 classFruit { 03 publicstatic$category= "I'm fruit"; 04 05 staticfunctionfind($class) 06 { 07 $vars= get_class_vars($class) ; 08 echo$vars['category'] ; 09 } 10 } 11 12 classApple extendsFruit { 13 publicstatic$category= "I'm Apple"; 14 } 15 16 Apple::find("Apple"); 17 ?> 程序运行结果: 1 I'm Apple Program List:重写基类方法 在派生类重写基类的方法。 01 <?php 02 classFruit 03 { 04 staticfunctionFoo ( $class= __CLASS__) 05 { 06 call_user_func(array($class, 'Color')); 07 } 08 } 09 10 classApple extendsFruit 11 { 12 staticfunctionFoo ( $class= __CLASS__) 13 { 14 parent::Foo($class); 15 } 16 17 staticfunctionColor() 18 { 19 echo"Apple's color is red"; 20 } 21 } 22 […]
View Details一、 PHP抓取页面的主要方法: 1. file()函数 2. file_get_contents()函数 3. fopen()->fread()->fclose()模式 4.curl方式 5. fsockopen()函数 socket模式 6. 使用插件(如:http://sourceforge.net/projects/snoopy/) 二、PHP解析html或xml代码主要方式: 1. file()函数 <?php $url=’http://t.qq.com’; $lines_array=file($url); $lines_string=implode(”,$lines_array); echo htmlspecialchars($lines_string); ?> 2. file_get_contents() 函数 使用file_get_contents和fopen必须空间开启allow_url_fopen。 方法:编辑php.ini,设置 allow_url_fopen = On,allow_url_fopen关闭时fopen和file_get_contents都不能打开远程文件。 <?php $url=’http://t.qq.com’; $lines_string=file_get_contents($url); echo htmlspecialchars($lines_string); ?>3. fopen()->fread()->fclose()模式 <?php $url=’http://t.qq.com’; $handle=fopen($url,”rb”); $lines_string=”"; do{ $data=fread($handle,1024); if(strlen($data)==0){break;} $lines_string.=$data; }while(true); fclose($handle); echo htmlspecialchars($lines_string); ?>4. curl方式 使用curl必须空间开启curl。方法:windows下修改php.ini,将extension=php_curl.dll前面的分号去掉,而且需 要拷贝ssleay32.dll和libeay32.dll到C:\WINDOWS\system32下;Linux下要安装curl扩展。 <?php $url=’http://t.qq.com’; $ch=curl_init(); $timeout=5; curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout); $lines_string=curl_exec($ch); curl_close($ch); echo htmlspecialchars($lines_string); ?>5. fsockopen()函数 socket模式 socket模式能否正确执行,也跟服务器的设置有关系,具体可以通过phpinfo查看服务器开启了哪些通信协议,比如我的本地php socket没开启http,只能使用udp测试一下了。 <?php $fp = fsockopen(“udp://127.0.0.1″, 13, $errno, $errstr); if (!$fp) { echo […]
View Details一:首先查看一下系统下面有没有字体支持 安装字体:sudo apt-get install msttcorefonts 使用中文字体:simhei.ttf 如果没有GOOGLE下载,放到/usr/share/fonts/truetype/目录下,使用的时候直接调用,也可以放到你的网站目录下。 <?php $im = imagecreate(400,300); $black = imagecolorallocate($im, 255, 0, 255); $white = imagecolorallocate($im, 255, 255, 255); $font = “/usr/share/fonts/truetype/msttcorefonts/simhei.ttf”; $string = “this is my second try”; $chinese = “我的好朋友是谁”; //imagestring($im, 10, 10, 10, $string, $white); //imagestring($im, 30, 30, 20, $chinese, 1); imagettftext($im, 20, 0,10, 10, $white, $font, $chinese); imageline($im, 10, 20, 100, 100, 1); header(“Content-type: image/png”); imagepng($im); imagedestroy($im); ?>转自:http://hi.baidu.com/bowengo/item/4e00acd95d2d15fd93a9743c
View Details$size = 300; $image = imagecreatetruecolor($size,$size); //用白色背景,黑色边框画方框 $back = imagecolorallocate($image,255,255,255); $border = imagecolorallocate($image,0,0,0); imagefilledrectangle($image,0,0,$size,$size,$back); //画出白色背景 imagerectangle($image,0,0,$size-1,$size-1,$border); //画出黑色边框 $yellow_x = 150; $yellow_y = 75; $red_x = 100; $red_y = 160; $blue_x = 200; $blue_y = 160; $radius = 150; $yellow = imagecolorallocatealpha($image,255,255,0,75); //此函数将黄色的alpha值调为75,就是透明度 $red = imagecolorallocatealpha($image,255,0,0,75); $blue = imagecolorallocatealpha($image,0,0,255,75); //画三个交叠的圆 imagefilledellipse($image,$yellow_x,$yellow_y,$radius,$radius,$yellow); //此函数就是我要在$image上画一个圆心($yellow_x,$yellow_y)半径为$radius/2颜色为$yellow的圆 imagefilledellipse($image,$red_x,$red_y,$radius,$radius,$red); imagefilledellipse($image,$blue_x,$blue_y,$radius,$radius,$blue); //输出正确的header header(“Content-type: image/png”); //输出结果 imagepng($image); imagedestroy($image);转自:http://yq329.blog.163.com/blog/static/117379566201131821330796/
View Details