質問: null; } } } } catch (PDOException $e) { exit('データベース接続失敗。'.$e->getMessage()); die(); } die(); } ?> ``` PHPの経験が浅いのでコード間違いなどもあれば教えて欲しいです。 よろしくお願いします。
回答: SQLインジェクション対策としては申し分ないと思います(参考記事の方針とはかなり違うようですが、あまり参考になさらなかったのでしょうか?)が、以下のポイントがあります。 1) 例外を捕捉しよう 今のままですと、DB接続時以外の例外を捕捉しない状況です。例外はあり得ることですので、以下を追加すべきです。 ``` $pdo = new PDO('mysql:host=localhost; dbname=DB; charset=utf8','root','', array(PDO::ATTR_EMULATE_PREPARES => false, PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::MYSQL_ATTR_MULTI_STATEMENTS => false)); ``` 2) 複文を禁止するオプションを指定しよう 上記で、最後のオプション MYSQL_ATTR_MULTI_STATEMENTS は、PDOで「複文」を禁止するオプションです。詳しくは下記の記事を参照ください。 PDOに複文実行を禁止するオプションが追加されていた 3) チェックに引っかかった場合のエラー処理 現在のプログラムだと、if (チェック) ... の else節がないので、チェックでエラーになった場合は何もしない仕様ですが、エラー表示するとか、ログにエラーを書き込むなど処理をするべきでしょう。 4) エラー表示 エラーの内容を画面表示するのはそもそもよくありませんが、仮に表示するのであれば、XSS対策すべきです。このスクリプトではおそらく大丈夫ですが、状況によってはエラーメッセージ経由でのXSSとなります。 ``` exit('データベース接続失敗。'. htmlspecialchars($e->getMessage())); ```