2011年7月19日火曜日

phpでWarning: Cannot modify header information - headers already sent by ~が出たときの対処法

タイトルの通りなんだけど、phpでheader関数やsession_startを使うとき、最初の頃は
良く目にするエラー。
エラーの内容は読んで字の如くヘッダを編集しようとしたけど既にヘッダが送信されてるよってこと。
対処法その1
header関数やsession_startの前に改行やタブやスペースやHTMLなどをつけていないか。
特に?>の後に改行を入れている場合ハマる。例えば、
<?php
require_once("hogehoge.php");
?>
<?php
session_start();
?>
はエラーになる。太字の?>で改行を出力しているから。

対処法その2
上記対応でもNGの場合、php.iniの設定を修正すれば直る(らしい
php.iniでoutput_buffering = ON 又は output_buffering = 4096のようにすると良いらしい。
参考

対処法その3
上記2つでもNGの場合、もし文字コードがUTF-8なら、BOM付きでないか確認する。
これ、自分がハマりました。
windows上のapache+phpでは問題なく動くが、いざLinuxにもっていくと動かないという症状に悩まされます。
検証法は割と簡単で、Linuxマシン上で、エラーが出ているファイルをコピーし、コピーしたファイルの中身を全て削除後、以下のコードを打ち込みます。
<?php
echo headers_sent();
保存したら、php hogehoge.php(上記編集したファイル)で実行。1が表示されればまずBOMありです。

対処法は関係するファイルの文字コードをUTF-8のBOMなしに変換する事。
これで直りました。やれやれ。

エラーの表示もう少し分かりやすくならないものかねぇ。単に出力されているぞ!ではなく”何が”出力されているのかぐらい出してくれればまだ追いかけられる物を>ブツブツ

2011年7月17日日曜日

セキュアちいたんを作成してみた

個人的にPHPで作成する際に重宝する世界最小PHPフレームワークちいたん
しかし、若干機能不足が否めない。特にDBの文字コード指定が出来ないのと、
サニタイズとバリデーションクラスが拡張できないのが辛い。
ので、どうせならセキュリティにある程度配慮したちいたんを作成してみた。
但し、大幅に改造すると、のちのVerUPの時にしんどいので、フレームワークへの
修正は最小限とし、機能拡張部分は外部ファイルへ追い出す方向で。

今回は作成したものをGitHubにおいてみた。

PHPは本業ではないので、書き方とかおかしいかもしれないけど、phpdocumentっぽく
コメントを書いてみた。こんな感じなのかな~と。

ちいたん0.8.1.0からの主な変更点
PHP5.2.3以上、MySQL5.0.7以上でないと動作しなくなった。 
DB接続の際に文字コードの指定が出来るように。
文字コードをUTFー8に。
gotやpostなどの外部から来る変数に対しnullbyteの除去。
viewに渡すときに特に指定がなければ、無条件にサニタイズを行うように。
文字コード改変チェック。
セッションIDの妥当性チェック。xss,xsrf対策。
など。

*セキュアちいたんの作成にあたり、パーフェクトPHP体系的に学ぶ 安全なWebアプリケーションの作り方 脆弱性が生まれる原理と対策の実践 を参考にしました。