PHP を使用して安全なアプリケーションを開発する方法を教えます

WBOY
リリース: 2016-06-21 08:58:59
オリジナル
1374 人が閲覧しました

セキュリティ|手順

PHP は、クロスプラットフォームのサーバー側埋め込みスクリプト言語です。 C、Java、Perl 言語から多くの構文を借用し、PHP 独自の機能を組み合わせて、WEB 開発者が動的に生成されるページをすばやく作成できるようにします。最新バージョンの PHP5.01 は、最新のデータベース (Mysql、PostgreSQL、Oracle、DB2、Sybase など) をサポートしています。もう 1 つのポイントは、PHP は完全に無料であり、PHP 公式サイト (http://www.php.net) から無料でダウンロードできます。 PHP は、図-1 に示すように、WEB サーバーの機能を拡張し、最適な Web サービスのバックエンド拡張インターフェイスを実装します。



図-1 PHP による WEB サーバーの機能拡張

PHP の正式名称は、Professional HyperText PreProcessor です。最新の PHP5.01 を例に挙げると、これをサポートする WEB サーバーには、Apache、Microsoft Internet information Sereve、Microsoft Personal Web Server、AOL サーバー、Netscape Enterprise などが含まれます。

PHP は、Web サーバーにモジュールとして組み込まれているか、別個の CGI プログラムとしてインストールされているかに関係なく、サーバー上でファイルにアクセスしたり、コマンドを実行したりすることができます。の上。これらの機能はすべて、PHP の実行時にセキュリティ問題を引き起こします。

PHP は、Perl や C で書かれた CGI プログラムよりも安全な言語となるように意図的に設計されていますが、コンパイル時および実行時にいくつかの構成オプションを正しく使用し、適切なアプリケーション コーディングを行うことで、その動作の安全性が保証されます。 PHP はさまざまな方法で活用できるため、その動作を制御するための設定オプションが多数あります。

多数のオプション パラメータのセットを使用すると、PHP をさまざまな目的に使用できますが、これらのパラメータとサーバー側の設定の組み合わせによってセキュリティ上の問題が発生する可能性があることも意味します。 PHP の構成は、コードと同じくらい柔軟です。 PHP は、シェル ユーザーのすべての権限を使用して、完全なサーバー側アプリケーションを構築するために使用できます。また、最小限のリスクで、厳密に制御された環境で単純なサーバー側インクルードとして使用することもできます。その環境をどのようにセットアップするか、そしてその環境がどの程度安全であるかは、主に PHP 開発者次第です。 注: この記事のすべての操作は Red Hat Linux 9.0 で完了します。

1. ゼロからのセキュリティ

PHP をコンパイルする前に、まずオペレーティング システムのバージョンが最新であり、必要なパッチがインストールされている必要があることを確認します。 PHP のインストールとコンパイル時に注意すべき 4 つの問題:

1. Apachetoolbox を使用して Apache、PHP、Mysql を統合する 現在、Web 構築に最適な黄金の組み合わせは Linux+Apache+Mysql+PHP です。実際の作業プロセスでは、Apache、php、mysql をそれぞれダウンロード、インストール、設定する必要があります。また、特定の状況に応じて、Apache の httpd.conf、php の php.ini および mysql 設定ファイルも変更する必要があります。 ssl 機能を使用するには、それをダウンロードする必要があります。ssl apache モジュールを修正し、その .ini ファイルなどをカスタマイズする必要があります。これらの手順のいずれかに問題があると、Web サイトが正しく実行されなくなります。

経験豊富な Linux ネットワーク管理者であっても、すべてを一度に正常に構成することは困難です。 Apache Toolbox はシェルスクリプトで書かれています。 Apache Toolbox を使用すると、要件に応じて Apache を簡単にカスタマイズし、Apache でサポートされる 52 のサードパーティ ソフトウェア パッケージと 36 のモジュールから選択できます。

カスタマイズ プロセスは完全にメニュー形式で行われ、簡単な手順が説明されています。すべてのコンポーネントはソース コードを使用してインストールされます。インストール プロセス中に RPM パッケージに問題がある場合、wget を使用して新しい利用可能なコンポーネント パッケージが再ダウンロードされます。そういったネットワーク管理者にとっては便利なツールだと思います。

Apache Toolbox は、GUN コマンド ラインまたは X ウィンドウでインストールできます。読者の便宜のため、この記事では例として X ウィンドウでのインストールを取り上げます。最新の apachetoolbox インストール パッケージを www.apachetoolbox.com からダウンロードします。 apache2.0、mysql3.23.51、php4.3、Python 2.0、PostgresSQLv7.1、およびその他の一般的に使用される Web サイト構築ソフトウェアと APC (PHP にキャッシュを提供するモジュール) を含む、Apache Toolbox Apache Toolbox は、Apache をコンパイルする簡単な方法を提供します。これにより、Apache、SSL、PHP、ZendOptimizer、mod_auth-nds、mod-dynvhost、WebDAV、mod_fastcgi、mod_gzip、mod_layout、mod_throttle、mod_accessref、mod_auth_sys、mod_bandwidth、mod_auth_ldap、mod_perl、openldap などを簡単にインストールできます。 PNG 形式の gd ライブラリをサポートします。フルメニューインターフェイスをサポートしています。


図-2 Apachetoolbox インストールインターフェース
2. Apache モジュールを使用する場合に応じてインストールします。 Apache モジュールの場合、Apache のユーザー権限 (通常はユーザー「nobody」) を継承します。 これは、セキュリティと承認メカニズムにある程度の影響を与えます。

たとえば、PHP を使用してデータベースにアクセスする場合、データベース自体にアクセス制御が組み込まれていない限り、ユーザー「誰でも」データベースにアクセスできるようになります。これは、悪意のあるスクリプトがユーザー名とパスワードを必要とせずにデータベースにアクセスして変更できることを意味します。サイバーハッカーが誤ってデータベース管理者の WEB ページにアクセスし、そこにあるすべてのデータベースを削除する可能性は十分にあります。

  您可以利用 Apache 的认证机制来防止这些的发生,或者也可以利用 LDAP 或 .htaccess 文件等来设计您自己的访问模式,并将这些代码包含为您 PHP 脚本的一部分。

  通常,一旦安全机制建立并使得 PHP 的用于(在这种情况下,为 Apache 用户)仅为此承担很小的风险时,我们发现 PHP 此时被禁止往用户目录写入任何文件,或者还有可能被禁止访问和更改数据库。无论往防止的对象中写入文件的好坏以及进入的数据库事务的好坏,其安全性都是同等的。

  在这个时候,一个频繁出现的安全错误是给 Apache root 权限,或者用其它方法提升 Apache 的能力。

  给 Apache 用户赋予 root 权限是及其危险的,而且有可能会连累整个系统。因此,进行 sudo、chroot,或者以 root 账号运行等操作不应该考虑让那些非安全专家来执行。 还有一些更简单的情况。您可以使用 open_basedir 来控制和限制 PHP 能够使用的目录。您还可以建立 Apache 的专用区域,以将所有基于 WEB 的活动都限制到非用户、系统和文件。

  3、把PHP解析器放在Web目录外

  一种安全性非常高的方法是把 PHP 解析程序放置到 WEB 文件目录树以外的某个地方,例如,放置到 /usr/local/bin。这种做法唯一的弊病就是您现在需要在所有含有 PHP 标记符文件的第一行添加类似于以下的内容:

<ccid_code>#!/usr/local/bin/php</ccid_code>
ログイン後にコピー


  您需要使得这些文件成为可执行文件。也就是说,像对待任何其它 CGI 脚本一样来对待它们。这些 CGI 脚本可能是用 Perl、sh 或者任何其它使用的 #! shell-escape 机制来启动它们自身的脚本语言来编写的。要使这个方法中 PHP 能够正确处理 PATH_INFO 和 PATH_TRANSLATED 信息,在编译 PHP 解析器时必须使用配置参数--enable-discard-path。下面是一个能作为CGI程序运行的PHP脚的例子。

<ccid_code>#!/usr/local/bin/phpecho "This is a  my small  program"</ccid_code>
ログイン後にコピー


  4、最后将PHP请升级为最新稳定版本:4.3.8。

  在PHP 4.1中,添加了一组特殊数据以访问外部数据。这些数组可以在任何范围内调用,这使得外部数据的访问更方便。在PHP 4.3.8中,register_globals被默认关闭以鼓励使用这些数组以避免无经验的开发者编写出不安全的PHP代码。作出这样的变化是出于安全性的考虑的。链接:http://www.php.net/downloads.php
 
  二、 安全使用PHP

  1、安装安全模块

  PHP 的安全模式是为了试图解决共享服务器(shared-server)安全问题而设立的。在结构上,试图在 PHP 层上解决这个问题是不合理的,但修改 WEB 服务器层和操作系统层显得非常不现实。因此许多人,特别是 ISP,目前使用安全模式。

表-1.安全模式配置指令

名称 默认值 类型
safe_mode "0" 布尔型
safe_mode_gid "0" 布尔型
safe_mode_include_dir NULL 字符串
safe_mode_exec_dir "" 字符串
safe_mode_allowed_env_vars PHP_ 字符串
safe_mode_protected_env_vars LD_LIBRARY_PATH 字符串
disable_functions "" 字符串
disable_classes "" 字符串
open_basedir NULL 字符串


以下是该配置选项的简要解释。

(1)safe_mode boolean

是否启用 PHP 的安全模式。

(2)safe_mode_gid

默认情况下,安全模式在打开文件时会做 UID 比较检查。如果你想将其放宽到 GID 比较,则打开 safe_mode_gid。是否在文件访问时使用 UID(FALSE)或者 GID(TRUE)来做检查。

(3)safe_mode_include_dir

当从此目录及其子目录(目录必须在 include_path 中或者用完整路径来包含)包含文件时越过 UID/GID 检查。

从 PHP 4.2.0 开始,本指令可以接受和 include_path 指令类似的风格用分号隔开的路径,而不只是一个目录。

(4)safe_mode_exec_dir

如果 PHP 使用了安全模式,system() 和其它执行系统程序的函数将拒绝启动不在此目录中的程序。

(5)safe_mode_allowed_env_vars

设置某些环境变量可能是潜在的安全缺口。本指令包含有一个逗号分隔的前缀列表。在安全模式下,用户只能改变那些名字具有在这里提供的前缀的环境变量。默认情况下,用户只能设置以 PHP_ 开头的环境变量(例如 PHP_FOO = BAR)。

(6)safe_mode_protected_env_vars

本指令包含有一个逗号分隔的环境变量的列表,最终用户不能用 putenv() 来改变这些环境变量。甚至在 safe_mode_allowed_env_vars 中设置了允许修改时也不能改变这些变量。

(7)disable_functions

本指令允许你基于安全原因禁止某些函数。接受逗号分隔的函数名列表作为参数。 disable_functions 不受安全模式的影响。 本指令只能设置在 php.ini 中。例如你不能将其设置在 httpd.conf。

(8)disable_classes

本指令可以使你出于安全的理由禁用某些类。用逗号分隔类名。disable_classes 不受安全模式的影响。 本指令只能设置在 php.ini 中。例如你不能将其设置在 httpd.conf。该指令自 PHP 4.3.2 起可用。

(9)open_basedir

将 PHP 所能打开的文件限制在指定的目录树,包括文件本身。本指令不受安全模式打开或者关闭的影响。

  2、以安全模式运行PHP

  以安全模式运行PHP是使PHP脚本安全使用的好方法,特别是在允许用户使用自己开发的PHP脚本时。使用安全模式会使PHP在运行函数时检查是否存在安全问题。include、readfile、fopen、file、unlink、rmdir等等:被包含的文件或者该文件所在目录的所有者必须是正在运行的脚本的所有者; Exec、System、Passthm等:要执行的程序必须位于特定的目录(默认为/usr/local/php/bin)。编译PHP时可以用- -with-exe-dir选项设定这个值。

  Mysql_Connect:这个函数用可选的用户名连接MySQL数据库。在安全模式下,用户名必须是当前被执行的脚本的所有者,或运行httpd的用户名(通常是nobody)。

  HTTP Authentication:包含HTTP验证代码脚本所有者的用户ID(数字型)会自动加到验证域。这样可以防止有人通过抓取密码的程序来欺骗同一个服务器上的HTTP验证脚本。
 
  3、使用用户识别和验证

  有时需要唯一地确认一个用户。用户通常由请求和响应系统确认。用户名/口令组合就是这种系统的一个很好的例子,比如系统要求给出A1i的口令,响应的是Ali的口令。这样验证是因为只有Ali才知道这个口令。

  (1)服务器端用户验征

  这是用于服务端上对PHP程序要求最小的验证方法。只要让Apache来管理对用户的验证就行了。

<ccid_code>AuthName  "Secret page"  AuthType     Basic# The password file has been placed outside the web treeAuthUserFile/home/car2002/website.pw<LIMIT GET POST>requirevalid-user</LIMIT></ccid_code>
ログイン後にコピー

  你需要把上述文件(文件名为.htaccess)放在需要保护的地方。用Apache的htpasswd程序,可以建立包含用户名和口令组合的文件。把这个文件放在Web目录树之外,只让该文件的拥有者查看和修改这个文件。当然,Web服务器必须能够读取这个文件。

  如果想读取被保护的目录,Web服务器要求浏览器提供用户名和密码。浏览器弹出对话框,用户可以输入他们的用户名和密码。如果用户名和密码与口令文件中相符合,就允许用户读取被保护的页面;反之,将得到错误页面,告诉用户没有通过验证。被保护的域会显示出来以便用户知道输入那个用户名和密码。

  (2)在PHP中进行用户识别和验证

  和在Apache服务器端进行用户识别和验证相比,在PHP进行用户识别和验证有以下优点:

A、 可注销。用户可以注销身份验证,这在Apache无法实现。

B、 可失效。你可以在一定设计后让登陆失效。如用户登录后60分钟没有浏览你的网站,你可强制他们重新通过验证。

C、 可定制。例如可以用小的JavaApplet加密要传送的口令,而在服务器上用mcryet库解密,这个工作可以在任何支持Java的浏览器上进行。

D、 可基于数据库。你可以用保存在各种各样的数据库里的数据来验证用户,并且记录访问者访问网站的详细日志。

E、 可用于每个页面。你可在每个页面上决定是否需要验证,当然在Apache服务器通过改变域也可以做到这一点。

F、 你也可以使浏览器弹出对话框。下面的例子显示了怎样从,MySQL数据库中检索用名和口令:让用户填人用户名和口令。

<ccid_code><?if(!isset($PHP_AUTH_USER)){Header("WWW-authenticate: basic realm=\"restricted area\"");Header( "HTTP/1.0 401 Unauthorized");echo "You failed to provide the correct password...\n";exit;}else{mysql_select_db("users") ;$user_id = strtolower($PHP_AUTH_USER);$result = mysql_query("SELECT passwordFROM users " ."WHERE username = '$username'") ;$row = mysql_fetch_array($result) ;if ($PHP_AUTH_PW != $row["password"]){Header( "WWW-authenticate:basic realm=\"restricted area\"Header("HTTP/1.0 401 Unauthorized");echo "You failed to provide the correct password...\n" ;exit;} }?>Only users with a working username/password combination can see this</ccid_code>
ログイン後にコピー

例子:用 PHP 进行 HTTP 认证

PHP 的 HTTP 认证机制仅在 PHP 以 Apache 模块方式运行时才有效,因此该功能不适用于 CGI 版本。在 Apache 模块的 PHP 脚本中,可以用 header() 函数来向客户端浏览器发送"Authentication Required"信息,使其弹出一个用户名/密码输入窗口。

当用户输入用户名和密码后,包含有 URL 的 PHP 脚本将会再次和预定义变量 PHP_AUTH_USER、PHP_AUTH_PW 和 AUTH_TYPE 一起被调用,这三个变量分别被设定为用户名,密码和认证类型。预定义变量保存在 $_SERVER 或者 $HTTP_SERVER_VARS 数组中。系统仅支持"基本的"认证。以下是在页面上强迫客户端认证的脚本范例:

<ccid_code><?phpif (!isset($_SERVER['PHP_AUTH_USER'])){ header('WWW-Authenticate: Basic realm="My Realm"');header('HTTP/1.0 401 Unauthorized');echo 'Text to send if user hits Cancel button';exit;}else{ echo "<p>Hello {$_SERVER['PHP_AUTH_USER']}.</p>";echo "<p>You entered {$_SERVER['PHP_AUTH_PW']} as your password.</p>";}?></ccid_code>
ログイン後にコピー


(3) 检测IP地址

一般人们普遍认为一个IP地址唯一地确定一个访问者。但实际上并不是这样的。代理服务器可用相同的IP地址发送不同用户的请求。另外IP地址的盗用也普遍存在。检测 IP地址有它们的用处,但相当有限。例如你是一个论坛版主,你发现某个用户粘贴一些不健康的、违法的内容。你可以找到他的IP地址,把从这个IP连进来的用户逐出论坛。使用下面一行命令将会得到某个特定请求的源IP地址:

<ccid_code># ip = $REMOTE_ADDR</ccid_code>
ログイン後にコピー


4、使用PHP加密技术

在PHP中,加密技术主要用来加密信息、产生校验和和摘要。使用加密技术可大大地增强安全性能。 这里只讲述使用加密技术的一些概念。如果你想进一步了解,应参考一些好的加密技术资料。加密技术的标准是Bmce Schneier的应用加密技术,非常值得一读。他的网站(www.counterpane.com/labs.html )是在互联网上查找加密技术资料的好起点。数据加密是一个非常复杂的话题,这里只简单介绍一下。

现在关于加密php程序的,除了zend公司的产品产品,其他的都不尽人意。这里我给大家介绍一个开源的产品,一个很多好的php加密软件--php_screw. 他的好处是用了php的zend引擎,而且是对代码加密,和系统平台没有任何关系,解决了产品放在其他地方的保密问题。

(1)安装php_screw

<ccid_code>#wget http://belnet.dl.sourceforge.net/sourceforge/php-screw/php_screw-1.3.tgz#tar zxvfphp_screw.1.3.tar.gz # cd php_screw.1.3# /opt/php/bin/phpize # ./configure --with-php-config=/opt/php/bin/php-config # vi my_screw.h#这个是密码文件,用户可以自己设置加密的密码 # make# cp ./modules/php_screw.so/usr/local/php/lib/php #cd tools # make #make生成screw 这个可执行文件,它用来加密php文件,生成加密后的.php文件。</ccid_code>
ログイン後にコピー


(2)加密文件:

加密文件,就是用上一步的make命令生成的screw文件来生成新的加密文件。

举例:加密/opt/php/htdocs/index.htm文件

<ccid_code># ./screw /opt/php/htdocs/index.htm</ccid_code>
ログイン後にコピー


加密程序会生成加密后的文件叫index.php,而原来加密前的文件自动备份成index.php.screw。 加密产品所要加密的文件后,可以删除备份文件。备份php_screw.so和screw文件,以后还可以继续使用他们来加密和解释。最后删除php_screw的目录。
 
5、使用具有SSL技术

SSL是英文Server Side Includes的缩写。使用具有SSL(安全套接字协议层)功能的web服务器,可以不用改变一行代码而提高网站的安全性能。SSL使用加密方法来保护web服务器和浏览器之间的信息流。SSL不仅用于加密在互联网上传递的数据流,而且还提供双方身份验证。

这样,你就可以安全地在线购物而不必担心别人矢随你的信用卡的信息。这种特性使得SSL适用于那些交换重要信息的地方,像电子商务和基于Web的邮件。

SSL使用公共密钥加密技术,服务器在连接结束时给客户端发送公用密钥用来加密信息,而加密的信息只有服务器用它自己持有的专用密钥才能解开。客户端用公用密钥加密数据,并且发送给服务端自己的密钥,以唯一确定自己,防止在系统两端之间有人冒充服务端或客户端进行欺骗。

加密的HTTP连接用443端口号代替80端口号,以区别于普通的不加密的HTTP。客户端使用加密HTTP连接时会自动使用443端口而不是80端口。这使得服务端更容易作出相应的响应。

在Apache服务器下,可以通过直接编辑服务器配置文件或者在需要使用SSI的目录中创建.htaccess文件来启动SSL。登录到服务器,找到配置文件的存放目录,使用文字编辑器打开文件srm.conf,找到以下几行:

<ccid_code># If you want to use server side includes, or CGI outside#ScriptAliased directories,uncomment the following lines.#AddType text/x-server-parsed-html .shtml#AddType application/x-httpd-CGI.CGI</ccid_code>
ログイン後にコピー


将以AddType开头的两行并且去掉每一行最前面的"#"符号即可。保存所做的修改,然后再打开文件access.conf。

<ccid_code><Directory /usr/local/etc/httpd/htdocs> # This may also be "None", "All", or any combination of "Indexes",# "Includes", or "FollowSymLinks"Options Indexes FollowSymLinks</Directory></ccid_code>
ログイン後にコピー


  将其中的Options Indexes FollowSymLinks改为:Options Indexes FollowSymLinks Includes 即可。

  例子:如何建立一个仅接受强加密请求的SSL服务器,而又允许对外浏览器使用更强的加密?

  这个功能被称为以服务器为网关的加密(Server Gated Cryptography [SGC]), 在README.GlobalID文档中有详细说明。简单地说就是:服务器拥有一个由来自Verisign的一个特殊的CA证书签发的服务器身份证, 从而在对外浏览器上实现强加密。

  其过程如下:

  浏览器使用对外密码进行连接,服务器返回其全局ID身份证,浏览器校验后在后继HTTP通讯产生之前提升其密码组。

  现在的问题是:如何允许这样的提升,而又强制性地使用强加密。换句话说就是:浏览器必须在开始连接时就使用强加密,或者提升倒强加密,但是维持对外密码是不允许的。以下巧妙地解决了这个问题:

<ccid_code>httpd.conf:# 允许在初始握手阶段使用所有的密码,# 以允许对外服务器通过SGC功能提升密码组SSLCipherSuite ALL:!ADH:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP:+eNULL<Directory /usr/local/apache2/htdocs>#但是最终会拒绝所有没有提升密码组的浏览器SSLRequire %{SSL_CIPHER_USEKEYSIZE}>= 128</Directory></ccid_code>
ログイン後にコピー

  6、创建安全的PHP脚本

  有很多编程技巧使PHP脚本更安全地运行。其中最重要的一条是使用一些安全常识。运行PHP比运行CGI脚本更安全,但它仍然有许多出现错误的地方。转换到安全运行模式能够限制出错所产生的结果。如果你的PHP脚本中有错误,可能会被人找到并且利用它来破坏站点甚至数据库。所以经常备份也是必要的。

  (1)安全设置软件

  基于Web的应用程序,如在线目录,通常都在无人密切监视的情况下运行。如果发生错误时,你不可能立即采取行动。通常访问者最先注意到所发生的问题,你应该使他们很容易地报告所发生的问题。更进一步,可以由构成这个网站的脚本来跟踪这些问题。例如,你的访问者可能做一些你想不到的事情。也可能你对于重要函数所返回值没有检查,脚本可能会以不可预料的方式运行。

  写出更加安全的程序,就可以避免这些问题。例如你应该检查数据库函数的返回值,如果数据库崩溃,显示给用户的应该是出错的信息页面而不是满屏幕的错误。你甚至可以让脚本在发生严重问题,如数据库崩溃、硬盘空间已满的时候自动通知你。你也应该检查从用户传来的所有数据。显然后者更重要。 如果你的程序能够应付各种错误,那么你的程序不仅更加可靠,而且可以花更少的时间来维护。这些时间可大大弥补你开发程序时所花的额外时间。

  (2)合理存储和交换敏感信息

  显然,你应尽量避免在互联网上以GET、POST、cookie或URL编码的形式传递敏感信息,这样使信息很容易被窃取。使用支持SSL的web服务器能够做到这一点,因为它加密站点和访问者浏览器之间所有的信息流。

  如果你没有支持SSL的Web服务器,那么你需要其他的办法。比如没有必要总是发送数据到浏览器;把数据保存在数据库中,只向浏览器发送关键字,这样也很容易查找到所需要的数据;并以加密的形式发送所有的数据等等。实现这种功能的最简单的办法是使用Session。PHP4支持本地化的Session功能,PHP3则要使用PHPMB库。

  HTTP 协议是一种无状态协议,它不负责为好连接的状态信息,因此无法跟踪客户端的各种信息,Session的出现改变这一状况。当用户浏览一个支持Session功能的CGI脚本时,在他离开这个网页前可以将用户信息保存在同意Session ID之下,也就是可以在不同的网页之间偕同存取用户信息。

  如果不使用PHP的安全模式或在suEXEC下以CGI方式运行PHP,那么监视你的文件的内容就不可能实现。此时唯一防止别人读取数据的方法是尽快把数据保存到数据库中。

  (3)检查用户输入

  Per1语言有个特性叫污点检测(taint checking)。当污点检测生效时,即使没有发生重大错误,你也不能运行含有可疑变量的函数。一个变量,当它的值是用户提供数据的一部分或全部时就变成可疑的了,因为这些数据被认为是不安全的。这样可提高系统安性。

  PHP没有这个特性,但PHP有escapeshellcmd函数,可以达到同样的效果。另一个不让用户滥用脚本的方法是只允许使用经过严格检查的输入。例如如果需要输入IP地址时,应当检查这个IP地址十分有效。使用正则表达式可以做到这一点。下面这个函数例子将验证一个字符串这是否包含有效的IP地址。

<ccid_code>function validate_ip($ip) {if (is_string($ip) && ereg(,^([0-9]{1,3})\.( [0-9]{l,3})\. ''([0-9]{1,3})\.([0-9]{1,3})$',$ip, $part)) {if ($part[l] <= 255 && $part[2]<= 255 &&$part[3] <= 255&& $part[4] <= 255)return TRUE;# Valid IP  }return FALSE;# Invalid IP}</CCID_CODE>
ログイン後にコピー

  许多PHP程序的安全缺陷不是程序语言本身,而是没有在编码中考虑到用户提交数据的安全。所以对于用户提交数据,应当小心检查代码以确保任何由web浏览器提交的变量经过了相应的检查。下面是一个危险的变量使用:

<CCID_CODE><?php//从某个用户目录下删除文件... 可能是其他用户的文件?unlink ($evil_var);// 记下访问日志... 也许没有必要?fputs ($fp, $evil_var);?></ccid_code>
ログイン後にコピー

3. オペレーティング システム自体のパッチ

既知の脆弱性に対してシステムにパッチを適用することは、システム管理者の最も基本的な責任でもあります。最後の防衛線。上記の設定後は、難攻不落とは言えませんが、PHP スクリプト プログラムに重大な脆弱性があったとしても、攻撃者がテストすることはある程度困難になります。実際の損害を引き起こします。

IV. 概要

上記では、PHP のセキュリティ戦略、暗号化と SSL アプリケーション、および PHP を使用した認証と識別について紹介します。完全に安全なシステムは理論的に不可能であるため、セキュリティとは単にコストと可用性のバランスを指します。ユーザーが送信したすべての変数が生物学的検証 (指紋識別など) を必要とする場合、非常に高いレベルの信頼性が達成されます。

ただし、ユーザーがフォームに記入するのにも数十分かかります。このとき、ユーザーはセキュリティ検証を回避する方法を取ることになります。システムの信頼性は、チェーン全体の最も弱いリンクによってのみ決定できます。どのようなセキュリティ システムにおいても、人は最も脆弱な接続であり、テクノロジーだけではシステムを安全にすることはできません。

最良のセキュリティ戦略は、多くの場合、ユーザーの仕事の完了を妨げたり、複雑さでコード作成者に過剰な負担をかけたりすることなく、あまり目立たない方法で環境のニーズに適応します。

オープンソース ソフトウェアとして、PHP のオープン モデルは諸刃の剣です。仕組み的に言えば、世界中の開発者がソースコードを入手して欠陥を見つけることができれば、セキュリティは向上するはずですが、同時にネットワーク管理者がバージョンを更新できなければ、セキュリティ上のリスクも残ります。

さらに、安全性に影響を与える要因は数多くあります。プログラミング レベルからユーザーの使用レベルなどに至るまで、それらはすべてシステムのセキュリティに影響します。セキュリティ問題は、ソースコードを開いたり閉じたりするだけでは根本的に解決できません。 PHP プログラマーの場合は、多くの場合、対応する Web サイトにアクセスして、パッチがあるかどうか、バグ修正があるかどうか、アップグレードする必要があるかどうかを確認する必要があります。危険を冒さないでください。そうしないと、シェル スクリプトによって Web サイトがダウンする可能性があります。有名な格言を言い換えると、次の日にはサーバーがハッカーに乗っ取られる可能性があります。

PHP サーバー上で実行されるソフトウェアには、主に Samba、Ftp、Telnet、Ssh、Mysql、Apache、Mozilla などが含まれます。これらのソフトウェアのほとんどはオープン ソース ソフトウェアであり、安定したバージョンで常にアップグレードされます。とベータ版が交互に表示されます。 www.samba.org と www.apache.org の最新の ChangeLog には、バグ修正、セキュリティ バグ修正と記載されています。したがって、PHP ネットワーク管理者は、関連する Web サイトのバグ修正とアップグレードに常に注意を払い、適時にアップグレードまたはパッチを追加する必要があります。この記事は、PHP が本当に必要な自由とセキュリティの組み合わせを見つけるのに役立つことを願っています。



関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のおすすめ
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート