201603-16 PHP安全-加密 加密 作为一本相关安全方面的书,通常加密是需要提及的话题。我之所以在本书的主体部分忽略了加密问题,是因为它的用途是狭窄的,而开发者应从大处着眼来考虑安全问题。过分依赖于加密常常会混淆问题的根源。尽管加密本身是有效的,但是进行加密并不会神奇地提高一个应用的安全性。 一个PHP开发人员应主要熟悉以下的加密方式: l 对称加密l ... 继续阅读 >
201603-16 PHP安全-函数 函数 在我写作本书的时候,http://php.net/quickref.php列出了共3917个函数,其中包括一些类似函数的语法结构,在此我不准备把它们从函数中区分开来,而是把它作为函数看待。 由于函数数量很大,一一说明它们的正确及安全用法是不太可能的。在此我选出了我认为最需要注意的函数。选择的标准包括使用的频繁度、使用时的危险(安全)度及我本人的经验。 对于每一个列出的函数,我都会提供推荐的使用方法。... 继续阅读 >
201603-16 PHP安全-配置选项 配置选项 尽管本书的焦点是在于应用的安全性,但有一些配置选项是任何关心安全的开发者必需熟悉的。PHP的配置会影响你所写代码的行为以及你使用的技巧,必要时你需要稍稍负责一下应用程序以外的东西。 PHP的配置主要由一个名为php.ini的文件所指定。该文件包含很多配置选项,每一项都会对PHP产生非常特定的影响。如果该文件不存在,或者该文件中的某选项不存在,则会使用默认值。 如果你不知道php.ini... 继续阅读 >
201603-15 PHP安全-安全模式 安全模式 PHP的safe_mode选项的目的是为了解决本章所述的某些问题。但是,在PHP层面上去解决这类问题从架构上来看是不正确的,正如PHP手册所述(http://php.net/features.safe-mode)。 当安全模式生效时,PHP会对正在执行的脚本所读取(或所操作)文件的属主进行检查,以保证与该脚本的属主是相同的。虽然这样确实可以防范本章中的很多例子,但它不会影响其它语言编写的程序。例如,使用Bash写的CGI... 继续阅读 >
201603-15 PHP安全-文件系统浏览 文件系统浏览 除了能在共享服务器上读取任意文件之外,攻击者还能建立一个可以浏览文件系统的脚本。由于你的大多数敏感文件不会保存在网站主目录下,此类脚本一般用于找到你的源文件的所在位置。请看下例: <pre> <?php if(isset($_GET['dir'])) { ls($_GET['dir']); } elseif(isset($_GET['file'])) { cat($... 继续阅读 >
201603-15 PHP安全-会话注入 会话注入 一个与会话暴露类似的问题是会话注入。此类攻击是基于你的WEB服务器除了对会话存储目录有读取权限外,还有写入权限。因此,存在着编写一段允许其他用户添加,编辑或删除会话的脚本的可能。下例显示了一个允许用户方便地编辑已存在的会话数据的HTML表单: <?php session_start(); ?> <formaction="inject.php"method="POST"> <?php&nbs... 继续阅读 >
201603-15 PHP安全-会话数据暴露(二) 会话数据暴露 当你关注于防止源码的暴露时,你的会话数据只同样存在着风险。在默认情况下,SESSION保存在/tmp目录下。这样做在很多情形下是很方便的,其中之一是所有用户都有对/tmp的写入权限,这样Apache同样也有权限进行写入。虽然其他用户不能直接从shell环境读取这些会话文件,但他们可以写一个简单的脚本来进行读取: <?php header('Content-Type:text/plain'); session_s... 继续阅读 >
201603-15 PHP安全-源码暴露(二) 源码暴露 你的WEB服务器必须要能够读取你的源确并执行它,这就意味着任意人所写的代码被服务器运行时,它同样可以读取你的源码。在一个共享主机上,最大的风险是由于WEB服务器是共享的,因此其它开发者所写的PHP代码可以读取任意文件。 <?php header('Content-Type:text/plain'); readfile($_GET['file']); ?> 通过在你的源码所在的主机上运行上面... 继续阅读 >
201603-15 PHP安全-永久登录 永久登录 永久登录指的是在浏览器会话间进行持续验证的机制。换句话说,今天已登录的用户明天依然是处于登录状态,即使在多次访问之间的用户会话过期的情况下也是这样。 永久登录的存在降低了你的验证机制的安全性,但它增加了可用性。不是在用户每次访问时麻烦用户进行身份验证,而是提供了记住登录的选择。 图7-2.攻击者通过重播用户的cookie进行未授权访问 据我观察,最常见的有缺陷的永... 继续阅读 >
201603-15 PHP安全-重播攻击 重播攻击 重播攻击,有时称为演示攻击,即攻击者重现以前合法用户向服务器所发送的数据以获取访问权或其它分配给该用户的权限。 与密码嗅探一样,防止重播攻击也需要你意识到数据的暴露。为防止重播攻击,你需要加大攻击者获取任何用于取得受限资源的访问权限的数据的难度。这主要要求做到避免以下做法: 设定受保护资源永久访问权的数据的使用;设定受保护资源访问权的数据的暴露(甚至是只提供临时... 继续阅读 >
201603-15 PHP安全-密码嗅探 密码嗅探 尽管攻击者通过嗅探(察看)你的用户和应用间的网络通信并不专门用于访问控制,但要意识到数据暴露变得越来越重要,特别是对于验证信息。 使用SSL可以有效地防止HTTP请求和回应不被暴露。对任何使用https方案的资源的请求可以防止密码嗅探。最好的方法是一直使用SSL来发送验证信息,同时你可能还想用SSL来传送所有的包含会话标识的请求以防止会话劫持。 为防止用户验证信息不致暴露,在表单的actio... 继续阅读 >
201603-15 PHP安全-暴力攻击 暴力攻击 暴力攻击是一种不使用任何特殊手段而去穷尽各种可能性的攻击方式。它的更正式的叫法是穷举攻击——穷举各种可能性的攻击。 对于访问控制,典型的暴力攻击表现为攻击者通过大量的尝试去试图登录系统。在多数情况下,用户名是已知的,而只需要猜测密码。 尽管暴力攻击没有技巧性可言,但词典攻击似乎有一定的技巧性。最大的区别是在进行猜测时的智能化。词典攻击只会最可能的情况列表中进行穷举,而... 继续阅读 >
201603-15 PHP安全-命令注入 命令注入 使用系统命令是一项危险的操作,尤其在你试图使用远程数据来构造要执行的命令时更是如此。如果使用了被污染数据,命令注入漏洞就产生了。 Exec()是用于执行shell命令的函数。它返回执行并返回命令输出的最后一行,但你可以指定一个数组作为第二个参数,这样输出的每一行都会作为一个元素存入数组。使用方式如下: <?php $last=exec('ls',$output,$return); ... 继续阅读 >
201603-14 PHP安全-远程文件风险 远程文件风险 PHP有一个配置选项叫allow_url_fopen,该选项默认是有效的。它允许你指向许多类型的资源,并像本地文件一样处理。例如,通过读取URL你可以取得某一个页面的内容(HTML): <?php $contents=file_get_contents('http://example.org/'); ?> 正如第五章所讨论的那样,当被污染数据用于include和require的文件指向时,会产生严重漏洞。实际上,我认为这种漏... 继续阅读 >
201603-14 PHP安全-文件系统跨越 文件系统跨越 无论你用什么方法使用文件,你都要在某个地方指定文件名。在很多情况下,文件名会作为fopen()函数的一个参数,同时其它函数会调用它返回的句柄: <?php $handle=fopen('/path/to/myfile.txt','r'); ?> 当你把被污染数据作为文件名的一部分时,漏洞就产生了: <?php $handle=fopen("/path/to/{$_GET['filename']}.t... 继续阅读 >
201603-14 PHP安全-代码注入 代码注入 一个特别危险的情形是当你试图使用被污染数据作为动态包含的前导部分时: <?php include"{$_GET['path']}/header.inc"; ?> 在这种情形下攻击者能操纵不只是文件名,还能控制所包含的资源。由于PHP默认不只可以包含文件,还可以包含下面的资源(由配置文件中的allow_url_fopen所控制): <?php include'http://www.google.com/';... 继续阅读 >
201603-14 PHP安全-文件名操纵 文件名操纵 在很多情形下会使用动态包含,此时目录名或文件名中的部分会保存在一个变量中。例如,你可以缓存你的部分动态页来降低你的数据库服务器的负担。 <?php include"/cache/{$_GET['username']}.html"; ?> 为了让这个漏洞更明显,示例中使用了$_GET。如果你使用了受污染数据时,这个漏洞同样存在。使用$_GET['username']是一个极端的例子,通过它可以把问... 继续阅读 >
201603-14 PHP安全-后门URL 后门URL 后门URL是指虽然无需直接调用的资源能直接通过URL访问。例如,下面WEB应用可能向登入用户显示敏感信息: <?php $authenticated=FALSE; $authenticated=check_auth(); /*...*/ if($authenticated) { include'./sensitive.php'; } ?> 由于sensitive.php位于网站主... 继续阅读 >
201603-14 PHP安全-源码暴露 源码暴露 关于包含的一个重要问题是源代码的暴露。产生这个问题主要原因是下面的常见情况: l 对包含文件使用.inc的扩展名l 包含文件保存在网站主目录下l Apache未设定.inc文件的类型l Apache的默认文件类型是text/plain 上面情况造成了可以通过URL直接访问包含文件。更糟的是,它... 继续阅读 >
201603-14 PHP安全-会话劫持 会话劫持 最常见的针对会话的攻击手段是会话劫持。它是所有攻击者可以用来访问其它人的会话的手段的总称。所有这些手段的第一步都是取得一个合法的会话标识来伪装成合法用户,因此保证会话标识不被泄露非常重要。前面几节中关于会话暴露和固定的知识能帮助你保证会话标识只有服务器及合法用户才能知道。 深度防范原则(见第一章)可以用在会话上,当会话标识不幸被攻击者知道的情况下,一些不起眼的安全措施... 继续阅读 >
201603-14 PHP安全-会话固定 会话固定 关于会话,需要关注的主要问题是会话标识的保密性问题。如果它是保密的,就不会存在会话劫持的风险了。通过一个合法的会话标识,一个攻击者可以非常成功地冒充成为你的某一个用户。 一个攻击者可以通过三种方法来取得合法的会话标识: l 猜测l 捕获l 固定 PHP生成的是随机性很... 继续阅读 >
201603-14 PHP安全-会话数据暴露 会话数据暴露 会话数据常会包含一些个人信息和其它敏感数据。基于这个原因,会话数据的暴露是被普遍关心的问题。一般来说,暴露的范围不会很大,因为会话数据是保存在服务器环境中的,而不是在数据库或文件系统中。因此,会话数据自然不会公开暴露。 使用SSL是一种特别有效的手段,它可以使数据在服务器和客户端之间传送时暴露的可能性降到最低。这对于传送敏感数据的应用来说非常重要。SSL在HTTP之上提供了一个... 继续阅读 >
201603-14 PHP安全-Cookie 盗窃 Cookie盗窃 因使用Cookie而产生的一个风险是用户的cookie会被攻击者所盗窃。如果会话标识保存在cookie中,cookie的暴露就是一个严重的风险,因为它能导致会话劫持。 图4-2.PHP为你处理相关会话管理的复杂过程最常见的cookie暴露原因是浏览器漏洞和跨站脚本攻击(见第2章)。虽然现在并没有已知的该类浏览器漏洞,但是以往出现过几例,其中最有名的一例同时发生在IE浏览器的4.0,5.0,5.5及6.0版本(这些... 继续阅读 >
201603-12 PHP安全-数据的暴露 数据的暴露 关于数据库,另外需要关心的一点是敏感数据的暴露。不管你是否保存了信用卡号,社会保险号,或其它数据,你还是希望确认数据库是安全的。 虽然数据库安全已经超出了本书所讨论的范围(也不是PHP开发者要负责的),但是你可以加密最敏感的数据,这样只要密钥不泄露,数据库的安全问题就不会造成灾难性的后果。(关于加密的详细介绍参见本书附录C) 要看图的话,请至技术文档区下载... 继续阅读 >