以图明志

PHP服务器脚本

PHP安全编程:PHP的安全模式

对文件的属主进行检查
PHP的safe_mode选项的目的是为了解决本小节前后所述的某些问题。当安全模式生效时,PHP会对正在执行的脚本所读取(或所操作)文件的属主进行检查,以保证与该脚本的属主是相同的。虽然这样确实可以防范本章中的很多例子,但它不会影响其它语言编写的程序。

PHP服务器脚本

PHP安全编程:主机文件目录浏览

数据库信息数据保存
除了能在共享服务器上读取任意文件之外,攻击者还能建立一个可以浏览文件系统的脚本。由于你的大多数敏感文件不会保存在网站主目录下,此类脚本一般用于找到你的源文件的所在位置。攻击者可能会首先察看/etc/passwd文件或/home目录以取得该服务器上的用户名清单;可以通过语言的结构如include或require来发现保存在网站主目录以外的源文件所在位置。

PHP服务器脚本

PHP安全编程:会话数据注入

比会话劫持更强大的攻击
一个与会话暴露类似的问题是会话注入。此类攻击是基于你的WEB服务器除了对会话存储目录有读取权限外,还有写入权限。因此,存在着编写一段允许其他用户添加,编辑或删除会话的脚本的可能。下例显示了一个允许用户方便地编辑已存在的会话数据的HTML表单。

PHP服务器脚本

PHP安全编程:更优的会话数据安全

更好地防范session暴露
当你关注于防止源码的暴露时,你的会话数据只同样存在着风险。在默认情况下,SESSION保存在/tmp目录下。这样做在很多情形下是很方便的,其中之一是所有用户都有对/tmp的写入权限,这样Apache同样也有权限进行写入。虽然其他用户不能直接从shell环境读取这些会话文件,但他们可以写一个简单的脚本来进行读取。

PHP服务器脚本

PHP安全编程:共享主机的源码安全

主机上的源码暴露问题
你的WEB服务器必须要能够读取你的源确并执行它,这就意味着任意人所写的代码被服务器运行时,它同样可以读取你的源码。在一个共享主机上,最大的风险是由于WEB服务器是共享的,因此其它开发者所写的PHP代码可以读取任意文件。通过在你的源码所在的主机上运行上面脚本,攻击者可以通过把file的值指定为完整的路径和文件名来使WEB服务器读取并显示任何文件。

PHP服务器脚本

PHP安全编程:记住登录状态的安全做法

永久登录的隐患
永久登录指的是在浏览器会话间进行持续验证的机制。换句话说,今天已登录的用户明天依然是处于登录状态,即使在多次访问之间的用户会话过期的情况下也是这样。永久登录的存在降低了你的验证机制的安全性,但它增加了可用性。不是在用户每次访问时麻烦用户进行身份验证,而是提供了记住登录的选择。

PHP服务器脚本

PHP安全编程:密码嗅探与重播攻击

加密需要保护的数据
尽管攻击者通过嗅探(察看)你的用户和应用间的网络通信并不专门用于访问控制,但要意识到数据暴露变得越来越重要,特别是对于验证信息。使用SSL可以有效地防止HTTP请求和回应不被暴露。对任何使用https方案的资源的请求可以防止密码嗅探。最好的方法是一直使用SSL来发送验证信息,同时你可能还想用SSL来传送所有的包含会话标识的请求以防止会话劫持。

PHP服务器脚本

PHP安全编程:暴力破解攻击

频繁发送猜测的登录数据
暴力攻击是一种不使用任何特殊手段而去穷尽各种可能性的攻击方式。它的更正式的叫法是穷举攻击——穷举各种可能性的攻击。对于访问控制,典型的暴力攻击表现为攻击者通过大量的尝试去试图登录系统。在多数情况下,用户名是已知的,而只需要猜测密码。

PHP服务器脚本

PHP安全编程:shell命令注入

使用系统命令是一项危险的操作
使用系统命令是一项危险的操作,尤其在你试图使用远程数据来构造要执行的命令时更是如此。如果使用了被污染数据,命令注入漏洞就产生了。exec()是用于执行shell命令的函数。它返回执行并返回命令输出的最后一行,但你可以指定一个数组作为第二个参数,这样输出的每一行都会作为一个元素存入数组。

PHP服务器脚本

PHP安全编程:打开远程文件的风险

注意深度防范与过滤污染文件名
PHP有一个配置选项叫allow_url_fopen,该选项默认是有效的。它允许你指向许多类型的资源,并像本地文件一样处理。当被污染数据用于include和require的文件指向时,会产生严重漏洞。实际上,我认为这种漏洞是PHP应用中最危险的漏洞之一,这是因为它允许攻击者执行任意代码。

PHP服务器脚本

PHP安全编程:文件目录猜测漏洞

不要把污染数据参与文件名
无论你用什么方法使用文件,你都要在某个地方指定文件名。在很多情况下,文件名会作为fopen()函数的一个参数,与许多攻击的情况相同,在构造一个字串时如果使用了被污染数据,就会给攻击者以机会来更改这个字串,这样就会造成你的应用以你不希望方式运行。如果你养成了只使用已过滤数据来建立动态字串的习惯,就可以防止很多类型包括很多你所不熟悉的漏洞的出现。

PHP服务器脚本

PHP安全编程:文件包含的代码注入攻击

include会执行包含文件的代码
include语句在此时会把http://www.google.com的网页源代码作为本地文件一样包含进来。虽然上面的例子是无害的,但是想像一下如果GOOGLE返回的源代码包含PHP代码时会如何。这样其中包含的PHP代码就会被解析并执行。这是攻击者借以发布恶意代码摧毁你的安全体系的良机。

PHP服务器脚本

PHP安全编程:阻止文件名被操纵

文件名与目录的操纵攻击
在很多情形下会使用动态包含,此时目录名或文件名中的部分会保存在一个变量中。例如,你可以缓存你的部分动态页来降低你的数据库服务器的负担。为了让这个漏洞更明显,示例中使用了$_GET。如果你使用了受污染数据时,这个漏洞同样存在。使用$_GET['username']是一个极端的例子,通过它可以把问题看得更清楚。

PHP服务器脚本

PHP安全编程:留心后门URL

直接可以通过URL访问
后门URL是指虽然无需直接调用的资源能直接通过URL访问。由于sensitive.php位于网站主目录下,用浏览器能跳过验证机制直接访问到该文件。这是由于在网站主目录下的所有文件都有一个相应的URL地址。在某些情况下,这些脚本可能执行一个重要的操作,这就增大了风险。

PHP服务器脚本

PHP安全编程:防止源代码的暴露

尽量不要将代码放在根目录下
关于包含的一个重要问题是源代码的暴露。产生这个问题主要原因是下面的常见情况: 对包含文件使用.inc的扩展名,包含文件保存在网站主目录下等。上面情况造成了可以通过URL直接访问包含文件。更糟的是,它们会被作为普通文本处理而不会被PHP所解析,这样你的源代码就会显示在用户的浏览器上。

PHP服务器脚本

PHP安全编程:session劫持的防御

session数据暴露与劫持
会话数据常会包含一些个人信息和其它敏感数据。基于这个原因,会话数据的暴露是被普遍关心的问题。一般来说,暴露的范围不会很大,因为会话数据是保存在服务器环境中的,而不是在数据库或文件系统中。因此,会话数据自然不会公开暴露。最常见的针对会话的攻击手段是会话劫持。它是所有攻击者可以用来访问其它人的会话的手段的总称。
1 / 3 首页 < Prev 1 2 3 Next > 尾页 页码: