【PHP】QRジェネレータライブラリを使って安全にQRコード生成

137views
自前のサーバーでQRコードを生成するのアイキャッチ画像

前回Google認証システムをPHPライブラリを使って自作しました。

この記事のまとめでも書いたのですが、このライブラリで出力できるQRコードのリンクにはシークレットコードが直接埋め込まれており、セキュリティ的な問題がありました。

今回はその問題解消のために、とりあえずQRコードを生成するプログラムを作っていこうと思います。

使うPHPライブラリ

PHPのバージョン管理ツールの「Composer」を使って、「endroid/qr-code」をインストールします。

Composer自体のダウンロードはこちらを参照してください。(参照:「Composer」のダウンロードドキュメント

endroid/qr-codeはGitHubにて公開されているライブラリです。(参照:「endroid/qr-code」のGitHub

GitHubにてQRコードを生成するプログラムが紹介されていますが、ここでも一応プログラムを載せます。

QRコードのimgソースを生成する

<?php //qr.php

require_once( __DIR__ . '/vendor/autoload.php' );

use Endroid\QrCode\Color\Color;
use Endroid\QrCode\Encoding\Encoding;
use Endroid\QrCode\ErrorCorrectionLevel\ErrorCorrectionLevelLow;
use Endroid\QrCode\QrCode;
use Endroid\QrCode\RoundBlockSizeMode\RoundBlockSizeModeMargin;
use Endroid\QrCode\Writer\PngWriter;

$data_string = "https://white-sesame.jp";

$qr_code = QrCode::create( $data_string )
    -> setEncoding( new Encoding( 'UTF-8' ) )
    -> setErrorCorrectionLevel( new ErrorCorrectionLevelLow() )
    -> setSize( 300 )
    -> setMargin( 30 )
    -> setRoundBlockSizeMode( new RoundBlockSizeModeMargin() )
    -> setForegroundColor( new Color( 0, 0, 0 ) )
    -> setBackgroundColor( new Color( 255, 255, 255 ) );

$writer = new PngWriter();
$result = $writer->write( $qr_code );

$img_src = $result->getDataUri();
?>

<!DOCTYPE html>
<html lang="ja">
  <head>
    <meta charset="UTF-8">
    <title>QRコード</title>
  </head>
  <body>
    <img src="<?php echo $img_src; ?>">
  </body>
</html>

$data_stringの変数に代入する文字列がQRコードになって生成されます。

QR生成を関数化

とても使いやすいライブラリなのですが、使い回ししやすいように関数化しようと思います。

HTMLのimgタグを出力するようにしようと思います。

上のコードをまとめただけですが、変数を隠せるメリットもあります。

<?php //get_qr_image.php
require_once( __DIR__ . '/vendor/autoload.php' );

use Endroid\QrCode\Color\Color;
use Endroid\QrCode\Encoding\Encoding;
use Endroid\QrCode\ErrorCorrectionLevel\ErrorCorrectionLevelLow;
use Endroid\QrCode\QrCode;
use Endroid\QrCode\RoundBlockSizeMode\RoundBlockSizeModeMargin;
use Endroid\QrCode\Writer\PngWriter;

function get_qr_image ( $uri )
{
  $qr_code = QrCode::create( $uri )
      -> setEncoding( new Encoding( 'UTF-8' ) )
      -> setErrorCorrectionLevel( new ErrorCorrectionLevelLow() )
      -> setSize( 300 )
      -> setMargin( 30 )
      -> setRoundBlockSizeMode( new RoundBlockSizeModeMargin() )
      -> setForegroundColor( new Color( 0, 0, 0 ) )
      -> setBackgroundColor( new Color( 255, 255, 255 ) );

  $writer = new PngWriter();
  $result = $writer->write( $qr_code );

  $img_src = $result->getDataUri();

  echo '<img src="' . $img_src . '" alt="' . $uri . '">';
}

これでこのファイルをインクルードするだけで関数が使えるようになりました。

まとめ

<?php

include_once( 'get_qr_image.php' );

echo get_qr_image( '田島シオン' );

田島シオン

できました。

カテゴリー