解読不能な暗号

暗号って、受け取って読む側がいるものなので、なんらかの復号手段があるわけですよね〜

http://www.atmarkit.co.jp/news/200804/11/cab.html
http://www.atmarkit.co.jp/news/200804/14/weekly.html

解読困難やほぼ無理、ではなくて解読不能とのこと・・・
解読不能ってセンセーショナルなことを言い切るのであれば、やっぱり裏を取ったほうがいいと思います。

記事を見た瞬間このサイトがよぎりました。 ⇒ http://www.realcreate.net/

expose_php=On

レスポンスヘッダへのPHPクレジットだけじゃなくEaster Eggsとかも出ちゃうんですね。
(Easter Eggsというか、phpinfoの画面から呼ばれる画像など)

https://www.webappsec.jp/modules/bwiki/index.php?PHP%20Easter%20Eggs%20%A4%F2%BB%C8%A4%C3%A4%BF%A5%D0%A1%BC%A5%B8%A5%E7%A5%F3%BF%E4%C2%AC
http://shiflett.org/blog/2006/feb/php-easter-eggs
http://ryouchi.seesaa.net/article/37629160.html

こういうのがデフォルトOnになってるらしいです。


マニュアルを見てもなんだか釈然としないです。
http://jp.php.net/manual/ja/ini.core.php

expose_php boolean

(例えば、Web サーバヘッダに PHP のサインを追加することにより、) PHP がサーバにインストールされていることを表示するかどうかを 指定します。これは全くセキュリティ上の脅威ではなく、サーバ上 で PHP を使用しているかどうかを調べられるようにするものです。

expose_php = Off がデフォルトにならないかなあ・・・。

コンソールから毎回SET NAMESが面倒なので

オプションファイル(~/.my.cnf)に設定を書いておくのがいい気もしていますが、ついでにホスト名とかも入れるのが面倒なので、

#!/bin/bash
mysql -u hogeuser -phogepass -h hogehost -P hogeport --default-character-set=ujis hogedb

を ~/bin/myhoge とかにしておいて(~/bin/ にPATHを通しておいて)、コマンドラインから myhoge だけで接続できるようにしています。いろんな意味で手抜きです。

ADODBセッションでmysqliを使いたい


↓ADODBセッション
http://phplens.com/lens/adodb/docs-session.htm

要は

include_once("adodb/session/adodb-session2.php");
ADOdb_Session::config( $driver, $host, $user, $password, $database, $options = false );
session_start();

PHPのセッションデータがDBに保持されるので、webが複数サーバに分散しているときなどは便利です。


対応しているdriverについては、mysql, postgres, oci8 あたりであろうことは想像がつくのですが、特に明記されていません。(ソースを見ると、oci8po, oracle, oci805あたりもいけそう、pdo_* は想定してなさそう。※未検証)



また、デフォルトじゃないポートで立ち上がったMySQLに対してmysqli接続ができませんでした。理由は↓と同じです。
http://d.hatena.ne.jp/yoshihi6/20080201/1201837964
mysqliも想定してなさそうです。

mysql接続のほうは、文字コードセット云々のため使いたくないし、セッション用に別途mysql接続を用意するのも微妙なので、困りました。

解決策として、強引に

    $GLOBALS['ADODB_SESS_CONN'] =& $conn;        // 接続済!

で一見何とかなった風にはなりますが、adodb-session2.php のソースを見たところ、mysql独自の処理が挟まっているので、念のため以下の対処をしました。

  • セッションテーブルは、トランザクション未対応のMyISAM型にする
  • セッションテーブルの列の型を変更
    • VARCHAR ⇒ VARBINARYに
    • LONGTEXT ⇒ LONGBLOBに

・・・

そもそもこれ使っている人ってあまりいないんですかねえ。

EthnaでDBセッション使うと session_save_handler の前で接続が切られてしまったり等もあり、memcachedとか、データをNFSで共有とかが主流なのかなあと感じました。

ADOdbのmysqlとmysqli 接続について

違いは、中で mysql_* を使ってるか mysqli_* を使ってるかなのですが、実際使ってみて気になった点をまとめておきます。

  • mysqliで旧バージョンのやり方による接続が、場合によってちょっと厳しい

昔からある接続方法ですが、

$conn = ADONewConnection('mysqli');
$conn->Connect( 'hogehogehost', 'hogehogeuser', 'hogehogepass', 'hogehogedbname' );

です。
ADOdb 4.51からは、DSNを渡す形での接続も可能になっていて、上記の接続は

$conn = NewADOConnection('mysqli://hogehogeuser:hogehogepasss@hogehogehost/hogehogedbname');

とすることも可能です。

上記の "mysqli" を "mysql" に変えれば、mysqlドライバで接続できます。


ここまでは特に問題ないのですが、

デフォルト以外のポートで立ち上がっているDBに、mysqliで繋ぐ場合、旧バージョンのやり方ではできませんでした。

mysqlの場合(13306番でつなぎにいくとします)

$conn = ADONewConnection('mysql');
$conn->Connect( 'hogehogehost:13306', 'hogehogeuser', 'hogehogepass', 'hogehogedbname' );

でOKですが、これをmysqliでやるとエラーになってしまいます・・・

  • mysql_connect の第1引数であるホスト名に、ポート番号も含める形で指定することが可能
  • mysqli_connect の第1引数であるホスト名には、ポート番号を含める形で指定することは不可能で、ポート番号は第5引数で渡す

という違いが吸収しきれていないためとおもわれます。


DSNのほうで接続していれば問題ないので、なるべくDSNを使うようにしたほうがよさそうです。

PHPから SET NAMES ujis はやらない

http://d.hatena.ne.jp/yoshihi6/20070726/1185414880

    $db = &ADONewConnection( 'mysql' );
    $db->Connect(
        (DB名とかパスワードとか)
    );
    $db->execute( '/*!40101 SET NAMES ujis */' );

⇒ mysql3〜5で動く!

ということを書きましたが、よくない方法でした。極力やらないほうがいいです・・・

このあたりが理由⇒http://blog.ohgaki.net/index.php/yohgaki/2007/08/22/set_namesa_mcb_asc



文字コードの指定はmysql3〜5、PHP4〜5で動くコードはあきらめて、

  • mysql_set_charset() をつかう(PHP5.2.3以降)
  • mysqli_set_charset(), mysqli->set_charset() をつかう(PHP5.0.5以降)

のどちらかにしたほうがいいです。

※mysql3は、切り捨てる。(というか別途コードを書けばいい)


adodbだと、PHP5対応版のmysqli接続に SetCharSetメソッドが実装されてたのでこれを使うのが見栄えがよいかもです。

    $db = &ADONewConnection( 'mysqli' );
    $db->Connect(
        (DB名とかパスワードとか)
    );
    $db->SetCharSet( 'ujis' );

adodb mysqli の接続について気になりだしてきたのでまた今度書きます。