2009-01-01から1年間の記事一覧

文字エンコーディング判定スクリプト

PHP

最近、忙しかったのですが、久しぶりに少し時間があったので、随分前に書いた文字エンコーディング判定スクリプトを見直してみました。とりあえず、出来上がったものを投稿しておきます。 何か適当な日本語の文字列を与えると、JIS/eucJP-win/SJIS-win/UTF-8…

PHP 5.2.12 の文字エンコーディング関連の修正点

PHP 5.2.12 がリリースされました。 PHP 5.2.12 Release Announcement PHP 5.2.12 ChangeLog Release Announcement にも載っていますが、以前、日記に書いた htmlspecialchars() が Shift_JIS の一部の文字を通してしまう問題は、セキュリティ問題として修正…

いわゆる半角カナや種依存文字などをメールで送信する方法

随分前から書こうと思っていて忘れていたのですが、役に立つ人がいるかもしれませんので、書いておきたいと思います。メールの送信エンコーディングに UTF-8 を使用すれば、機種依存文字という問題を気にする必要はほとんどありませんが、まだ一般的には、IS…

最新の PHP スナップショットでの htmlspecialchars()/htmlentities() の修正内容について

前の記事(Shift_JIS では、htmlspecialchars() を使用しても XSS が可能な場合がある)で Shift_JIS ではブラウザによっては XSS が発生する可能性があることを書きました。この問題は、PHP の開発版のスナップショット(snaps.php.net)で修正されたことを確認…

Shift_JIS では、htmlspecialchars() を使用しても XSS が可能な場合がある

以下のページに関連して、htmlspecialchars() を使用している場合でも XSS が可能かどうか少し調べてみました。 http://www.tokumaru.org/d/20090930.html その結果、いくつかのブラウザで文字エンコーディングに Shift_JIS を使用していた場合、XSS が可能…

出力時の文字エンコーディング変換、妥当性確認について

PHP

大垣さんが以下のページで PHP について言及しておられますので、気になったことを書いておきたいと思います。 http://blog.ohgaki.net/rails-ruby-1-9 私は、現在、PHP で構築したサイト運用はしていませんので、出力時に文字エンコーディングを変換、妥当…

指定日の unixtime を求める方法

PHP

id:hnw さんの日記に以下のような投稿がありましたので、反応してみます。 特定の日時のunixtimeが知りたくなった時って皆さんどうしてますか?例えば2009/09/26 23:00:00 JSTであれば次のワンライナーで求められます。$ php -r 'echo mktime(23,0,0,9,26,20…

文字エンコーディングの妥当性確認(バリデーション)について

PHP

大垣さんからコメントをいただきましたので、最後に追記しました(2009.09.22)。 少し時間が経ってしまいましたが、以下のページを読んで、PHP に関連する部分について思ったことを書きたいと思います。 http://blog.ohgaki.net/char_encoding_must_be_valida…

PHP の svn Revision 287790 での修正で脆弱になったと言えるか

PHP

yohgaki さんから、以下のようなコメントをいただきましたので、少し調べてみました。 何か間違いや勘違いをしているような部分がありましたら、是非コメントでご指摘ください。 http://svn.php.net/viewvc/php/php-src/branches/PHP_5_2/ext/xml/xml.c?r1=2…

最近、PHP の関連でやったことなど

PHP

以前に書いた、UTF-16(BOM 付き Little Endian) を mb_convert_encoding() で変換すると文字列が壊れる件と、mb_detect_encoding() の挙動を調べていた際に見つけた問題について、Patch を PHP-dev のメーリングリストに送ってみました([PHP-dev 1488] mbstr…

プライベートメソッドに対するテスト方法

PHP

phpunit などを使って PHP スクリプトをテストする時に、プライベートメソッドをテストしたくなる時があると思いますが、PHP では結構難しいように思います。 PHP でプライベートメソッドをテストする方法として、思い付くのは以下の方法くらいでしょうか。 …

第45回PHP勉強会@関東に参加してきました

PHP

8/1に開催された第45回PHP勉強会@関東に参加してきました。 会場を提供してくださったはてな様(六本木のお好み焼き屋さん)、幹事の gusagi さん、どうもありがとうございました。 今回も楽しく過ごすことができました。私が発表した資料を以下の場所にアッ…

PHP 5.3.0 の mbstring で使用可能な文字コード名とエイリアス

PHP 5.3.0 で mb_encoding_aliases() が追加されました。 この関数は、第1引数に指定した文字コードが mbstring で使用できる場合、そのエイリアス名を配列で返します。引数の文字コードは大文字、小文字を区別しません。また、MIME名やエイリアス名も指定可…

PHP 5.3.0 への移行で脆弱な Web アプリケーションが発生する?

PHP

PHP6移行で増える脆弱なWebアプリ(yohgaki's blog) を読んで、結構気になったので、調べてみました。調べてみた結果、私には特に問題となるような箇所は見つけられませんでした。調べたことについてメモしておきます。 問題 PHP6移行で増える脆弱なWebアプリ…

PHP 5.3.0 で追加された拡張モジュール・クラス・関数など

PHP

少し前に PHP 5.3.0 が公開されましたので、追加された拡張モジュールやクラス、関数などを調べてみました。比較対象は PHP 5.2.10 です。 PHP 5.2.10、PHP 5.3.0 の両方とも、以下のオプションでコンパイルしました。 ./configure \ --with-apxs=/usr/local…

mb_check_encoding() の代替関数

PHP

これまでに挙げた文字コードについて、正規表現を使用して mb_check_encoding() の代替用の関数を書いてみました。ある程度、妥当なものになっているとは思いますが、間違い等に気付いた方がおられましたら、ご指摘ください。 UTF-8 については、RFC3629 を…

mb_detect_encoding() は文字コードの妥当性検証として使用できるか(その3)

遅くなりましたが、以下の続きです。 mb_detect_encoding() は文字コード判定として使用できるか(その1)) mb_detect_encoding() は文字コード判定として使用できるか(その2)) 今回は ISO-2022-JP、ISO-2022-JP-MS、UTF-16、UTF-16BE、UTF-16LE について、mb_…

mb_check_encoding() の内部処理

参考までに、mb_check_encoding() が内部で何をしているかについて書いておきます。 mb_check_encoding() は mb_convert_encoding() で第2引数と第3引数に同じ文字コードを指定した場合と同じ処理い、元の文字列と、変換後の文字列が同じかどうかで TRUE/FAL…

mb_detect_encoding() は文字コードの妥当性検証として使用できるか(その2)

前回(mb_detect_encoding() は文字コード判定として使用できるか(その1))の続きです。 mb_check_encoding() と mb_detect_encoding() を正規表現として表わして比較してみました。各文字コードごとにまとめます。調査した PHP のバージョンは、5.2.9 で、前…

mb_detect_encoding() は文字コード判定として使用できるか(その1)

最近、mb_detect_encoding() について調べていたので、そのメモです。mb_detect_encoding() は文字コード検出を行う関数です(mb_detect_encoding() - PHP マニュアル)。 結論としては、以下の問題があるため、mb_detect_encoding() を文字コード判定には向い…

ファイルの排他処理

PHP

以下の文で誤解を招くような表現がありましたので、修正しました(2009.06.15)。 スクリプトで変数名に間違いがありましたので、修正しました(2009.09.27)。3年くらい前にテストで書いた、カウンタの処理スクリプトです。2種類書いていたので掲載してみます。…

stream_set_write_buffer() を実行しても効果がない

PHP

PHPのfgetcsvやfputcsvでファイルを扱う時の排他処理(donkのPHP日記)を読んで、昔 stream_set_write_buffer() について調べていたのを思い出しました。stream_set_write_buffer() は、「指定されたストリームのファイルバッファリングを有効にする」という関…

UTF-16(BOM 付き Little Endian) を mb_convert_encoding() で変換すると文字列が壊れる

前の項目からの続きです。 基本的に、PHP 5.2 1 以降(正確には 5.2.8 以降)では、mb_check_encoding() が false を返す場合、以下も false を返します。

mb_check_encoding() は UTF-16(BOM 付き Little Endian) を正しく検証できない

確認した PHP のバージョンは PHP 5.2.9 です。

第43回 PHP 勉強会@関東に参加してきました

今ごろな気がしますが、5/29(金)に開催された第43回 PHP 勉強会@関東に参加してきました。会場を提供してくださったノッキング様、どうもありがとうございました。勉強会の内容は他に方が詳しく書いておられますので、そちらを参考にしてください。勉強会の…

POSIX 正規表現関数が PHP 5.3.0 から非推奨になっている

PHP

第11回■制御文字や不正な文字エンコーディングによるぜい弱性を知ろうという記事に、以下のような記述があったので、PHP マニュアルを調べていました。 PHPなどのマニュアルを見ても,関数ごとにバイナリ・セーフに関する説明がないからだ。ereg関数のリファ…

array_unique() のデフォルトの挙動が元に戻ります

PHP

id:hnw さんが既に書いておられますが、array_unique() のデフォルトの挙動が PHP 5.2.8 以前と同じに修正されることになりました。PHP 5.2.10 以降で反映される予定です。 http://cvs.php.net/viewvc.cgi/php-src/ext/standard/array.c?r1=1.308.2.21.2.66&…

php 5.2.9 で修正された mbstring 関係のバグをまとめました

PHP 5.2.9 で mbstring 関係についても多くのバグが修正されました。そのあたりについて、調べたことを PHP の mbstring に関するメモのバグ・セキュリティ問題にまとめました。何か間違いや気付いたことなどがあれば、コメントなどで教えてください。今回の…

php 5.2.9 で array_unique() のデフォルトの挙動が変更

PHP

PHP 5.2.9 がリリースされましたが、少し気になったのでメモしておきます。 array_unique() の挙動が変更されています。array_unique() に第2引数(sort_flag)が追加され、ソート方法が指定できるようになりました。 以下のようにデフォルトが SORT_REGULAR …