• ベストアンサー

PHPでCGIをするのは

邪道でセキュリティの問題を引き起こすのでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • sisya
  • ベストアンサー率39% (97/244)
回答No.4

#3の補足欄に対する回答です。 PHPは「<?php」とかかれる前にテキストを書いても良いように あらかじめヘッダが出力されています。 ですので「Content-type: text/html\n」は無くても大丈夫です。 もしなんらかのヘッダを出力したい場合は 文字を表示する前の段階で header("Content-type: text/html"); のように書いてください。

keyguy
質問者

補足

ありがとうございます 何度も答えてもらい恐縮しています test.cgi: #!/usr/bin/php <?php header("Content-type: text/html\n"); print "\n"; print "<html>\n"; print "<head>\n"; print "<title>テスト</title>\n"; print "</head>\n"; print "<body bgcolor=\"#ffcccc\">\n"; print "これはCGIのテストです。\n"; print "</body>\n"; print "</html>\n"; ?> としてみたところ Warning: Cannot modify header information - headers already sent by (output started at /var/www/cgi-bin/test.cgi:3) in /var/www/cgi-bin/test.cgi on line 4 これはCGIのテストです。 となりました "Content-type: text/html\n"以外のヘッダ送らないといけない状況はないのでしょうか? その場合は自動生成ヘッダを無効にしなければならないと思いますがどうすればいいのでしょうか?

その他の回答 (3)

  • sisya
  • ベストアンサー率39% (97/244)
回答No.3

#2の補足欄に対する回答です。 もちろんPerlは元々CGIで動作させるものですので、 エラーはでません。 ですが、PHPは初めからCGIで動作させるよう設定されていないので、 設定をしなければ動作しません。 php.iniの 「;cgi.force_redirect = 1」とかかれている部分を 「cgi.force_redirect = 0」と変更してください

keyguy
質問者

補足

ありがとうございます 動きました Content-type: text/html これはCGIのテストです。 が表示されました ヘッダ(Content-type: text/html ) がついてきたのですが何が悪いのでしょうか? PHPの場合ヘッダはいらないということなのでしょうか? test.cgi: #!/usr/bin/php <?php print "Content-type: text/html\n"; print "\n"; print "<html>\n"; print "<head>\n"; print "<title>テスト</title>\n"; print "</head>\n"; print "<body bgcolor=\"#ffcccc\">\n"; print "これはCGIのテストです。\n"; print "</body>\n"; print "</html>\n"; ?>

  • sisya
  • ベストアンサー率39% (97/244)
回答No.2

#1の補足欄に対する回答ですが、 かっこ内の意味はCGI実行に反対するのではなく、 以前はCGIスクリプトはすべて「cgi-bin」フォルダの中でのみ 実行可能というサーバが(かなり)多かったのですが、 フォルダ名が普遍的であるがゆえに スクリプトが置いてあるであろう位置が容易に推測できてしまい、 直接指定で実行されてしまいやすい事が理由なのではないかと思います。 また、自動的に特定のスクリプトを攻撃するスクリプトが 出回ってしまった場合、 本来の攻撃対象であるサーバ以外のサーバも副作用的に攻撃されてしまう可能性もあります。 余談ですが、「cgi-bin」と言う位置に固定されてしまう事により、 カテゴリ分けがしづらいなど、デザイン上も非常に不利益を蒙ります。 (某大手レンタルサーバなどで未だ現役です)

keyguy
質問者

補足

ありがとうございます サーバはFedoraCoreですが test.cgi: #!/usr/bin/php <?php print "Content-type: text/html\n"; print "\n"; print "<html>\n"; print "<head>\n"; print "<title>テスト</title>\n"; print "</head>\n"; print "<body bgcolor=\"#ffcccc\">\n"; print "これはCGIのテストです。\n"; print "</body>\n"; print "</html>\n"; ?> を/var/www/cgi-bin/におき http://192.168.0.101/cgi-bin/test.cgi をブラウザから呼ぶと Security Alert! The PHP CGI cannot be accessed directly. This PHP CGI binary was compiled with force-cgi-redirect enabled. This means that a page will only be served up if the REDIRECT_STATUS CGI variable is set, e.g. via an Apache Action directive. というメッセージがでました どうすればいいのでしょうか? なお test2.cgi: #!/usr/bin/perl print "Content-type: text/html\n"; print "\n"; print "<html>\n"; print "<head>\n"; print "<title>テスト</title>\n"; print "</head>\n"; print "<body bgcolor=\"#ffcccc\">\n"; print "これはCGIのテストです。\n"; print "</body>\n"; print "</html>\n"; を/var/www/cgi-bin/におき http://192.168.0.101/cgi-bin/test2.cgi をブラウザから呼ぶと正常に動作しました

  • infinity
  • ベストアンサー率41% (123/295)
回答No.1

通常のモジュールとしてではなく、 CGIモードで、ということでしょうか。 (という言い方も変ですが) 別に邪道ではありませんし、 セキュリティ面には特に変わりないです。 実行速度が落ちるというだけで。

keyguy
質問者

補足

ありがとうございます PHPのマニュアルに以下のようなことが書いてありますが これはどういうことでしょうか? PHP を CGI バイナリとして使用するのは、PHP を モジュールとして(Apache のような)サーバーソフトウエアに組み込み たくない何らかの理由がある場合や安全な chroot と setuid 環境をス クリプトに提供する他の CGI ラッパーと組み合わせて PHP を使用する 場合の設定オプションです。セットアップ時には、通常、PHP 実行バイ ナリを Web サーバーの cgi-bin ディレクトリにインストールします。 「CERT 勧告 CA-96.11は、いかなるイ ンタプリタを cgi-bin に置くことにも反対しています。」 PHP バイナリをスタンドアロンのインタプリタとして使用することが できる場合でも、PHP は、セットアップにより生じる可能性がある 次のような攻撃を防ぐように設計されています。 「」の中が気になります どうしてCERTは反対しているのでしょうか?

関連するQ&A