【初学者向け】セキュリティ対策入門0〜環境構築編〜本記事の目標SQLインジェクションの概要、原因、対策について理解することです。以下の内容を終えていることです。【初学者向け】セキュリティ対策入門0〜環境構築編〜また、DB及びテーブルの作成ができることと、プログラミング言語を用いてDBにアクセスする処理の流れをおおまかに理解していることです。概要SQLインジェクションとは不正にSQL文を実行させることです。エンドユーザが入力した内容を元にSQLを実行するようなWebアプリケーション全般で行われる可能性があります。これだけだとわかりにくいと思いますので実際に見てみましょう。【初学者向け】セキュリティ対策入門0〜環境構築編〜投稿時から本記事投稿の間にリポジトリを更新しているので、以下コマンドを参考にローカルリポジトリを更新しておいてください。masterまた、docker-compose.ymlも更新されているのでDockerコンテナ起動時は以下のように--buildを付与して起動を行ってください。今回はDBを使うので、そのあたりの準備を行っていきます。http://localhost:8888にアクセスしてログインしましょう。testという名前のDBを作りましょう。次に以下のようなuserテーブルを作成しましょう。ブラウザアクセスhttp://localhost:8080/sql_injection/bad.php?name=j&address=kanagawaにアクセスしてみましょう。『データが作成されました。』と表示されたら成功です。phpMyAdminを見てみるとレコードが1件追加されていることが確認できると思います。ソースコードはtutorial-php-security/www/html/sql_injection/bad.phpにあります。'データが作成されました。$e->getMessage();}userテーブルにレコードを挿入する処理が記載されています。user;--にアクセスしてみましょう。phpMyAdminを見てみるとレコードが削除されてしまっていることが確認できると思います。何が起きているか確認するために上記パラメータで生成されるSQL文を解説します。user;--')というSQL文が作られます。わかりやすいように改行も入れます。user;--')ここまで整理すればuserテーブルのレコードが削除されてしまった理由がわかると思います。DELETE文が実行されてしまっているわけです。SQLインジェクションの恐ろしさが伝わりましたでしょうか?userテーブルが、とあるWebサービスの会員情報を保持しているものだとしたら会員情報が全て消えてしまいます。大きなサービスでこんなことが起きれば新聞に載ります。原因SQLエスケープをしていないことです。原因がシンプルですね。対策SQLエスケープを行うことです。具体的に確認していきましょう。user;--にアクセスしてみましょう。今度はレコードが挿入されたことが確認できたと思います。user;--という文字列が入っています。DELETE文が実行されていないわけです。good.phpではある処理を追加しています。それを次に確認しましょう。'データが作成されました。$e->getMessage();}DB接続について学習されている方にとっては見慣れた処理の流れになっているかと思いますが、bindValueメソッドを使っています。することでSQLエスケープを行うことができます。具体的に先ほどの例で実行されるSQLを確認します。以下のようなSQL文が構築されます。user;--')わかりやすいように改行を入れます。user;--')2行目の'が''になっているのがポイントです。SQLエスケープを行うことで実現される具体例な処理がこれです。''は単なる'という文字だと見なされ、SQL文の中で特別な意味を持って使われる'とは別ものと見なされます。user;--という単なる文字列としてaddressカラムに挿入されたというわけです。今回の内容は以上です。最後までご覧いただきありがとうございました。upLoginユーザーは見つかりませんでした。