fujimoto Sat Feb 16 08:20:11 2002 EDT
Removed files:
/phpdoc/ja/chapters install.xml
Modified files:
/phpdoc/ja/chapters install.apache.xml install.windows.xml
security.xml
/phpdoc/ja/faq build.xml using.xml
/phpdoc/ja/functions mbstring.xml pcntl.xml
Log:
tranlation updated.
Index: phpdoc/ja/chapters/install.apache.xml
diff -u phpdoc/ja/chapters/install.apache.xml:1.5
phpdoc/ja/chapters/install.apache.xml:1.6
--- phpdoc/ja/chapters/install.apache.xml:1.5 Sun Feb 10 23:14:31 2002
+++ phpdoc/ja/chapters/install.apache.xml Sat Feb 16 08:20:08 2002
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
-<!-- $Revision: 1.5 $ -->
+<!-- $Revision: 1.6 $ -->
<sect1 id="install.apache">
<title>Apacheサーバ</title>
<para>
@@ -20,7 +20,7 @@
<example id="install.apache.unix.longer">
<title>
- PHP 4インストール手順 (Apache モジュール版)
+ PHP 4インストール手順 (Apache共有モジュール版)
</title>
<screen>
<![CDATA[
@@ -29,33 +29,42 @@
3. gunzip php-xxx.tar.gz
4. tar xvf php-xxx.tar
5. cd apache_xxx
-6. ./configure --prefix=/www
-7. cd ../php-xxx
-8. ./configure --with-mysql --with-apxs=/www/bin/apxs
-9. make
-10. make install
-
-
この手順の代わりに、単に既存バイナリにhttpdバイナリを上書きコピーす
-
ることも可能です。この場合には、必ずWebサーバをまずシャットダウンさ
- せておいて下さい。
+6. ./configure --prefix=/www --enable-module=so
+7. make
+8. make install
+9. cd ../php-xxx
+10. ./configure --with-mysql --with-apxs=/www/bin/apxs
+11. make
+12. make install
+
+ インストール後にconfigureオプションを変更したくなった場合は
+
+最後の3つの手順を繰り返してください。新しいモジュールを有効
+ にするにはapacheを再起動するだけです。apacheの最コンパイルは
+ 必要ありません。
-11. cp php.ini-dist /usr/local/lib/php.ini
+12. cp php.ini-dist /usr/local/lib/php.ini
PHPオプションを設定するために.iniファイルを編集して下さい。このファ
イルを他の場所に置きたい場合は、手順8でオプション
--with-config-file-path=/path を使用して下さい。
-12. httpd.conf または srm.conf ファイルで以下の行がコメントアウト
+13. httpd.conf または srm.conf ファイルで以下の行がコメントアウト
されていないかどうか(つまり有効になっているかどうか)確認して
ください。
AddType application/x-httpd-php .php
+
+ LoadModule php4_module libexec/libphp4.so
ここで好きな拡張子を選択できます。.php
は単に推奨されるだけです。
.htmlを選択することも可能でし、旧バージョンとの互換のために.php3
を使用することも出来ます。
-13. 通常の手順により Apache
サーバを起動して下さい。(HUPまたはUSR1シグ
+
+LoadModule文に記述されているパスはあなたのシステムにインストール
+
+されているPHPモジュールを指している必要があります。上記の例はこの
+ 手順に沿ってインストールを行った場合のパスです。
+
+14. 通常の手順により Apache
+サーバを起動して下さい。(HUPまたはUSR1シグ
ナルを使用してリロードするのではなく)サーバを停止してから再起動す
る必要があります。
]]>
Index: phpdoc/ja/chapters/install.windows.xml
diff -u phpdoc/ja/chapters/install.windows.xml:1.3
phpdoc/ja/chapters/install.windows.xml:1.4
--- phpdoc/ja/chapters/install.windows.xml:1.3 Tue Jan 22 09:00:24 2002
+++ phpdoc/ja/chapters/install.windows.xml Sat Feb 16 08:20:08 2002
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
-<!-- $Revision: 1.3 $ -->
+<!-- $Revision: 1.4 $ -->
<sect1 id="install.windows">
<title>Windowsシステムへのインストール</title>
<para>
@@ -282,6 +282,28 @@
(<filename>DRIVE</filename>はPHPをインストールしたドライブです。)
に移動して下さい。
</simpara>
+ </listitem>
+ <listitem>
+ <para>
+ PWSを使用する場合はwebrootに実行権限を与えてください:
+ <itemizedlist>
+ <listitem>
+ <simpara>
+ PWSウェブマネージャを起動します
+ </simpara>
+ </listitem>
+ <listitem>
+ <simpara>
+ "Home"ディレクトリのプロパティを編集します
+ </simpara>
+ </listitem>
+ <listitem>
+ <simpara>
+ "実行"チェックボックスをチェックします
+ </simpara>
+ </listitem>
+ </itemizedlist>
+ </para>
</listitem>
</itemizedlist>
</para>
Index: phpdoc/ja/chapters/security.xml
diff -u phpdoc/ja/chapters/security.xml:1.18 phpdoc/ja/chapters/security.xml:1.19
--- phpdoc/ja/chapters/security.xml:1.18 Sat Dec 22 11:15:43 2001
+++ phpdoc/ja/chapters/security.xml Sat Feb 16 08:20:09 2002
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
-<!-- $Revision: 1.18 $ -->
+<!-- $Revision: 1.19 $ -->
<chapter id="security">
<title>セキュリティ</title>
@@ -145,7 +145,7 @@
PHP
では、サーバードキュメントツリーにアクセス制限付きのディレ
クトリがある場合、コンパイル時の設定オプション <link
linkend="install.configure.enable-force-cgi-redirect">
- --enable-force-cgi-redirect</link> および実行時の設定命令
+ --enable-force-cgi-redirect</link> および実行時の設定命令
<link linkend="ini.doc-root">doc_root</link> と
<link linkend="ini.user-dir">user_dir</link> をこの攻撃を防止す
るために使用することができます。
これらを組み合わせたいくつか
@@ -178,7 +178,7 @@
Action
で設定することができます。(以下を参照してください。)
</simpara>
</sect2>
-
+
<sect2 id="security.cgi-bin.force-redirect">
<title>ケース 2: --enable-force-cgi-redirect を使用</title>
<simpara>
@@ -208,7 +208,7 @@
の内の一つを使用する必要があります。
</simpara>
</sect2>
-
+
<sect2 id="security.cgi-bin.doc-root">
<title>ケース 3: doc_root または user_dir を設定</title>
<simpara>
@@ -303,7 +303,6 @@
--enable-discard-path</link>
を付けてコンパイルする必要があります。
</para>
</sect2>
-
</sect1>
<sect1 id="security.apache">
@@ -482,6 +481,419 @@
域 (/home/、 My
Documents)等が含まれます。このため、明示的に許可す
るもの以外の全てを禁止する方針とする方が通常はより簡単です。
</para>
+ </sect1>
+
+ <sect1 id="security.database">
+ <title>データベースのセキュリティ</title>
+
+ <simpara>
+
+今日、ダイナミックなコンテンツを提供するウェブアプリケーションに
+
+おいてはデータベースは欠く事のできなコンポーネントとなっています。
+
+そういったデータベースには重要な、そして秘密にすべき情報が格納
+
+されることになるので、それらをいかにして保護するかについて十分に
+ 考慮する必要があります。
+ </simpara>
+ <simpara>
+
+情報を取り出したり格納するためにはデータベースに接続する必要があります。
+
+そして適切なクエリを送信し、結果を受け取り、切断します。クエリに
+ 使用される言語はStructured Query Language
+(SQL)が一般的です。アタッカー
+ がどのように<link linkend="security.database.sql-injection">SQLに
+ 干渉する</link>かについて参照してください。
+ </simpara>
+ <simpara>
+
+皆さんがお気づきの様に、PHPそれ自体は貴方のデータベースを保護することは
+
+ありません。以下のセクションはPHPスクリプトからどのようにデータベースに
+
+アクセスし操作すればいいのか、とういことに関する非常に基本的な導入です。
+ </simpara>
+ <simpara>
+
+このシンプルなルールを覚えて置いてください:それは「多重防衛」です。
+
+より多くの箇所で、より多くの保護を行うことにより、アタッカーが攻撃に
+
+成功して機密情報が漏洩する可能性は減っていきます。データベースと
+
+アプリケーションを正しくデザインすることで貴方の心配を取り除くことが
+ できます。
+ </simpara>
+
+ <sect2 id="security.database.design">
+ <title>データベースのデザイン</title>
+ <simpara>
+
+他人が用意した既存のものを使用するのでない限り、最初に行うのはデータベースの作成です。
+
+データベースが作成されると、そのデータベースのオーナーは作成コマンドを
+
+実行したユーザになります。通常、オーナー(とスーパーユーザー)のみが
+
+そのデータベースに対して操作を行うことが出来ます。他のユーザがデータベースを
+
+使用するには適切な権利が与えられている必要があります。
+ </simpara>
+ <simpara>
+
+アプリケーションはデータベースにオーナー、もしくはスーパーユーザーとして
+ 接続しては絶対にいけません。なぜならこれらのユーザは
+
+例えばスキーマの変更(テーブルの削除等)や全コンテンツの削除、といった
+ あらゆるクエリーを実行することが出来るからです。
+ </simpara>
+ <simpara>
+ You may create different database users for every aspect of your
+ application with very limited rights to database objects. The most
+ required privileges should be granted only, and avoid that the same user
+ can interact with the database in different use cases. This means that if
+ intruders gain access to your database using one of these credentials,
+ they can only effect as many changes as your application can.
+ </simpara>
+ <simpara>
+ You are encouraged not to implement all the business logic in the web
+ application (i.e. your script), instead to do it in the database schema
+ using views, triggers or rules. If the system evolves, new ports will be
+ intended to open to the database, and you have to reimplement the logic
+ in each separate database client. Over and above, triggers can be used
+ to transparently and automatically handle fields, which often provides
+ insight when debugging problems with your application or tracing back
+ transactions.
+ </simpara>
+ </sect2>
+
+ <sect2 id="security.database.connection">
+ <title>Connecting to Database</title>
+ <simpara>
+ You may want to estabilish the connections over SSL to encrypt
+ client/server communications for increased security, or you can use ssh
+ to encrypt the network connection between clients and the database server.
+ If either of them is done, then monitoring your traffic and gaining
+ informations in this way will be a hard work.
+ </simpara>
+ <!--simpara>
+ If your database server native SSL support, consider to use <link
+ linkend="ref.openssl">OpenSSL functions</link> in communication between
+ PHP and database via SSL.
+ </simpara-->
+ </sect2>
+
+ <sect2 id="security.database.storage">
+ <title>Encrypted Storage Model</title>
+ <simpara>
+ SSL/SSH protects data travelling from the client to the server, SSL/SSH
+ does not protect the persistent data stored in a database. SSL is an
+ on-the-wire protocol.
+ </simpara>
+ <simpara>
+ Once an attacker gains access to your database directly (bypassing the
+ webserver), the stored sensitive data may be exposed or misused, unless
+ the information is protected by the database itself. Encrypting the data
+ is a good way to mitigate this threat, but very few databases offer this
+ type of data encryption.
+ </simpara>
+ <simpara>
+ The easiest way to work around this problem is to first create your own
+ encryption package, and then use it from within your PHP scripts. PHP
+ can assist you in this case with its several extensions, such as <link
+ linkend="ref.mcrypt">Mcrypt</link> and <link
+ linkend="ref.mhash">Mhash</link>, covering a wide variety of encryption
+ algorithms. The script encrypts the data be stored first, and decrypts
+ it when retrieving. See the references for further examples how
+ encryption works.
+ </simpara>
+ <simpara>
+ In case of truly hidden data, if its raw representation is not needed
+ (i.e. not be displayed), hashing may be also taken into consideration.
+ The well-known example for the hashing is storing the MD5 hash of a
+ password in a database, instead of the password itself. See also
+ <function>crypt</function> and <function>md5</function>.
+ </simpara>
+ <example>
+ <title>Using hashed password field</title>
+ <programlisting role="php">
+<![CDATA[
+// storing password hash
+$query = sprintf("INSERT INTO users(name,pwd) VALUES('%s','%s');",
+ addslashes($username), md5($password));
+$result = pg_exec($connection, $query);
+
+// querying if user submitted the right password
+$query = sprintf("SELECT 1 FROM users WHERE name='%s' AND pwd='%s';",
+ addslashes($username), md5($password));
+$result = pg_exec($connection, $query);
+
+if (pg_numrows($result) > 0) {
+ echo "Welcome, $username!";
+}
+else {
+ echo "Authentication failed for $username.";
+}
+]]>
+ </programlisting>
+ </example>
+ </sect2>
+
+ <sect2 id="security.database.sql-injection">
+ <title>SQL Injection</title>
+ <simpara>
+ Many web developers are unaware of how SQL queries can be tampered with,
+ and assume that an SQL query is a trusted command. It means that SQL
+ queries are able to circumvent access controls, thereby bypassing standard
+ authentication and authorization checks, and sometimes SQL queries even
+ may allow access to host operating system level commands.
+ </simpara>
+ <simpara>
+ Direct SQL Command Injection is a technique where an attacker creates or
+ alters existing SQL commands to expose hidden data, or to override valuable
+ ones, or even to execute dangerous system level commands on the database
+ host. This is accomplished by the application taking user input and
+ combining it with static parameters to build a SQL query. The following
+ examples are based on true stories, unfortunately.
+ </simpara>
+ <para>
+ Owing to the lack of input validation and connecting to the database on
+ behalf of a superuser or the one who can create users, the attacker
+ may create a superuser in your database.
+ <example>
+ <title>
+ Splitting the result set into pages ... and making superusers
+ (PostgreSQL and MySQL)
+ </title>
+ <programlisting role="php">
+<![CDATA[
+$offset = argv[0]; // beware, no input validation!
+$query = "SELECT id, name FROM products ORDER BY name LIMIT 20 OFFSET $offset;";
+// with PostgreSQL
+$result = pg_exec($conn, $query);
+// with MySQL
+$result = mysql_query($query);
+]]>
+ </programlisting>
+ </example>
+ Normal users click on the 'next', 'prev' links where the
+<varname>$offset</varname>
+ is encoded into the URL. The script expects that the incoming
+ <varname>$offset</varname> is decimal number. However, someone tries to
+ break in with appending <function>urlencode</function>'d form of the
+ following to the URL
+ <informalexample>
+ <programlisting>
+<![CDATA[
+// in case of PostgreSQL
+0;
+insert into pg_shadow(usename,usesysid,usesuper,usecatupd,passwd)
+ select 'crack', usesysid, 't','t','crack'
+ from pg_shadow where usename='postgres';
+--
+
+// in case of MySQL
+0;
+UPDATE user SET Password=PASSWORD('crack') WHERE user='root';
+FLUSH PRIVILEGES;
+]]>
+ </programlisting>
+ </informalexample>
+ If it happened, then the script would present a superuser access to him.
+ Note that <literal>0;</literal> is to supply a valid offset to the
+ original query and to terminate it.
+ </para>
+ <note>
+ <para>
+ It is common technique to force the SQL parser to ignore the rest of the
+ query written by the developer with <literal>--</literal> which is the
+ comment sign in SQL.
+ </para>
+ </note>
+ <para>
+ A feasible way to gain passwords is to circumvent your search result pages.
+ What the attacker needs only is to try if there is any submitted variable
+ used in SQL statement which is not handled properly. These filters can be set
+ commonly in a preceding form to customize <literal>WHERE, ORDER BY,
+ LIMIT</literal> and <literal>OFFSET</literal> clauses in
+<literal>SELECT</literal>
+ statements. If your database supports the <literal>UNION</literal> construct,
+ the attacker may try to append an entire query to the original one to list
+ passwords from an arbitrary table. Using encrypted password fields is
+ strongly encouraged.
+ <example>
+ <title>
+ Listing out articles ... and some passwords (any database server)
+ </title>
+ <programlisting role="php">
+<![CDATA[
+$query = "SELECT id, name, inserted, size FROM products
+ WHERE size = '$size'
+ ORDER BY $order LIMIT $limit, $offset;";
+$result = odbc_exec($conn, $query);
+]]>
+ </programlisting>
+ </example>
+ The static part of the query can be combined with another
+ <literal>SELECT</literal> statement which reveals all passwords:
+ <informalexample>
+ <programlisting>
+<![CDATA[
+'
+union select '1', concat(uname||'-'||passwd) as name, '1971-01-01', '0' from
+usertable;
+--
+]]>
+ </programlisting>
+ </informalexample>
+ If this query (playing with the <literal>'</literal> and
+ <literal>--</literal>) were assigned to one of the variables used in
+ <varname>$query</varname>, the query beast awakened.
+ </para>
+ <para>
+ SQL UPDATEs are also subject to attacking your database. These queries are
+ also threatened by chopping and appending an entirely new query to it. But
+ the attacker might fiddle with the <literal>SET</literal> clause. In this
+ case some schema information must be possessed to manipulate the query
+ successfully. This can be acquired by examing the form variable names, or
+ just simply brute forcing. There are not so many naming convention for
+ fields storing passwords or usernames.
+ <example>
+ <title>
+ From resetting a password ... to gaining more privileges (any database server)
+ </title>
+ <programlisting role="php">
+<![CDATA[
+$query = "UPDATE usertable SET pwd='$pwd' WHERE uid='$uid';";
+]]>
+ </programlisting>
+ </example>
+ But a malicious user sumbits the value
+ <literal>' or uid like'%admin%'; --</literal> to <varname>$uid</varname> to
+ change the admin's password, or simply sets <varname>$pwd</varname> to
+ <literal>"hehehe', admin='yes', trusted=100 "</literal> (with a trailing
+ space) to gain more privileges. Then, the query will be twisted:
+ <informalexample>
+ <programlisting role="php">
+<![CDATA[
+// $uid == ' or uid like'%admin%'; --
+$query = "UPDATE usertable SET pwd='...' WHERE uid='' or uid like '%admin%'; --";
+
+// $pwd == "hehehe', admin='yes', trusted=100 "
+$query = "UPDATE usertable SET pwd='hehehe', admin='yes', trusted=100 WHERE ...;"
+]]>
+ </programlisting>
+ </informalexample>
+ </para>
+ <para>
+ A frightening example how operating system level commands can be accessed
+ on some database hosts.
+ <example>
+ <title>Attacking the database host's operating system (MSSQL Server)</title>
+ <programlisting role="php">
+<![CDATA[
+$query = "SELECT * FROM products WHERE id LIKE '%$prod%'";
+$result = mssql_query($query);
+]]>
+ </programlisting>
+ </example>
+ If attacker submits the value
+ <literal>a%' exec master..xp_cmdshell 'net user test testpass /ADD' --</literal>
+ to <varname>$prod</varname>, then the <varname>$query</varname> will be:
+ <informalexample>
+ <programlisting role="php">
+<![CDATA[
+$query = "SELECT * FROM products WHERE id LIKE '%a%' exec master..xp_cmdshell 'net
+user test testpass /ADD'--";
+$result = mssql_query($query);
+]]>
+ </programlisting>
+ </informalexample>
+ MSSQL Server executes the SQL statements in the batch including a command
+ to add a new user to the local accounts database. If this application
+ were running as <literal>sa</literal> and the MSSQLSERVER service is
+ running with sufficient privileges, the attacker would now have an
+ account with which to access this machine.
+ </para>
+ <note>
+ <para>
+ Some of the examples above is tied to a specific database server. This
+ does not mean that a similar attack is impossible against other products.
+ Your database server may be so vulnerable in other manner.
+ </para>
+ </note>
+
+ <sect3 id="security.database.avoiding">
+ <title>Avoiding techniques</title>
+ <simpara>
+ You may plead that the attacker must possess a piece of information
+ about the database schema in most examples. You are right, but you
+ never know when and how it can be taken out, and if it happens,
+ your database may be exposed. If you are using an open source, or
+ publicly available database handling package, which may belong to a
+ content management system or forum, the intruders easily produce
+ a copy of a piece of your code. It may be also a security risk if it
+ is a poorly designed one.
+ </simpara>
+ <simpara>
+ These attacks are mainly based on exploiting the code not being written
+ with security in mind. Never trust on any kind of input, especially
+ which comes from the client side, even though it comes from a select box,
+ a hidden input field or a cookie. The first example shows that such a
+ blameless query can cause disasters.
+ </simpara>
+
+ <itemizedlist>
+ <listitem>
+ <simpara>
+ Never connect to the database as a superuser or as the database owner.
+ Use always customized users with very limited privileges.
+ </simpara>
+ </listitem>
+ <listitem>
+ <simpara>
+ Check if the given input has the expected data type. PHP has
+ a wide range of input validating functions, from the simplest ones
+ found in <link linkend="ref.variables">Variable Functions</link> and
+ in <link linkend="ref.ctype">Character Type Functions</link>
+ (e.g. <function>is_numeric</function>, <function>ctype_digit</function>
+ respectively) onwards the
+ <link linkend="ref.pcre">Perl compatible Regular Expressions</link>
+ support.
+ </simpara>
+ </listitem>
+ <listitem>
+ <para>
+ If the application waits for numerical input, consider to verify data
+ with <function>is_numeric</function>, or silently change its type
+ using <function>settype</function>, or use its numeric representation
+ by <function>sprintf</function>.
+ <example>
+ <title>A more secure way to compose a query for paging</title>
+ <programlisting role="php">
+<![CDATA[
+settype($order, 'integer');
+$query = "SELECT id, name FROM products ORDER BY name LIMIT 20 OFFSET $offset;";
+
+// please note %d in the format string, using %s would be meaningless
+$query = sprintf("SELECT id, name FROM products ORDER BY name LIMIT 20 OFFSET %d;",
+$offset);
+]]>
+ </programlisting>
+ </example>
+ </para>
+ </listitem>
+ <listitem>
+ <simpara>
+ Quote each non numeric user input which is passed to the database with
+ <function>addslashes</function> or <function>addcslashes</function>.
+ See <link linkend="security.database.storage">the first example</link>.
+ As the examples shows, quotes burnt into the static part of the query
+ is not enough, and can be easily hacked.
+ </simpara>
+ </listitem>
+ <listitem>
+ <simpara>
+ Do not print out any database specific information, especially
+ about the schema, by fair means or foul. See also <link
+ linkend="security.errors">Error Reporting</link> and <link
+ linkend="ref.errorfunc">Error Handling and Logging Functions</link>.
+ </simpara>
+ </listitem>
+ <listitem>
+ <simpara>
+ You may use stored procedures and previously defined cursors to abstract
+ data access so that users do not directly access tables or views, but
+ this solution has another impacts.
+ </simpara>
+ </listitem>
+ </itemizedlist>
+
+ <simpara>
+ Besides these, you benefit from logging queries either within your script
+ or by the database itself, if it supports. Obviously, the logging is unable
+ to prevent any harmful attempt, but it can be helpful to trace back which
+ application has been circumvented. The log is not useful by itself, but
+ through the information it contains. The more detail is generally better.
+ </simpara>
+ </sect3>
+ </sect2>
</sect1>
<sect1 id="security.errors">
Index: phpdoc/ja/faq/build.xml
diff -u phpdoc/ja/faq/build.xml:1.6 phpdoc/ja/faq/build.xml:1.7
--- phpdoc/ja/faq/build.xml:1.6 Sun Feb 10 23:14:31 2002
+++ phpdoc/ja/faq/build.xml Sat Feb 16 08:20:09 2002
@@ -334,9 +334,8 @@
my $CFG_LD_SHLIB = 'gcc'; # substituted via Makefile.tmpl
my $CFG_LDFLAGS_SHLIB = q(-shared); # substituted via Makefile.tmpl
</programlisting>
-
可能性のある第2の問題は、RedHat-6.1/6.2(またはそれを元にしたディ
-
ストリビューション)でのみ存在する問題です。RedHatが出荷した
- apxs スクリプトは壊れています。以下の行を見て下さい。
+
+可能性のある第2の問題は、RedHat-6.1と6.2でのみ存在する問題です。
+ RedHatが出荷した apxs
+スクリプトは壊れています。以下の行を見て下さい。
<programlisting>
my $CFG_LIBEXECDIR = 'modules'; # substituted via APACI install
</programlisting>
Index: phpdoc/ja/faq/using.xml
diff -u phpdoc/ja/faq/using.xml:1.3 phpdoc/ja/faq/using.xml:1.4
--- phpdoc/ja/faq/using.xml:1.3 Wed Dec 12 15:52:32 2001
+++ phpdoc/ja/faq/using.xml Sat Feb 16 08:20:10 2002
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
-<!-- $Revision: 1.3 $ -->
+<!-- $Revision: 1.4 $ -->
<chapter id="faq.using">
<title>PHPを使う</title>
<titleabbrev>PHPを使う</titleabbrev>
@@ -113,6 +113,34 @@
出力しなければならない場合に、改行が解釈されてしまうとしたらどう
でしょう。ソースコードの1行もとても読めないくらい長いものになって
しまいます。
+ </para>
+ </answer>
+ </qandaentry>
+
+ <qandaentry id="faq.using.headers-sent">
+ <question>
+ <para>
+ 'Warning: Cannot send session cookie - headers already sent...'や
+ 'Cannot add header information - headers already set...'といった
+ メッセージが出力されるのですが。
+ sent...'.
+ </para>
+ </question>
+ <answer>
+ <para>
+ <function>header</function>, <function>set_cookie</function>や
+
+セッション関数は出力ストリームにヘッダを付加する関数で、ヘッダを
+
+送信できるのは本文の出力を開始する前のみです。これはApacheモジュール
+
+版のPHPを実行している場合は以下のようなコードで貴方が送信している
+ 全てのリクエストヘッダを表示することが出来ます。
+ <programlisting role="php">
+<![CDATA[
+$headers = getallheaders();
+foreach ($headers as $name => $content) {
+ echo "headers[$name] = $content<br>\n";
+}
+]]>
+ </programlisting>
</para>
</answer>
</qandaentry>
Index: phpdoc/ja/functions/mbstring.xml
diff -u phpdoc/ja/functions/mbstring.xml:1.15 phpdoc/ja/functions/mbstring.xml:1.16
--- phpdoc/ja/functions/mbstring.xml:1.15 Thu Feb 14 09:47:06 2002
+++ phpdoc/ja/functions/mbstring.xml Sat Feb 16 08:20:10 2002
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
-<!-- $Revision: 1.15 $ -->
+<!-- $Revision: 1.16 $ -->
<reference id="ref.mbstring">
<title>マルチバイト文字列関数(mbstring)</title>
<titleabbrev>
@@ -1856,14 +1856,10 @@
</refnamediv>
<refsect1>
<title>説明</title>
- <funcsynopsis>
- <funcprototype>
- <funcdef>string <function>mb_regex_encoding</function></funcdef>
- <paramdef>string
- <parameter><optional>encoding</optional></parameter>
- </paramdef>
- </funcprototype>
- </funcsynopsis>
+ <methodsynopsis>
+ <type>string</type><methodname>mb_regex_encoding</methodname>
+ <methodparam
+choice="opt"><type>string</type><parameter>encoding</parameter></methodparam>
+ </methodsynopsis>
&warn.experimental.func;
<simpara>
<function>mb_regex_encoding</function>は、マルチバイト対応の正規表
@@ -1894,16 +1890,12 @@
</refnamediv>
<refsect1>
<title>説明</title>
- <funcsynopsis>
- <funcprototype>
- <funcdef>int <function>mb_ereg</function></funcdef>
- <paramdef>string <parameter>pattern</parameter></paramdef
- <paramdef>string <parameter>string</parameter></paramdef>
- <paramdef>array
- <parameter><optional>regs</optional></parameter>
- </paramdef>
- </funcprototype>
- </funcsynopsis>
+ <methodsynopsis>
+ <type>int</type><methodname>mb_ereg</methodname>
+ <methodparam><type>string</type><parameter>pattern</parameter></methodparam>
+ <methodparam><type>string</type><parameter>string</parameter></methodparam>
+ <methodparam
+choice="opt"><type>array</type><parameter>regs</parameter></methodparam>
+ </methodsynopsis>
&warn.experimental.func;
<simpara>
<function>mb_ereg</function>は、マルチバイト対応の正規表現マッチを
@@ -1939,16 +1931,12 @@
</refnamediv>
<refsect1>
<title>説明</title>
- <funcsynopsis>
- <funcprototype>
- <funcdef>int <function>mb_eregi</function></funcdef>
- <paramdef>string <parameter>pattern</parameter></paramdef>
- <paramdef>string <parameter>string</parameter></paramdef>
- <paramdef>array
- <parameter><optional>regs</optional></parameter>
- </paramdef>
- </funcprototype>
- </funcsynopsis>
+ <methodsynopsis>
+ <type>int</type><methodname>mb_eregi</methodname>
+ <methodparam><type>string</type><parameter>pattern</parameter></methodparam>
+ <methodparam><type>string</type><parameter>string</parameter></methodparam>
+ <methodparam
+choice="opt"><type>array</type><parameter>regs</parameter></methodparam>
+ </methodsynopsis>
&warn.experimental.func;
<simpara>
<function>mb_eregi</function>は、マルチバイト対応の大文字小文字を
@@ -1982,17 +1970,13 @@
</refnamediv>
<refsect1>
<title>説明</title>
- <funcsynopsis>
- <funcprototype>
- <funcdef>string <function>mb_ereg_replace</function></funcdef>
- <paramdef>string <parameter>pattern</parameter></paramdef>
- <paramdef>string <parameter>replacement</parameter></paramdef>
- <paramdef>string <parameter>string</parameter></paramdef>
- <paramdef>string
- <parameter><optional>option</optional></parameter>
- </paramdef>
- </funcprototype>
- </funcsynopsis>
+ <methodsynopsis>
+ <type>string</type><methodname>mb_ereg_replace</methodname>
+ <methodparam><type>string</type><parameter>pattern</parameter></methodparam>
+ <methodparam><type>string</type><parameter>replacement</parameter></methodparam>
+ <methodparam><type>string</type><parameter>string</parameter></methodparam>
+ <methodparam
+choice="opt"><type>array</type><parameter>option</parameter></methodparam>
+ </methodsynopsis>
&warn.experimental.func;
<simpara>
<function>mb_ereg_replace</function>は、マルチバイト文字列
@@ -2040,14 +2024,12 @@
</refnamediv>
<refsect1>
<title>説明</title>
- <funcsynopsis>
- <funcprototype>
- <funcdef>string <function>mb_eregi_replace</function></funcdef>
- <paramdef>string <parameter>pattern</parameter></paramdef>
- <paramdef>string <parameter>replacement</parameter></paramdef>
- <paramdef>string <parameter>string</parameter></paramdef>
- </funcprototype>
- </funcsynopsis>
+ <methodsynopsis>
+ <type>string</type><methodname>mb_eregi_replace</methodname>
+ <methodparam><type>string</type><parameter>pattern</parameter></methodparam>
+ <methodparam><type>string</type><parameter>replace</parameter></methodparam>
+ <methodparam><type>string</type><parameter>string</parameter></methodparam>
+ </methodsynopsis>
&warn.experimental.func;
<simpara>
<function>mb_eregi_replace</function>は、マルチバイト文字列
@@ -2080,16 +2062,12 @@
</refnamediv>
<refsect1>
<title>説明</title>
- <funcsynopsis>
- <funcprototype>
- <funcdef>array <function>mb_split</function></funcdef>
- <paramdef>string <parameter>pattern</parameter></paramdef>
- <paramdef>string <parameter>string</parameter></paramdef>
- <paramdef>int
- <parameter><optional>limit</optional></parameter>
- </paramdef>
- </funcprototype>
- </funcsynopsis>
+ <methodsynopsis>
+ <type>array</type><methodname>mb_split</methodname>
+ <methodparam><type>string</type><parameter>pattern</parameter></methodparam>
+ <methodparam><type>string</type><parameter>string</parameter></methodparam>
+ <methodparam
+choice="opt"><type>int</type><parameter>limit</parameter></methodparam>
+ </methodsynopsis>
&warn.experimental.func;
<simpara>
<function>mb_split</function>は、マルチバイト文字列
@@ -2125,16 +2103,12 @@
</refnamediv>
<refsect1>
<title>説明</title>
- <funcsynopsis>
- <funcprototype>
- <funcdef>bool <function>mb_ereg_match</function></funcdef>
- <paramdef>string <parameter>pattern</parameter></paramdef>
- <paramdef>string <parameter>string</parameter></paramdef>
- <paramdef>string
- <parameter><optional>option</optional></parameter>
- </paramdef>
- </funcprototype>
- </funcsynopsis>
+ <methodsynopsis>
+ <type>bool</type><methodname>mb_ereg_match</methodname>
+ <methodparam><type>string</type><parameter>pattern</parameter></methodparam>
+ <methodparam><type>string</type><parameter>string</parameter></methodparam>
+ <methodparam
+choice="opt"><type>string</type><parameter>option</parameter></methodparam>
+ </methodsynopsis>
&warn.experimental.func;
<simpara>
<function>mb_ereg_match</function>は、マルチバイト文字列
@@ -2166,17 +2140,11 @@
</refnamediv>
<refsect1>
<title>説明</title>
- <funcsynopsis>
- <funcprototype>
- <funcdef>bool <function>mb_ereg_search</function></funcdef>
- <paramdef>string
- <parameter><optional>pattern</optional></parameter>
- </paramdef>
- <paramdef>string
- <parameter><optional>option</optional></parameter>
- </paramdef>
- </funcprototype>
- </funcsynopsis>
+ <methodsynopsis>
+ <type>bool</type><methodname>mb_ereg_search</methodname>
+ <methodparam
+choice="opt"><type>string</type><parameter>pattern</parameter></methodparam>
+ <methodparam
+choice="opt"><type>string</type><parameter>option</parameter></methodparam>
+ </methodsynopsis>
&warn.experimental.func;
<simpara>
<function>mb_ereg_search</function>は、マルチバイト文字列が正規表
@@ -2211,17 +2179,11 @@
</refnamediv>
<refsect1>
<title>説明</title>
- <funcsynopsis>
- <funcprototype>
- <funcdef>array <function>mb_ereg_search_pos</function></funcdef>
- <paramdef>string
- <parameter><optional>pattern</optional></parameter>
- </paramdef>
- <paramdef>string
- <parameter><optional>option</optional></parameter>
- </paramdef>
- </funcprototype>
- </funcsynopsis>
+ <methodsynopsis>
+ <type>array</type><methodname>mb_ereg_search_pos</methodname>
+ <methodparam
+choice="opt"><type>string</type><parameter>pattern</parameter></methodparam>
+ <methodparam
+choice="opt"><type>string</type><parameter>option</parameter></methodparam>
+ </methodsynopsis>
&warn.experimental.func;
<simpara>
<function>mb_ereg_search_pos</function>は、マルチバイト文字列の中
@@ -2257,17 +2219,11 @@
</refnamediv>
<refsect1>
<title>説明</title>
- <funcsynopsis>
- <funcprototype>
- <funcdef>array <function>mb_ereg_search_regs</function></funcdef>
- <paramdef>string
- <parameter><optional>pattern</optional></parameter>
- </paramdef>
- <paramdef>string
- <parameter><optional>option</optional></parameter>
- </paramdef>
- </funcprototype>
- </funcsynopsis>
+ <methodsynopsis>
+ <type>array</type><methodname>mb_ereg_search_regs</methodname>
+ <methodparam
+choice="opt"><type>string</type><parameter>pattern</parameter></methodparam>
+ <methodparam
+choice="opt"><type>string</type><parameter>option</parameter></methodparam>
+ </methodsynopsis>
&warn.experimental.func;
<simpara>
<function>mb_ereg_search_regs</function>は、マルチバイト文字列の中
@@ -2302,18 +2258,12 @@
</refnamediv>
<refsect1>
<title>説明</title>
- <funcsynopsis>
- <funcprototype>
- <funcdef>array <function>mb_ereg_search_init</function></funcdef>
- <paramdef>string <parameter>string</parameter></paramdef>
- <paramdef>string
- <parameter><optional>pattern</optional></parameter>
- </paramdef>
- <paramdef>string
- <parameter><optional>option</optional></parameter>
- </paramdef>
- </funcprototype>
- </funcsynopsis>
+ <methodsynopsis>
+ <type>array</type><methodname>mb_ereg_search_init</methodname>
+ <methodparam><type>string</type><parameter>string</parameter></methodparam>
+ <methodparam
+choice="opt"><type>string</type><parameter>pattern</parameter></methodparam>
+ <methodparam
+choice="opt"><type>string</type><parameter>option</parameter></methodparam>
+ </methodsynopsis>
&warn.experimental.func;
<simpara>
<function>mb_ereg_search_init</function>は、マルチバイト対応の正規
@@ -2349,14 +2299,10 @@
</refnamediv>
<refsect1>
<title>説明</title>
- <funcsynopsis>
- <funcprototype>
- <funcdef>array
- <function>mb_ereg_search_getregs</function>
- </funcdef>
- <void/>
- </funcprototype>
- </funcsynopsis>
+ <methodsynopsis>
+ <type>array</type><methodname>mb_ereg_search_getregs</methodname>
+ <void/>
+ </methodsynopsis>
&warn.experimental.func;
<simpara>
<function>mb_ereg_search_getregs</function>は、直前の
@@ -2394,14 +2340,10 @@
</refnamediv>
<refsect1>
<title>説明</title>
- <funcsynopsis>
- <funcprototype>
- <funcdef>array
- <function>mb_ereg_search_getpos</function>
- </funcdef>
- <void/>
- </funcprototype>
- </funcsynopsis>
+ <methodsynopsis>
+ <type>array</type><methodname>mb_ereg_search_getpos</methodname>
+ <void/>
+ </methodsynopsis>
&warn.experimental.func;
<simpara>
<function>mb_ereg_search_getpos</function>は、
@@ -2436,14 +2378,10 @@
</refnamediv>
<refsect1>
<title>説明</title>
- <funcsynopsis>
- <funcprototype>
- <funcdef>array
- <function>mb_ereg_search_setpos</function>
- </funcdef>
- <void/>
- </funcprototype>
- </funcsynopsis>
+ <methodsynopsis>
+ <type>array</type><methodname>mb_ereg_search_setpos</methodname>
+ <void/>
+ </methodsynopsis>
&warn.experimental.func;
<simpara>
<function>mb_ereg_search_setpos</function>は、
Index: phpdoc/ja/functions/pcntl.xml
diff -u phpdoc/ja/functions/pcntl.xml:1.5 phpdoc/ja/functions/pcntl.xml:1.6
--- phpdoc/ja/functions/pcntl.xml:1.5 Sat Feb 2 10:44:25 2002
+++ phpdoc/ja/functions/pcntl.xml Sat Feb 16 08:20:10 2002
@@ -1,5 +1,5 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!-- $Revision: 1.5 $ -->
+<?xml version="1.0" encoding="utf-8"?>
+<!-- $Revision: 1.6 $ -->
<reference id="ref.pcntl">
<title>プロセス制御関数</title>
<titleabbrev>PCNTL</titleabbrev>