【PHP】PDOでMySQLに接続する際、必ず例外処理(try,catch)を行う
PDO(PHP Data Object)でMySQLに接続・処理を行う際、必ず例外処理を行わなければなりません。
ここではその理由と方法についてまとめています。
PDOでMySQLに接続
私はこれまで、次のようにPDOを利用してMySQLに接続していました。
<?php //PDOオブジェクトの作成 $pdo = new PDO("mysql:host=MySQLサーバのホスト名;dbname=データベース名;charset=utf8;", "データベース接続のID", "データベース接続のパスワード"); //SQLの準備 $st = $pdo->prepare("INSERT INTO テーブル名 VALUES(?, ?, ?)"); //SQLの発行 $st->execute(array("001", "佐藤", "男性")); ?>
エラーが起きたら接続情報が丸見え
しかしあるとき、さくらインターネットでPHPのバージョン?仕様?が変更され、次のようなエラーが起きていることに気づきました。
Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[HY000] [2000] mysqlnd cannot connect to MySQL 4.1+ using the old insecure authentication. Please use an administration tool to reset your password with the command SET PASSWORD = PASSWORD('your_existing_password'). This will store a new, and more secure, hash value in mysql.user. If this user is used in other scripts executed by PHP 5.2 or earlier you might need to remove the old-passwords flag from your my.cnf file' in /home/○○○/www/○○○/○○○.php:187 Stack trace: #0 /home/○○○/www/○○○/○○○.php(187): PDO->__construct('mysql:host=○○○', '○○○', '○○○') #1 {main} thrown in /home/○○○/www/○○○/○○○.php on line 187
最初は「何もいじっていないのにエラーが起きてて面倒くさいな・・・」って感じだったのですが、よく見ると私が利用しているMySQLのホスト名とユーザー名、パスワードがモロ見えであることに気づきました。
つまり、これを悪意ある第三者に見られてメモされていた場合、何かしらの攻撃や情報を取得される恐れがあったのです。
例外処理を設定しなければならなかった
どうなってんだ・・・と愕然としてPDOについて勉強し直したのですが、ただ単純に私が無知なだけでした。
というのも、PDOでMySQLに接続する際、必ず例外処理をしなければなりませんでした。
例外処理の方法
例外処理の方法ですが、PDOでエラーが起きた場合、PDOExceptionが投げられます。
なので次のようにtry,catchでそのエラーをキャッチすれば、接続情報のモロ出しを防げます。
<?php //例外処理 try { //PDOオブジェクトの作成 $pdo = new PDO("mysql:host=MySQLサーバのホスト名;dbname=データベース名;charset=utf8;", "データベース接続のID", "データベース接続のパスワード"); //SQLの準備 $st = $pdo->prepare("INSERT INTO テーブル名 VALUES(?, ?, ?)"); //SQLの発行 $st->execute(array("001", "佐藤", "男性")); }catch(PDOException $e){ //エラー出力 echo "データベースエラー(PDOエラー)"; //var_dump($e->getMessage()); //エラーの詳細を調べる場合、コメントアウトを外す } ?>
エラー文
ちなみに(上記エラーメッセージのコメントアウトを外した場合、)例外処理を記述していると、同じエラーでも、次のようにエラー説明文が出力されるだけで、データベース接続情報などは表示されなくなります。
SQLSTATE[HY000] [2000] mysqlnd cannot connect to MySQL 4.1+ using the old insecure authentication. Please use an administration tool to reset your password with the command SET PASSWORD = PASSWORD('your_existing_password'). This will store a new, and more secure, hash value in mysql.user. If this user is used in other scripts executed by PHP 5.2 or earlier you might need to remove the old-passwords flag from your my.cnf file
あわせて読んでほしい!
1:tatu:2019/10/05 10:52:41
とても良い文で参考になりました。
頑張って下さい。