摘要:
简单的生活对我们每个人都有不同的意义和价值。对我而言,简单的生活意味着去粗取精,避开纷争去追求内心的平和,以及把时间花在真正对自己重要的事情上。这就意味着摆脱纠缠不清的种种,把这些时间用来陪伴自己心爱的人和做自己喜欢做的事情。避开一些杂事,你的生活将变得更加有价值。然而,让生活变得简单并不像说起来那么容易。简单的生活是生命的过程,而不是目的。如果你想让生活变得轻松而简单,请接着读下去:如果你觉得以下的72条观念过于冗长,那么它们可以被简短的概括成以下两条:定义对你而言最重要的事情。专注于对你最重要的事情,其它的统统不要。(原文有72条,为了简约生活,我删掉了一些……)找出对你而言最重要的4-5 阅读全文
摘要:
使用系统命令是一项危险的操作,尤其在你试图使用远程数据来构造要执行的命令时更是如此。如果使用了被污染数据,命令注入漏洞就产生了。exec()是用于执行shell命令的函数。它返回执行并返回命令输出的最后一行,但你可以指定一个数组作为第二个参数,这样输出的每一行都会作为一个元素存入数组。使用方式如下:1假设ls命令在shell中手工运行时会产生如下输出:1$ ls2total 03-rw-rw-r-- 1 chris chris 0 May 21 12:34 php-security4-rw-rw-r-- 1 chris chris 0 May 21 12:34 chris-shiflett当通 阅读全文
摘要:
关于包含的一个重要问题是源代码的暴露。产生这个问题主要原因是下面的常见情况:对包含文件使用.inc的扩展名包含文件保存在网站主目录下Apache未设定.inc文件的类型Apache的默认文件类型是text/plain上面情况造成了可以通过URL直接访问包含文件。更糟的是,它们会被作为普通文本处理而不会被PHP所解析,这样你的源代码就会显示在用户的浏览器上。避免这种情况很容易。只能重组你的应用,把所有的包含文件放在网站主目录之外就可以了,最好的方法是只把需要公开发布的文件放置在网站主目录下。虽然这听起来有些疯狂,很多情形下能导致源码的暴露。我曾经看到过Apache的配置文件被误写(并且在下次启动 阅读全文
摘要:
一个比欺骗表单更高级和复杂的攻击方式是HTTP请求欺骗。这给了攻击者完全的控制权与灵活性,它进一步证明了不能盲目信任用户提交的任何数据。为了演示这是如何进行的,请看下面位于http://example.org/form.php的表单:12Please select a color:389如果用户选择了Red并点击了Select按钮后,浏览器会发出下面的HTTP请求:1POST /process.php HTTP/1.12Host: example.org3User-Agent: Mozilla/5.0 (X11; U; Linux i686)4Referer: http://example.o 阅读全文
摘要:
跨站请求伪造(CSRF)是一种允许攻击者通过受害者发送任意HTTP请求的一类攻击方法。此处所指的受害者是一个不知情的同谋,所有的伪造请求都由他发起,而不是攻击者。这样,很你就很难确定哪些请求是属于跨站请求伪造攻击。事实上,如果没有对跨站请求伪造攻击进行特意防范的话,你的应用很有可能是有漏洞的。请看下面一个简单的应用,它允许用户购买钢笔或铅笔。界面上包含下面的表单:010203Item:0408Quantity: 091011一个攻击者会首先使用你的应用以收集一些基本信息。例如,攻击者首先访问表单并发现两个表单元素item及quantity,他也同时知道了item的值会是铅笔或是钢笔。下面的bu 阅读全文
摘要:
Ctype函数是PHP内置的字符串体测函数。主要有以下几种ctype_alnum-- Check for alphanumeric character(s)检测是否是只包含[A-Za-z0-9]ctype_alpha-- Check for alphabetic character(s)检测是否是只包含[A-Za-z]ctype_cntrl-- Check for control character(s)检查是否是只包含类是“\n\r\t”之类的字 符控制字符ctype_digit-- Check for numeric character(s)检查时候是只包含数字字符的字符串(0-9)cty 阅读全文
摘要:
深度防范深度防范原则是安全专业人员人人皆知的原则,它说明了冗余安全措施的价值,这是被历史所证明的。深度防范原则可以延伸到其它领域,不仅仅是局限于编程领域。使用过备份伞的跳伞队员可以证明有冗余安全措施是多么的有价值,尽管大家永远不希望主伞失效。一个冗余的安全措施可以在主安全措施失效的潜在的起到重大作用。回到编程领域,坚持深度防范原则要求您时刻有一个备份方案。如果一个安全措施失效了,必须有另外一个提供一些保护。例如,在用户进行重要操作前进行重新用户认证就是一个很好的习惯,尽管你的用户认证逻辑里面没有已知缺陷。如果一个未认证用户通过某种方法伪装成另一个用户,提示录入密码可以潜在地避免未认证(未验证) 阅读全文
摘要:
没有不会犯错的开发者,PHP的错误报告功能可以协助你确认和定位这些错误,可以提供的这些错误的详细描述,但如果被恶意攻击者看到,这就不妙了。不能让大众看到报错信息,这一点很重要。做到这一点很容易,只要关闭display_errors,当然如果您希望得到出错信息,可以打开log_errors选项,并在error_log选项中设置出错日志文件的保存路径。由于出错报告的级别设定可以导致有些错误无法发现,您至少需要把error_reporting设为E_ALL。E_ALL | E_STRICT 是最高的设置,提供向下兼容的建议,如不建议使用的提示。所有的出错报告级别可以在任意级别进行修改,所以您如果使用 阅读全文
摘要:
除了能在共享服务器上读取任意文件之外,攻击者还能建立一个可以浏览文件系统的脚本。由于你的大多数敏感文件不会保存在网站主目录下,此类脚本一般用于找到你的源文件的所在位置。请看下例:01read())26{27$size=filesize("$dir$filename");2829if(is_dir("$dir$filename"))30{31$type='dir';32$filename.='/';33}34else35{36$type='file';37}3839if(is_readable("$ 阅读全文
摘要:
绝不要信任外部数据或输入关于 Web 应用程序安全性,必须认识到的第一件事是不应该信任外部数据。外部数据(outside data) 包括不是由程序员在 PHP 代码中直接输入的任何数据。在采取措施确保安全之前,来自任何其他来源(比如 GET 变量、表单 POST、数据库、配置文件、会话变量或 cookie)的任何数据都是不可信任的。例如,下面的数据元素可以被认为是安全的,因为它们是在 PHP 中设置的。1但是,下面的数据元素都是有瑕疵的。1为什么第一个变量 $myUsername 是有瑕疵的?因为它直接来自表单 POST。用户可以在这个输入域中输入任何字符串,包括用来清除文件或运行以前上传的 阅读全文
摘要:
跨站脚本攻击是众所周知的攻击方式之一。所有平台上的Web应用都深受其扰,PHP应用也不例外。所有有输入的应用都面临着风险。Webmail,论坛,留言本,甚至是Blog。事实上,大多数Web应用提供输入是出于更吸引人气的目的,但同时这也会把自己置于危险之中。如果输入没有正确地进行过滤和转义,跨站脚本漏洞就产生了。以一个允许在每个页面上录入评论的应用为例,它使用了下面的表单帮助用户进行提交:12Name: 3Comment: 45程序向其他访问该页面的用户显示评论。例如,类似下面的代码段可能被用来输出一个评论($comment)及与之对应的发表人($name):1$name writes:&quo 阅读全文
摘要:
SPL提供了6个迭代器接口:Traversable遍历接口(检测一个类是否可以使用foreach进行遍历的接口)Iterator迭代器接口(可在内部迭代自己的外部迭代器或类的接口)IteratorAggregate聚合式迭代器接口(创建外部迭代器的接口)OuterIterator迭代器嵌套接口(将一个或多个迭代器包裹在另一个迭代器中)RecursiveIterator递归迭代访问接口(提供递归访问功能)SeekableIterator可索引迭代访问接口(实现查找功能)下面对各种迭代器接口简单介绍一下:1. TraversableTraversable接口实际上不是一个接口,在实际写php代码中 阅读全文
摘要:
斐波纳契数列通常做法是用递归实现,当然还有其它的方法。这里现学现卖,用PHP的迭代器来实现一个斐波纳契数列,几乎没有什么难度,只是把类里的next()方法重写了一次。注释已经写到代码中,也是相当好理解的。/*** @author 简明现代魔法 http://www.nowamagic.net*/class Fibonacci implements Iterator { private $previous = 1; private $current = 0; private $key = 0; public function current() { ... 阅读全文
摘要:
迭代器有时又称光标(cursor)是程式设计的软件设计模式,可在容器物件(container,例如list或vector)上遍访的接口,设计人员无需关心容器物件的内容。各种语言实作Iterator的方式皆不尽同,有些面向对象语言像Java, C#, Python, Delphi都已将Iterator的特性内建语言当中,完美的跟语言整合,我们称之隐式迭代器(implicit iterator),但像是C++语言本身就没有Iterator的特色,但STL仍利用template实作了功能强大的iterator。PHP5开始支持了接口, 并且内置了Iterator接口, 所以如果你定义了一个类,并实现 阅读全文
摘要:
对象关系映射(Object Relational Mapping,简称ORM)是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术。 简单的说,ORM是通过使用描述对象和数据库之间映射的元数据,将程序中的对象自动持久化到关系数据库中。本质上就是将数据从一种形式转换到另外一种形式。ORM提供了所有SQL语句的生成,代码人员远离了数据库概念。从一个概念需求(例如一个HQL)映射为一个SQL语句,并不需要什么代价,连1%的性能损失都没有。真正的性能损失在映射过程中,更具体地讲,是在对象实例化的过程中。目前PHP 开源比较有名的ORM有以下几个:1、PropelPropel是一个适用于PHP5 阅读全文
摘要:
随着移动设备的普及,网站也会迎来越来越多移动设备的访问。用适应PC的页面,很多时候对手机用户不友好,那么有些时候,我们需要判断用户是否用手机访问,如果是手机的话,就跳转到指定的手机友好页面。这里就介绍一下,如何判断用户是否用手机访问。自定义的函数如下:01$agent= check_wap();02if($agent)03{04header('Location:http://www.nowamagic.net');05exit;06}0708// check if wap09functioncheck_wap(){10// 先检查是否为wap代理,准确度高11if(strist 阅读全文
摘要:
后门URL是指虽然无需直接调用的资源能直接通过URL访问。例如,下面WEB应用可能向登入用户显示敏感信息:由于sensitive.php位于网站主目录下,用浏览器能跳过验证机制直接访问到该文件。这是由于在网站主目录下的所有文件都有一个相应的URL地址。在某些情况下,这些脚本可能执行一个重要的操作,这就增大了风险。为了防止后门URL,你需要确认把所有包含文件保存在网站主目录以外。所有保存在网站主目录下的文件都是必须要通过URL直接访问的。 阅读全文
摘要:
[php] view plaincopydb=&$db;session_module_name('user');//session文件保存方式,这个是必须的!除非在Php.ini文件中设置了session_set_save_handler(array(&$this,'open'),//在运行session_start()时执行array(&$this,'close'),//在脚本执行完成或调用session_write_close()或session_destroy()时被执行,即在所有session操作完后被执行arra 阅读全文
摘要:
当你关注于防止源码的暴露时,你的会话数据只同样存在着风险。在默认情况下,SESSION保存在/tmp目录下。这样做在很多情形下是很方便的,其中之一是所有用户都有对/tmp的写入权限,这样Apache同样也有权限进行写入。虽然其他用户不能直接从shell环境读取这些会话文件,但他们可以写一个简单的脚本来进行读取:01read())10{11if(substr($filename, 0, 5) =='sess_')12{13$data=file_get_contents("$path/$filename");1415if(!empty($data))16{17s 阅读全文
摘要:
一个与会话暴露类似的问题是会话注入。此类攻击是基于你的WEB服务器除了对会话存储目录有读取权限外,还有写入权限。因此,存在着编写一段允许其他用户添加,编辑或删除会话的脚本的可能。下例显示了一个允许用户方便地编辑已存在的会话数据的HTML表单:0106070809read())15{16if(substr($filename, 0, 5) =='sess_')17{18$sess_data=file_get_contents("$path/$filename");1920if(!empty($sess_data))21{22session_decode($se 阅读全文