ブログ

  • 【PHP】PDO::execとUPDATE文の不具合

    PHPのデータベース抽象化レイヤーPDOのexecを実行した際、少しはまったので覚書しておきます。

    どうはまったのかと言うと、exec をUPDATE文にて実行した際、期待した返り値が返ってこなかったというものです。

    PHPマニュアルのexec の説明には次のようにあります。
    「PDO::exec() は、発行した SQL ステートメントによって更新もしくは 削除された行数を返します。 1 行も作用しなかった場合、PDO::exec() は 0 を返します。」
    http://php.net/manual/ja/pdo.exec.php

    つまり、1行に作用すれば、1が返ってくるはずですが、場合により、0が返ってくる事があったのです。

    調べてみると、どうやら、ある行に作用していても、その行が実質的に変更されていなければ、0を返す仕様らしいです。

    どういうことかと言うと、ある行をUPDATE しても、その内容が同一のものであった場合、UPDATE 前後で内容が変わらないので、結局0を返すのです。

    更新に成功していても、値が変わらないので、行に作用しなかったものとみなされて0が返ってくるという訳です。

    PDO::exec を使っていて、返り値がおかしかったら、この点を調べてみると良いかもしれません。

    (注意)ざっと調べただけですので間違っている可能性があります。参考は自己責任でお願いします。

    以上です。

  • パーフェクトPHPのフレームワーク学習法

    書籍「パーフェクトPHP」の7章、8章にあるフレームワークの学習法についての覚書です。

    PHP入門レベルの学習者が、この「パーフェクトPHP」を手にしたとき、多くの人が7章、8章のフレームワークの箇所で、つまづくと思います。

    そこで、どうしたら、このフレームワークの章を理解できるようになるのかを、後続の学習者のために記しておきます。

    パーフェクトPHP (PERFECT SERIES 3)

    【つまづく原因】

    このフレームワークの箇所でつまづく原因は、主に2つあります。

    第一に、初心者にとってフレームワークの概念が難しいこと。
    第二に、オブジェクト指向プログラミングの実践例が初めてであること。

    この2つのハードルにより、一気に難易度が上がったような感覚になります。

    そこで、この2つを解決することを優先します。

    【解決策の一つ目】

    まず、第一の点について、新規にフレームワークを学ぶことで、フレームワークの概念について理解を深めます。

    具体的には、CakePHPを学習することをお勧めします。

    CakePHPには、詳細なWEBマニュアルが存在すること、日本語書籍が多くあること、また、日本での利用シェアが高いことなどの点を考慮し、最初のフレームワークの学習に最適と考えます。

    以下の3冊を順に読めば、CakePHPのフレームワークの基礎を身に付けられます。

    【書籍紹介】

    ■ CakePHP2 実践入門 (WEB+DB PRESS plus)

    ■  WebデザイナーのためのCakePHPビューコーディング入門

    ■  即戦力になるための PHPシステム開発の教科書

    上記書籍を読み終えたなら、CakePHPの使い方については、理解できているはずです。

    【解決策の二つ目】

    CakePHPを学習したら、次にパーフェクトPHPの7章、8章のフレームワークに戻ります。

    ここでのポイントは、7章からではなく、8章のフレームワークの使い方から学習することです。

    CakePHPにおいても、フレームワークの使い方は学びますが、中の本体であるCOREの部分についてはノータッチです。つまり、使い方を学んだわけであり、本体の仕組みまでは踏み込んではいないのです。

    ですから、パーフェクトPHPにおいても、まずは、使い方である8章から学習を開始すると理解しやすいのです。また、CakePHPに似ている箇所も多くあるので、こうした方が学習が捗るでしょう。

    そして、もう一つのポイントは、「パーフェクトPHP」のサポートサイトからサンプルコードをダウンロードして、すべて印刷することです。

    書籍では部分部分を解説する箇所が多くありますが、全体を通して俯瞰できるように、サンプルコードを実際に印刷して学習します。

    8章の使い方を学習すれば、「モデルを設定して、コントローラーにアクションを定義し、ビューを記述する」という、フレームワークならではの一連の流れが採用されていることが理解できます。

    そうしてから、7章のフレームワーク本体であるフレームワーク自体の作成を学習するのです。

    こうすると、フレームワークの使い方で学んだことの内部の仕組みが理解できるようになります。また、それと同時にオブジェクト指向の実践例についても理解しマスターできるようになります。

    【まとめ】

    「パーフェクトPHP」の7章、8章のフレームワークの箇所でつまづいたら、

    1.CakePHPを実際に学習してみる

    2.8章のフレームワークの使い方から学習する

    この二つを実践すると、無理なく学習できます。なお、その際には、パーフェクトPHPのサンプルコードの印刷も忘れずに。

    CakePHPを学習することは、とても遠回りになるようにも思えますが、結果的には、フレームワークの使い方をマスターし、かつ、オブジェクト指向の理解も深まるため、PHPの学習には非常に有益だと考えます。

    これらは、ぜひお勧めしたい学習法です。

    以上です。

  • 【PHP】GDでメールアドレスを画像出力

    PHPにおいては、GDライブラリを使用すると、簡単に画像を出力できます。

    そこで、ここでは、スパム対策にPHPを使いメールアドレスを画像で出力する方法を覚書しておきます。

    なお、参考は自己責任でお願いします。

    以下を、mail_png.phpとして保存します。

    <?php
    
    //header出力-png
    header('Content-Type: image/png');
    
    //キャンバス作成(x座標, y座標)
    $canvas = @imagecreatetruecolor(250, 40)
     or die('Cannot initialize image.');
    
    // アンチエイリアスを有効化(無くてもよい)
    imageantialias($canvas, true);
    
    //カラー設定(適当な値)
    $silver = imagecolorallocate($canvas, 120, 120, 120); //銀
    $gray   = imagecolorallocate($canvas, 180, 180, 180); //灰
    $white  = imagecolorallocate($canvas, 255, 255, 255); //白
    
    //カラーサンプル
    /****
    $black  = imagecolorallocate($canvas,   0,   0,   0);
    $red    = imagecolorallocate($canvas, 255,   0,   0);
    $green  = imagecolorallocate($canvas,   0, 128,   0);
    $blue   = imagecolorallocate($canvas,   0,   0, 255);
    $orenge = imagecolorallocate($canvas, 255, 165,   0);
    $purple = imagecolorallocate($canvas, 128,   0, 128);
    $silver = imagecolorallocate($canvas, 192, 192, 192);
    $gray   = imagecolorallocate($canvas, 216, 216, 216);
    $white  = imagecolorallocate($canvas, 255, 255, 255);  
    ****/
    
    //背景を白に塗りつぶし
    imagefill($canvas, 0, 0, $white);
    
    //囲み線(長方形)
    imagerectangle($canvas, 1, 1, 248, 38, $gray); //余白1px
    
    //文字入力(im, font, x, y, string, color)
    imagestring($canvas, 5, 12, 12, 'info@example.com', $silver);
    
    //出力-png
    imagepng($canvas);
    
    //破棄
    imagedestroy($canvas);
    
    ?>
    

    とても簡単です。実質10行ほどで画像出力ができます。

    なお、HTML上で画像を呼び出すときは、次のようにします。

    <img src="./mail_png.php">

    以上です。

  • 【WEB】安全なパスワードの作成法【アカウント】

    先日、有名なWEBサービスで、別サイトから漏洩したIDとパスワードを利用した不正アクセスがあったという報道がありました。

    そこで、ここでは、WEBサービスやSNSに用いるための安全なパスワードの作成方法について考察してみたいと思います。

    名付けて「パスワード接頭・接尾語法」です。

    なお、以下の記述は、私の私見であり参考は自己責任でお願いします。

    ■ パスワードに必要な要件

    まず、自分に必要なパスワードの要件を考えてみます。

    1.十分に複雑であること(ブルートフォース・アタック対策)
    2.使いまわしても安全であること(リスト型アカウントハッキング対策)
    3.同一サービスで複数使えること(複数アカウントでの使い分け)
    4.定期的なパスワードの変更に対応できること

    一応、この4要件を満たせれば良しとします。

    ■ 1.十分に複雑であること(ブルートフォース・アタック対策)

    まずは、なんといってもパスワードが複雑であることが求められます。
    ですから、複雑な文字列をパスワードに使うようにします。

    ここでは、例として、次の文字列をパスワードの基本に使います。

    pass

    パスワードにpassなどと入れるのは、最もしてはいけないことですが、ここでは例なので、passとしておきます。

    次に、上記のpassに数字も加えます。これも複雑であって、かつ、自分にとり覚えやすいものを使います。ここでは、次の数字をパスワードに付け足します。

    pass1234

    pass1234などというパスワードも最悪ですが、ここでは、あくまでも例です。この記事では、これを基本パスワードと呼びます。

    このように、文字と数字を組み合わせると基本パスワードの強度につながります。できれば、pa12ss34のように混じりあってると良いでしょう。

    ここまでで、できるだけ複雑で、かつ自分にとって覚えやすい基本パスワードを作成します。yh7d5s8l2のような複雑なものが良いでしょう。これが複雑で長ければ、ブルートフォース・アタック(総当り攻撃)対策になります。

    ■ 2.使いまわしても安全であること(リスト型アカウントハッキング対策)

    さまざまなWEBサービスを使う場合には、それぞれにユニークなパスワードを使うことが望ましいです。なぜなら、万一、あるサービスでIDとパスワードが漏洩しても、他のサービスへの不正アクセスを防ぐことが出来るからです。

    そこで、ここでは、パスワードがユニークになる方法を考えます。

    結論からいうと、基本パスワードに接頭語を付け加えるようにします。

    接頭語とは、読んで字の如く、ある文字の先頭につくものです。なにを接頭語とするかは、色々考えられますが、ここでは、WEBサービスのドメインを接頭語とします。

    たとえば、google.co.jpならば、先頭4文字をとり、googを接頭語とします。あるいは、yahoo.co.jpならば、yahoを接頭語とします。

    googpass1234
    yahopass1234

    このようにWEBサービスのドメインの先頭の何文字かをパスワードの接頭語として使います。こうすると基本パスワードを使いまわしながらも、ユニークなパスワードとして使うことができます。

    パスワードを入力する場合には、ブラウザのアドレスバーを見てドメインの何文字かをパスワードのフォームに入力し、その後に基本パスワードを入力すればよいのです。

    ■ 3.同一サービスで複数使えること(複数アカウントでの使い分け)

    ただし、ヤフーやグーグルのような大手サイトのサービスでは、複数アカウントを使い分ける場合も考えられます。

    複数アカウントでも、ユニークなパスワードの方がよりセキュアとなります。

    そこで、今度は、アカウントごとに、接尾語を基本パスワードのお尻につけるようにします。例えば、アカウントやIDにsomethingとanythingを使っていたとします。

    その場合には、次のように接尾語をつけてやります。

    googpass1234some
    googpass1234anyt

    パスワードを入力する場合には、ユーザーIDやアカウントも利用するのが通常です。そのIDやアカウントを基本パスワードの後ろに付加するわけです。

    こうすると、同一サービスの複数アカウントでも、別々のユニークなパスワードを使うことができます。

    ■ 4.定期的なパスワードの変更に対応(オプションを付加する)

    ここまでの作業で、パスワードは、16文字になり、最初に比べて、セキュリティの強度も増したといえます。

    ただし、WEBサービスによっては、一定期間ごとにパスワードの変更を強制的に求めてくるものもあります。

    その場合には、「接頭語+基本パスワード+接尾語」のセットにオプションとして、何らかのフラグを立てるようにします。

    たとえば、強制的にパスワードの変更を求められたら、フラグとして、1を付加するようにします。

    googpass1234some1

    そして、また変更を求められたら、1を消すわけです。

    一定期間ごとに、1の付加と消去を続けると、漏洩の被害にあった場合、50%の確率で、リスト型攻撃を防止することができます。オブションフラグが、付いている場合と付いていない場合があるからです。

    これを更に進めて、月ごとに、あるいは、四半期ごとにオプションを付加するのも良いでしょう。こうすることで、定期的にパスワードの変更をすることができます。

    例えば、四半期ごとにパスワードを変更するならば、第1四半期は、1を、第2四半期は、2をオブションに付けるようにします。

    googpass1234some1 //第1四半期
    googpass1234some2 //第2四半期
    googpass1234some3 //第3四半期
    googpass1234some4 //第4四半期

    毎月変更するのは大変なので、四半期ごとにオプション部分を変更するのは良い方法ともいえます。なお、西暦の下2桁を足すとより良いでしょう。

    ここまでで17文字のパスワードとなりました。基本パスワードが複雑であるならば、これで、そこそこの強度があると思います。

    最後に、パスワードに記号を求められる場合もあるので、それについて述べます。

    ここまでパスワードを作ったならば、一番最後尾に、記号をつけるようにします。

    googpass1234some1!

    記号まで入れたら18文字となります。

    ■ まとめ

    上記の方法により、最初の4要件は満たせるようになったと思います

    ポイントは、1.基本パスワードを複雑にすること、2.接頭語を付加してユニークさを創出すること、3.接尾語を付加して、複数アカウントに対応すること。4.最後に、オプションをつけて柔軟に対応すること。

    このように、自分なりのルールでパスワードを作成・管理すると、色々と捗ると思います。

    なお、以上の記述はある意味で理想論であり、実際には、難しいこともあると思います。本来、パスワードは長ければ長いほど良いのですが、サイトによっては、逆に、文字数が少なめに制限されている場合もあります。

    そうした現実を踏まえると、上記方法により、8文字前後に収まるようにすると、だいたいのサービスで使えるようになると思います。

    (注意)当記事の記述は、本当にセキュアかどうかは不明なので、参考は自己責任でお願いします。

    もっと良い方法があるという場合には、コメントいただけるとありがたいです。

    以上です。

  • UN Start ourtiur hrgufosterについて

    UN Start ourtiur hrgufoster についての覚書です。

    (まず、お断りですが、この記事の記述は私の推測であり間違っている可能性があります。ご自身の判断で、あくまでも参考程度にしてください。また、何の保証も当サイトではいたしません。)

    2014/06/08に、インターネット・エクスプローラー(ie)でネットを見ていると、UN Start ourtiur hrgufosterなるサイトに飛ばされました。

    少し詳しく状況を説明すると、あるページを見ようとすると、MSE(マイクロソフト・セキュリティ・エッセンシャル)が、「脅威を取り除いています」なる警告を出し、その後、UN Start ourtiur hrgufosterなるサイトに飛ばされました。
    (追記:正確には、飛ばされた後に警告が出たのだと思う。)

    この症状は、XSSに似ており、あくまでも推測ですが、見ようとしたWEBサイトの第三者配信の広告やプラグインなどが、ウイルスに感染したことにより又は不具合により、リダイレクトが生じて、このUN Start ourtiur hrgufosterに飛ばすように仕込まれたのではないかと思います。

    自分の場合、MSEが警告をだし、「脅威を取り除いた」とのことなので、心配なさそうですが、セキュリティソフトを入れていない場合には、セキュリティソフトを導入してウイルス等のスキャンをしたほうが良さそうです。

    念のため、自分もMSEでスキャンしましたが、感染はなさそうでした。

    また、気になる方は、ブラウザをieとは別のFireFoxやChromeなどに暫く変えてみるのもよいのではないかと思います。

    なお、不用意にUN Start ourtiur hrgufosterのサイトにアクセスしないよう注意してください。そのため当該URLはここでは掲載していません。

    【追記】

    この件につき調べてみると、最初に見ようとしたWEBページで、特定のJavaScriptを読み込んだことにより、当該URLに飛ばされる仕組みのようです。多分いわゆるXSSなのだと思う。

    【読み込んだJavaScript】
    http://pre******.com/ka****/slipp***/dimm***/sanctimoni***.js

    一部伏字にしてますが、これらのJavaScriptを読み込んでしまうと、GETメソッドにより、パラメータ付きで、当該URLに飛ばされてしまう。

    【飛ばされた先のページ】

    飛ばされたURLのページでは、Javaアプレットか何かJavaが起動し、何らかのプログラムが実行された可能性があります。

    もし、セキュリティソフトを導入しておらず、なんの警告もなかった場合には、何か実行された可能性があるので、早めにセキュリティソフトなりでチェックをした方がよいと思います。

    また、このページでは、入力フォームのようなものが表示されるので、何かフィッシング系のサイトなのかもしれません。

    あるいは、このフォームを利用して、どこか別のURLにGETメソッドなりPOSTメソッドなりで何かをフォーム投稿させるのが目的なのかも。これは、いわゆるCSRF(クロス・サイト・リクエスト・フォージェリ)という脆弱性リスクです。

    なお、このJavaScriptが仕込まれたホームページには、暫くアクセスしない方が賢明だと思います。いまだに飛ばされることがあります。

    何事もなければそれに越したことはないのですが、一応、注意が必要です。

    ちなみに、XSSなど、WEBアプリのセキュリティについては下記の本が一番詳しいのでご参考まで。

     

    以上です。