博文

[转]冷眼看PHP(2009-03-05 17:09:00)

摘要:What's Cool About PHP May 26, 2008 PHP给人印象最深的莫过于:你不必因为想要用好它就去深入了解这种语言。想一想,在你所知道的语言中有多少能做到这一点呢?其中比较明显的一个就是java了,仅编一个hello world就需要了解不少的知识,更别提创建一个web应用程序了。但对PHP,这些都不在话下。 应该说PHP在访问Bad Behavior时比Perl还是强一点点的。记得在Web刚兴起的那段日子,听到人们常说他们将用Perl创建大型程序,虽然也知道(没有办法说服他们)最终会失败。 另一方面,PHP确实具有创建一些较大程序的能力,比如Drupal。我的朋友Nancy Nicolaisen(也是这里的Blogger)说她想建立一个旅游网站,我建议她看看Drupal。她照做了,并最终选择了它。因为在她看来Drupal的用户社区太优秀了,为她在建立站点并顺利上线提供了大量的帮助。 PHP让菜鸟快速上手并直接去做他们感兴趣的东西,而无须关心那些繁杂的编程理论和实践。你只要去做就可以在网页上得到想要的。 然而这也是这个语言的问题所在。你会发现存在许多完全错误的PHP实现的例子,这一般是都由那些互相copy的人写的,因为没有人知道问题到底是怎样的。我最先用到的例子之一就是PHP的文件锁。结果是找到很多,但没有正确的。事实上,PHP主要用在可以处理所有一致性问题的数据库上面,这样人们就不必考虑一些底层问题了。但是程序语言在与数据库的高层交互和文件系统的底层交互上的处理方式是一样的,所以这里不存在初学者所需的“龙来了”的标志。我感觉社区里有太多“坐享其成”的人,而真正了解并理解基本原理的人却寥寥无几。所以就出现了在无知的状态下闯入了这片少有人问津的领域而进行滥用的情形。 之后,PHP5出现了,其为集C++和Java之大成者。它的这个强大特性着实令人振奋,而我的忧虑感却开始加重了:人们看来随便就可以拥有所有特性而不去仔细考虑各个细节和对语言产生的方方面面的影响。相反,在过去的十多年来我关注着Python语言所做的每一个谨慎的抉择。时间会证明,或许PHP社区将会解决如何将所有这些特性都派上用场的问题,但我对此疑虑重重。 与此同时,在我更新缓慢的新站点上我使用了PHP。关键是,我只在很小的范围内用......

阅读全文(4247) | 评论:0

[转]安全编程: 最小化特权--根除缺陷(2009-03-04 15:12:00)

摘要: 安全的程序必须最小化特权,以降低 bug 转化为安全缺陷的可能性。本文讨论了如何通过最小化有特权的模块、授与的特权以及特权的有效时间来最小化特权。文章不仅讨论了一些传统的类 UNIX 特权机制,还讨论了较新的机制,如 FreeBSD 的 jail(),Linux 安全模块(Linux Security Modules,LSM)框架,以及 Security-Enhanced Linux(SELinux)。 2003 年 3 月 3 日,Internet Security Systems 对 Sendmail 中的一个严重的漏洞提出了警告。所有的电子邮件都通过邮件传输代理(mail transfer agent,MTA)来传输,Sendmail 则是最流行的 MTA,所以这个警告影响了世界范围内的很多组织。问题在于,按通常的配置,精心设置了“from”、 “to”或者“cc”域的电子邮件消息可以让发送者完全(root)控制任何一台运行着 Sendmail 的机器。更严重的是,一般的防火墙将 不能保护其内部的机器免受这种攻击。 造成这一漏洞的直接原因是,Sendmail 的一个安全检测是有缺陷的,可以发生缓冲区溢出。不过,一个重要的作用因素是,Sendmail 经常被安装为一个单一的“setuid root”程序,对运行它的系统有完全的控制权限。这样,Sendmail 中的任何缺陷都可以让攻击者直接控制整个系统。 这个设计是必须的吗?不是;Wietse Venema 的 Postfix 是一个常见的可以与之匹敌的 MTA。类似于 Sendmail,Postfix 会去做很多安全检测,不过,为了 最小化特权,Postfix 设计为一组模块。结果,Postfix 通常被认为是比 Sendmail 更安全的程序。本文讨论了如何最小化特权,您可以将同样的思想应用到您的程序中。 最小化特权的基础 实际应用的程序会有缺陷。不是我们希望那样,但是确实是有。复杂的需求、日程的压力和环境的变化使得不太可能得到实用的无缺陷的程序。甚至那些通过复杂而且精确的技术正式地证明是正确的程序,也会有缺陷。为什么?其中一个原因是,验证必须做很多假设,而且通常这些假设并不是完全正确。无论如何,出于种种原因,大部分程序没有得到严格的检验。而且,即使今天没有任何缺陷(不太......

阅读全文(4416) | 评论:0

[转]安全编程: 防止缓冲区溢出--防止如今最常见的程序缺陷(2009-03-04 15:10:00)

摘要: 本文讨论 Linux/UNIX 系统中最常见的缺陷:缓冲区溢出。本文首先解释什么是缓冲区溢出,以及它们为何如此常见和如此危险。然后讨论广泛用于解决缓冲区溢出的新 Linux 和 UNIX 方法 ―― 以及为什么这些方法还不足够。随后将展示 C/C++ 程序中防止缓冲区溢出的各种方法,同时包括静态调整大小的方法(比如标准的 C 库和 OpenBSD/strlcpy 解决方案)和动态调整大小的解决方案,以及一些将为您提供帮助的工具。最后,本文以一些关于缓冲区溢出缺陷的未来发展形势的预测来结束全文的讨论。 1988 年 11 月,许多组织不得不因为“Morris 蠕虫”而切断 Internet 连接,“Morris 蠕虫”是 23 岁的程序员 Robert Tappan Morris 编写的用于攻击 VAX 和 Sun 机器的程序。 据有关方面估计,这个程序大约使得整个 Internet 的 10% 崩溃。 2001 年 7 月,另一个名为“Code Red”的蠕虫病毒最终导致了全球运行微软的 IIS Web Server 的 300,000 多台计算机受到攻击。2003 年 1 月,“Slammer”(也称为“Sapphire”)蠕虫利用 Microsoft SQL Server 2000 中的一个缺陷,使得南韩和日本的部分 Internet 崩溃,中断了芬兰的电话服务,并且使得美国航空订票系统、信用卡网络和自动出纳机运行缓慢。所有这些攻击 ―― 以及其他许多攻击,都利用了一个称做为 缓冲区溢出 的程序缺陷。 1999 年 Bugtraq(一个讨论安全缺陷的邮件列表)进行的一次非正式调查发现,三分之二的参与者认为第一号的缺陷就是缓冲区溢出(要了解相关背景,请参阅本文后面 参考资料部分列出的“Buffer Overflows: Attacks and Defenses for the Vulnerability of the Decade”一文)。从 1997 年到 2002 年 3 月,CERT/CC 发出的半数安全警报都基于缓冲区缺陷。 如果希望自己的程序是安全的,您需要知道什么是缓冲区溢出,如何防止它们,可以采用哪些最新的自动化工具来防止它们(以及为什么这些工具还不足够),还有如何在您自己的程序中防止它们。 什么是缓冲区溢出? ......

阅读全文(4305) | 评论:0

[转]安全编程: 警惕输入--找出并保护程序的入口(2009-03-04 14:57:00)

摘要: 本文论述了数据进入您的程序的各种途径,重点是如何适当地对它们进行处理;您甚至可能还没有了解它们全部!本文首先论述了如何设计程序来限制数据可以进入您的程序的途径,以及您的设计会如何影响哪些可以成为输入。然后论述了各种不同的输入通道以及如何使用这些通道,包括环境变量、文件、文件描述符、命令行、图形用户界面(GUI)、网络数据以及其他的输入。 早在 2001 年,许多大公司安装了应用程序“SAP R/3 Web Application Server demo”,却没有发现它有一个致命的漏洞。这个应用程序中有一个名为 saposcol 的程序,没有能保护自己免受恶意输入值的攻击。攻击者可以通过设置 PATH 环境变量来改变 saposcol 寻找其他程序的位置,然后为 saposcol 创建一个恶意的“扩展”程序来运行。由于 saposcol 具有 setuid root 权限,这就意味着因为这一个编程上的失误,本地用户可以(作为 root)很快地获得整个计算机系统的控制权(参阅 参考资料 中的链接,以深入了解这一点及本文中提到的其他相关内容)。 本专栏的前一期文章 指出了一些常见的输入数据类型以及检查它们的方法。但是如果您不知道所有的数据自何处而来,那么,只是知道如何检查数据类型是不够的。本文讨论了数据进入您的程序的各种不同途径 —— 有一些并不是显而易见的 —— 并着重讨论了如何适当地去处理它们。 如果您不控制,攻击者就会来控制 安全的程序中第一道防线是检查每一个不可信的输入。但是这是什么意思呢?可以归结为以下三点: 1. 限制程序暴露的部分。如果您的程序分为若干块 —— 这通常是一个好主意 —— 那么尽量设计得让攻击者根本不能与大多数块通信。这包括不能让他们利用各块之间的通信路径。如果攻击者不能查看、修改或者插入他们自己的数据到那些通信路径中(包括作为块间的中间人潜入),那是最好了。如果那不可能 —— 比如当块之间使用网络通信时 —— 那么使用加密等机制来防范攻击者。后续的文章将更深入地讨论这一问题。 2. 限制暴露部分所允许的输入类型。有时您可以修改设计以使只有少数的输入可以接受 —— 如果可以,那么就这样做吧。 3. 严格检查不可信的输入。真正“安全”的程序应该没有任何输入,但那种程序是没有用处的。因而,......

阅读全文(4279) | 评论:0

[转]安全编程: 验证输入--接收用户数据的最佳实践(2009-03-04 14:52:00)

摘要: 本文介绍了如何验证输入――任何安全程序的首要环节之一。 2003 年 7 月,计算机应急反应小组协调中心报告了 Microsoft Windows 的 DirectX MIDI 库中一组危险的漏洞。DirectXMIDI 库是用于播放 MIDI 格式音乐的底层 Windows 库。不幸的是,这个库没有能力去检查 MIDI 文件中的所有数据值;text、copyright 或者 MThd track 域中错误的值可以导致这个库的失效,而攻击者就可以利用这一漏洞让系统去执行他们想要执行的任何代码。这是特别危险的,因为 Internet Explorer 在察看一个包含 MIDI 文件链接的网页时,会自动加载那个文件并播放它。结果呢?一个攻击者只需要发布一个网页,当用户察看这个网页时,让用户的计算机删除所有的文件、把所有的机密文件通过电子邮件发送到其他地方、机器崩溃,或者去做任何攻击者想要做的事情。 检查输入 在几乎所有安全的程序中,您的第一道防线就是检查您所接收到的每一条数据。如果您能不让恶意的数据进入您的程序,或者至少不在程序中处理它,您的程序在面对攻击时将更加健壮。这与防火墙保护计算机的原理很类似;它不能预防所有的攻击,但它可以让一个程序更加稳定。这个过程叫做检查、验证或者过滤您的输入。 一个明显的问题是,在何处执行检查?是在数据最初进入程序时,或者是在一个低层次的例程在实际使用这些数据时?通常,最好在这两处都对其进行检查;这样,即使一个攻击者成功地突破了一道防线,他们还会遇到另一条。最重要的规则是所有的数据必须在使用之前被检查。 误区:寻找不正确的输入 安全程序开发人员一个最大的误区是尝试去查找“非法的”数据值。这是不对的,因为攻击者非常聪明;他们常常会想到出其他的危险数据值。所以应该做的是确定哪些是合法的,检查数据是否符合定义,拒绝所有不符合定义的数据。为了安全,在开始时应该特别谨慎,只允许您知道合法的数据。毕竟,如果您限制的过于严格,用户很快就会报告说程序不允许合法的数据进入。另一方面,如果你限制的过于宽松,可能得直到程序被破坏您才会发现这一问题。 例如,我们假设您要基于用户的某个输入创建文件名。您可能知道不应该允许用户的输入中包括“/”,但是仅仅去检查这一个字符可能是不对的。比如,控制字符呢?空格会不会出......

阅读全文(2333) | 评论:0

[转]安全编程: 开发安全的程序--正确的理念是成功的一半(2009-03-04 14:50:00)

摘要:安全编程: 开发安全的程序 正确的理念是成功的一半 David A. Wheeler (dwheelerNOSPAM@dwheeler.com), 专职研究员, Institute for Defense Analyses 2003 年 7 月 10 日 本专栏说明了如何编写安全的应用程序;重点讨论的是 Linux 操作系统,但是其中的许多原则也适用于任何系统。在当今联网的世界中,软件开发人员必须知道如何编写安全的程序,然而人们还未广泛认识到这一信息,也未向人们广泛讲授过这一信息。本文是安全编程(Secure programmer)专栏的第一篇文章,它介绍了如何编写安全的应用程序的基本思想,并讨论了如何针对特定的应用程序确定安全性需求。以后的几篇专栏文章将主要讨论几种不同的常见安全性漏洞以及如何防止它们。 欢迎来到不太友善的世界 案例 #1 味道闻起来很糟糕。两个多月以来,数十万加仑的污水流到了澳大利亚的公园、河流以及一家旅馆的地面上,而无人知晓其原因。水生动植物不断地死亡,而且有一条小河中的水已经变黑了。2000 年 4 月 23 日,当警方逮捕了一名男子时才解开了这个谜团,这名男子一直在使用计算机和无线电设备对管理污水和饮用水的机器进行完全控制。他的动机是什么呢?对其审讯的口供表明他正试图获得一份获利丰厚的咨询合同以解决他所造成的问题。事实原本还要糟糕得多。 案例 #2 有一个小偷(只知道他叫“Maxus”)从在线音乐公司 CD Universe 偷了 35 万个信用卡号,然后勒索 10 万美元赎金。当 CD Universe 拒绝支付赎金时,Maxus 就公开张贴了这些信用卡号 - 这损害了 CD Universe 的顾客并使这些顾客有合理的理由转而光顾其它商店。 案例 #3 CIA 最近了解到奥萨马·本·拉登的基地恐怖分子组织对网络恐怖活动有着“非常浓厚的兴趣”,这是人们先前所不相信的。链接到基地组织的计算机都可以获得各种计算机“破解”工具,旨在引起灾难性的破坏。 回页首 它们正在攻击您的程序 - 您准备好了吗? 计算机攻击已成为一个非常严重的问题。1997 年,CERT/CC 报告发生了 2134 起计算机安全性事件,并报告了 311 个截然......

阅读全文(1452) | 评论:0

HTTP协议 - Method Definitions(2009-02-27 15:50:00)

摘要:方法定义(Method Definitions)
 
 通用的HTTP/1.0的方法集将在下面定义,虽然该方法集可以扩展,但并不保证附加的
方法能够被扩展的客户端和服务器端所支持。 8.1  GET
 
 GET方法就是以实体方式得到由请求URI所指定资源的信息。如果请求URI只是一个
数据产生过程,那么最终要在回应实体中返回的是由该处理过程的结果所指向的资源,而不
是返回该处理过程的描述文字,除非那段文字恰好是处理的输出。
 如果请求消息包含If-Modified-Since标题域,GET方法的语法就变成“条件GET”,即
“(conditional GET)”。条件GET方法可以对指定资源进行判断,如果它在If-Modified-Since
标题域(见10.9节)中的指定日期后发生了更新,才启动传输,否则不传输。这种条件GET
允许被缓存的实体在不必经过多次请求或不必要的数据传输就能进行刷新,从而有助于降低
网络负载。 8.2  HEAD
 
 HEAD方法与GET几乎一样,区别在于,HEAD方法不让服务器在回应中返回任何实
体。对HEAD请求的回应部分来说,它的HTTP标题中包含的元信息与通过GET请求所得
到的是相同的。通过使用这种方法,不必传输整个实体主体,就可以得到请求URI所指定
资源的元信息。该方法通常用来测试超链接的合法性、可访问性及最近更新。
 与条件GET不同,不存在所谓的“条件HEAD”,即"conditional HEAD"。即使在HEAD
请求中指定If-Modified-Since标题域,它也会被忽略。 8.3  POST
 
 POST方法用来向目的服务器发出请求,要求它接受被附在请求后的实体,并把它当作
请求队列(Request-Line)中请求URI所指定资源的附加新子项。POST被设计成用统一的
方法实现下列功能: o 对现有资源的注释(Annotation of existing resources); o 向电子公告栏、新闻组,邮件列表或类似讨论组发送......

阅读全文(4522) | 评论:0

SSL密钥协商的形象化比喻(2009-02-26 16:50:00)

摘要:来源 http://www.net130.com/2004/5-28/202246-2.html 我们假设A与B通信,A是SSL客户端,B是SSL服务器端,加密后的消息放在方括号[]里,以突出明文消息的区别。双方的处理动作的说明用圆括号()括起。 A:我想和你安全的通话,我这里的对称加密算法有DES,RC5,密钥交换算法有RSA和DH,摘要算法有MD5和SHA。 B:我们用DES-RSA-SHA这对组合好了。 这是我的证书,里面有我的名字和公钥,你拿去验证一下我的身份(把证书发给A)。 目前没有别的可说的了。 A:(查看证书上B的名字是否无误,并通过手头早已有的CA的证书验证了B的证书的真实性,如果其中一项有误,发出警告并断开连接,这一步保证了B的公钥的真实性) (产生一份秘密消息,这份秘密消息处理后将用作加密密钥,加密初始化向量和hmac的密钥。将这份秘密消息-协议中称为per_master_secret- 用B的公钥加密,封装成称作ClientKeyExchange的消息。由于用了B的公钥,保证了第三方无法窃听) 我生成了一份秘密消息,并用你的公钥加密了,给你(把ClientKeyExchange发给B) 注意,下面我就要用加密的办法给你发消息了! (将秘密消息进行处理,生成加密密钥,加密初始化向量和hmac的密钥) [我说完了] B:(用自己的私钥将ClientKeyExchange中的秘密消息解密出来,然后将秘密消息进行处理,生成加密密钥,加密初始化向量和hmac的密钥,这时双方已经安全的协商出一套加密办法了) 注意,我也要开始用加密的办法给你发消息了! [我说完了] A: [我的秘密是...] B: [其它人不会听到的...] ......

阅读全文(4582) | 评论:0

从U盘安装Linux--Fedora篇(2009-02-07 11:58:00)

摘要:1.下载Fedora-9-i386-DVD,放在U盘中(FAT32分区,要足够大才行 4G够了) URL:http://fedoraproject.org/zh_CN/get-fedora 2.提取出isolinux文件夹下面的两个文件 initrd.img 和 vmlinuz 放在C盘根目录下。  3.下载grub4dos,解压提取出个三个文件 grldr grub.exe 和 menu.lst(若无此文件,则可自己在C盘下建一个txt文件,然后把文件类型改为.lst就可) 放在C盘根目录下。 URL:http://download.gna.org/grub4dos/ 4.用记事本打开menu.lst,最后添加上: title Install Fedora 9 kernel (hd0,0)/vmlinuz initrd (hd0,0)/initrd.img 5.用记事本打开C盘根目录下的系统隐藏文件boot.ini,后面加上如下内容: c:\grldr=GRUB 6.重启,选择"GRUB” ,再选择"Install Fedora 9”,即可进入安装界面。 7.在img文件来源处选着对应的U盘即可 其实原理同硬盘安装^_^,因为本本的空间太小,没办法从硬盘安装就想到用U盘做载体。O(∩_∩)O哈哈~~~......

阅读全文(5807) | 评论:0

C++的iostream标准库介绍(2009-02-06 17:51:00)

摘要:C++的iostream标准库介绍 作者:管宁 * C++的iostream标准库介绍 o 0 为什么需要iostream o 1 iostream: istream 和 ostream o 2 fstream: ifstream 和 ofstream o 3 strstream: ostrstream 和 istrstream o 4 stringstream o 5 io_state 输入/输出的状态标志 0 为什么需要iostream 我们从一开始就一直在利用C++的输入输出在做着各种练习,输入输出是由iostream库提供的,所以讨论此标准库是有必要的,它与C语言的 stdio库不同,它从一开始就是用多重继承与虚拟继承实现的面向对象的层次结构,作为一个c++的标准库组件提供给程序员使用。   iostream为内置类型类型对象提供了输入输出支持,同时也支持文件的输入输出,类的设计者可以通过对iostream库的扩展,来支持自定义类型的输入输出操作。   为什么说要扩展才能提供支持呢?我们来一个示例。 #include #include using namespace std; class Test { public: Test(int a=0,int b=0) { Test::a=a; Test::b=b; } int a; int b; }; int main() { Test t(100,50); printf("%???",t);//不明确的输出格式 scanf("%???",t);//不明确的输入格式 couta表示将数据放入a对象中。 2. ......

阅读全文(4711) | 评论:0