PHP」カテゴリーアーカイブ

PHP 暗号化、複合化

ここではPHPの暗号化、複合化について解説していきます。
データベースに暗号化のパスワードを保存しておき複合化で暗号化した前の状態に複合化させます。

<?php

    /** 暗号キー **/
    define('KEY', 'kbkb kja  ihkhb gtev555yihj8sj gdigyjeu 8nkfd');
    define('IV', '9Aih3ysn0Ty5po90i7M3xUqXwlhs2g6VGJ8LAEjita5=');

    /**
     * 暗号化
     * @param type $data
     * @return string
     */
    function getEncrypt($data) {
        $resource = mcrypt_module_open('rijndael-256', '', 'ofb', '');
        $iv = substr(base64_decode(str_rot13(IV)), 0, mcrypt_enc_get_iv_size($resource));
        $ks = mcrypt_enc_get_key_size($resource);
        $key = substr(md5(KEY), 0, $ks);
        mcrypt_generic_init($resource, $key, $iv);
        $encrypt = mcrypt_generic($resource, $data);
        mcrypt_generic_deinit($resource);
        mcrypt_module_close($resource);
        return base64_encode($encrypt);
    }

    /**
     * 複合化
     * @param type $data
     * @return string
     */
    function getDecrypt($data) {
        $resource = mcrypt_module_open('rijndael-256', '', 'ofb', '');
        $iv = substr(base64_decode(str_rot13(IV)), 0, mcrypt_enc_get_iv_size($resource));
        $ks = mcrypt_enc_get_key_size($resource);
        $key = substr(md5(KEY), 0, $ks);
        mcrypt_generic_init($resource, $key, $iv);
        $decrypt = mdecrypt_generic($resource, base64_decode($data));
        mcrypt_generic_deinit($resource);
        mcrypt_module_close($resource);
        return $decrypt;
    }

解説
KEYとIVを定数として定義して変更しなければ常に同じ暗号化、複合化ができます。
パスワードを変更する仕様がきたときにどうぞ。

画像カウンター作って見た

ここでは画像を使ったカウンターの解説をしていきます。

counter

画像のファイル名を0.1.2.3・・・として拡張子を合わせればどの画像でも大丈夫です。

phpソースコード

<?php

    // 重複 true / false ・ 重複させる / 重複させない
    $duplicationFlg = false;
    // テキストファイルパス
    $counterTxt = 'counter.txt';
    // カウンター桁数
    $counterLngth = 6;
    // ipアドレス配列
    $arrIp = array();
    // ipアドレスを数値に変換
    $remoteAdddr = ip2long($_SERVER["REMOTE_ADDR"]);

    // 読み込み
    $fp = fopen($counterTxt, 'r+');
    if ($fp) {
        if (flock($fp, LOCK_EX)) {
            $line = explode(',', fgets($fp));
        }
        else {
            echo "Eroor";
        }
    }
    ftruncate($fp, 0);
    fseek($fp, 0);
    $date = $line[0];
    $cnt = $line[1];

    if ($date == date('Y-m-d')) {
        for ($i = 2; $i < count($line); $i++) {
            $arrIp[] = $line[$i];
        }
    }

    if (empty($arrIp[0])) {
        $arrIp[] = $remoteAdddr;
        $cnt++;
    }
    else {
        foreach ($arrIp as $val) {
            if ($remoteAdddr == $val) {
                $flg = false;
                break;
            }
            else {
                $flg = true;
            }
        }
        if ($flg) {
            $arrIp[] = $remoteAdddr;
            $cnt++;
        }
    }

    // 書き込み
    if ($fp) {
        $ip = implode(',', $arrIp);
        if ($duplicationFlg) {
            fwrite($fp, date('Y-m-d').','.$cnt);
        }
        else {
            fwrite($fp, date('Y-m-d').','.$cnt.','.$ip);
        }
        flock($fp, LOCK_UN);
        fclose($fp);
    }

    $n = sprintf("%0".$counterLngth."d", $cnt);
    if (strlen($n) <= $counterLngth) {
        for ($i = 0; $i < strlen($n); $i++) {
            echo "<img src='img/".substr($n, $i, 1).".gif' />";
        }
    }
    else {
        for ($i = 0; $i < $counterLngth; $i++) {
            echo "<img src='img/9.gif' />";
        }
    }

counter.txt

日付、カウント、ipアドレスを記録しておくファイルcounter.txtを作成します。
(パーミッション読み書き可能にしてください)

counter.txtには最初
2013-07-10,0
と記述して下さい。

コンマの左、日付は自動で拾って上書きされるので2013-01-01の形式で大丈夫です。
コンマの右、カウントです。この数値からカウントが始まります。

解説

$duplicationFlg = false;(4行目)
trueなら重複してカウントします。
falseなら日付で区切りipアドレスを元に重複をはじきます。

$counterTxt = ‘counter.txt’;(6行目)
counter.txtを作成した場所を記述して下さい。
counter.txtは読み書き可能なパーミッションに変更してください。(666)など

$counterLngth = 6;(8行目)
カウンターの桁数を設定してください。
カウンターを表示する際0詰めで表示されます。

ftruncate($fp, 0);(24行目)
ファイルの上書きをするので、上書き前のデータを削除します。
ファイルサイズを0バイトにしています。

fseek($fp, 0);(25行目)
ファイルの書き込み位置を最初にしています。

echo “<img src=’img/”.substr($n, $i, 1) . “.gif’>”;(71行目と76行目)
カウンター画像を設置した場所、画像の拡張子を指定してください。

PHP IMAP メール解析

ここではPHP、IMAPを使ったメール解析をまとめています。

<?php

    // 言語
    mb_language('Japanese');
    // 文字コード
    mb_internal_encoding('utf-8');

    $mailNum = 1;

    $mbox = imap_open("{pop3.exsample.com:143}INBOX", "mail@address.com", "password") or die('cannot open');
    // メッセージヘッダ取得
    $header = imap_headerinfo($mbox, $mailNum);
    $body = imap_body($mbox, $mailNum, FT_INTERNAL);
    $mailData = array(
        "date" => date("Y-m-d H:i:s", strtotime($header->date)),
        "to" => $header->toaddress,
        "cc" => $header->ccaddress,
        "from" => $header->fromaddress,
        "subject" => mb_convert_encoding($header->subject, 'utf-8', 'auto'),
        "body" => mb_convert_encoding($body, 'utf-8', 'auto'),
    );

    imap_close($mbox);

    echo $mailData["date"]."<br/><br/>";
    echo $mailData["to"]."<br/><br/>";
    echo $mailData["cc"]."<br/><br/>";
    echo $mailData["from"]."<br/><br/>";
    echo $mailData["subject"]."<br/><br/>";
    echo nl2br($mailData['body']);

ソースコードはUTF-8で書いています。

imap_open(・・・);
Manualより
imap_open ( string $mailbox , string $username , string $password [, int $options = 0 [, int $n_retries = 0 [, array $params = NULL ]]] )

第一引数に受信サーバーとポート番号で指定してください。
第二引数にメールアドレス
第三引数にパスワードを設定してください。

例では$mailNumの変数に解析したいメールを指定しています。

SSL IMAP

imap_open("{pop3.exsample.com:993/imap/ssl}INBOX", "mail@address.com", "password");

例でSSL IMAPでの接続はこのようになります。
サーバーの環境に合わせて設定してください。

PHP ファイルのダウンロードダイアログを出す

ここではPHPでExcelファイルやPDFファイルなどをダウンロードさせる方法について解説していきます。

phpfile

サンプルソース

<?php

    $file = 'fileName.pdf';
    $fileSize = filesize($file);
    header("Content-Disposition: attachment; filename={$file}");
    header("Content-Length:{$fileSize}");
    header("Content-Type: application/octet-stream");
    readfile($file);

解説

header(“Content-Disposition: attachment; filename={$file}”); (5行目)
Content-Dispositionでダウンロードさせるファイル名を指定します。

header(“Content-Length:{$fileSize}”); (6行目)
Content-Lengthでダウンロードさせるファイルのサイズを指定します。

header(“Content-Type: application/octet-stream”); (7行目)
Content-Typeでapplication/octet-streamを指定します。

readfile($file); (8行目)
ファイルからデータを読み取ります。

こうする事でユーザーにファイルをダウンロードさせることができます。

PHP 画像合成

ここではPHPで画像を合成する方法について解説していきます。

サンプルソース

<?php
  
    // 画像作成
    $dst_im = imagecreatetruecolor(200, 200);
    // 塗りつぶし
    $color = imagecolorallocate($dst_im, 'ffffff');
    imagefill($dst_im, 0, 0, $color);
    // 合成する画像1枚目を取得
    $src_im = imagecreatefrompng('img1.png');
    // 画像に貼り付け
    imagecopy($dst_im, $src_im, 0, 0, 0, 0, 100, 100);
    imagedestroy($src_im);
    // 合成する画像2枚目を取得
    $src_im = imagecreatefrompng('img2.png');
    // 出力先の画像に貼り付け 横100、縦0の位置
    imagecopy($dst_im, $src_im, 100, 0, 0, 0, 100, 100);
    imagedestroy($src_im);
    // 合成する画像3枚目を取得
    $src_im = imagecreatefrompng('img3.png');
    // 出力先の画像に貼り付け 横0、縦200の位置
    imagecopy($dst_im, $src_im, 0, 200, 0, 0, 100, 100);
    imagedestroy($src_im);
    // ファイルの保存
    imagepng($dst_im, 'output.png');
    // メモリ開放
    imagedestroy($dst_im);

解説

imagecreatetruecolor(200, 200); (4行目)
width200、height200で出力用に画像を用意します。

imagefill($dst_im, 0, 0, $color); (7行目)
画像の塗りつぶしです、ここでは白色で塗りつぶしています。

imagecreatefrompng(‘img1.png’); (9、14、19行目)
合成する画像を取得しています。
今回はpngで解説していますが、
jpegならimagecreatefromjpeg()
gifならimagecreatefromgif()とかもあります。

imagecopy(…) (11、16、21行目)

Manualより
imagecopy($dst_im, $src_im, $dst_x, $dst_y, $src_x, $src_y, $src_w, $src_h);

dst_im
出力する画像リソース
src_im
コピーする画像リソース
dst_x
コピー先の x 座標(横)
dst_y
コピー先の y 座標(縦)
src_x
コピー元の x 座標(横)
src_y
コピー元の y 座標(縦)
src_w
コピー元の幅
src_h
コピー元の高さ

これで貼り付け位置をずらしながら画像を合成していきます。

imagepng($dst_im, ‘output.png’); (24行目)
png画像の保存をします。
jpegならimagejpeg()
gifならimagegif()などがあります。

imagedestroy($dst_im);
メモリの開放
たくさん画像を生成するとメモリリークに陥ってしまうので適度にコールしてください。