【PHP】ユニークで短いユーザーID生成にはhashidsが便利!

こんにちは、タカフです。

PHPでWeb開発ってなった時に、ユーザーIDを生成する処理って往々にしてあると思います。
その時にやってはいけないのが、MySQLのAutoIncrement等で生成された連番を使ってしまうこと!

あからさまにcookieとかGETパラメータとかに自分のIDが「15」って表示されていたら、ちょっとでも悪意あれば「16」にしてアクセスしたくなりますよね。(笑)
正しくセッション管理とか色々制御されていたとしても、非常に危険です。どこに脆弱性があるかわからないのですから。

そう、他人のユーザーIDを簡単に類推出来てしまうIDって決していいシステムとは言えないのです。

というわけで、「ユーザーIDは基本的にAutoIncrementの値はNG!もしくは類推できてしまうユーザーIDもNG!」と思っておきましょう。

で、じゃあ新しいユーザーをMySQL等のDBにINSERTする時に一緒にランダムな文字列を生成して一緒に入れときましょうって話になると思いますが、ユニークな文字列を生成する大抵の方法って

<?php
$userId = md5(uniqid(rand(),1));

とかになってしまい、短めのハッシュ関数のmd5ですら32文字になってしまい、色々と使い回しが悪くなるのです。

そんな時に、「Hashids」です。

https://hashids.org/php/

このライブラリを使うと、簡単に短いユニークIDを生成することが出来ます。
具体的にはSaltという秘密鍵的な文字列で数値を暗号化出来て、さらにそのSaltで復号化も出来るのです。

それでは使い方です。

hashidsのインストール方法

composerでインストールしちゃいましょう

bash
$ composer require hashids/hashids

hashidsの使い方です

sample.php
// composerでインストールしたHashidsを読み込み
require_once __DIR__ . "/vendor/autoload.php";
use Hashids\Hashids;

$salt = "ここに絶対に漏らしてはいけない文字列";

// saltと何文字のユニーク文字数にしたいかを引数で渡します。
$hashids = new Hashids($salt, 10);

// 例えばユーザーIDをencodeすると10文字のユニーク文字列になって返ってきます
$userId = 123456;
$hashid = $hashids->encode($userId);
echo $hashid . PHP_EOL; // mbamvdY84v

// decodeメソッドでエンコードした数値が返ります。
$numbers = $hashids->decode($hashid);
var_dump($numbers); // [123456]

// encodeメソッドには可変引数で複数の値を渡せます
$param  = 10;
$hashid = $hashids->encode($userId, $param);
echo $hashid . PHP_EOL; // 65BmRX3uw2

// もちろん復元可能です。
$numbers = $hashids->decode($hashid);
var_dump($numbers); // [123456, 10]

安全なシステム開発を目指しましょう~!
現場からは以上です。

1 COMMENT

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です