「ChatGPTはどこまで仕事に使えるの?」
「ChatGPTを使ってプログラミングを効率化したい」
このような場合には、この記事の内容が参考になります。
この記事では、ChatGPTを利用したプログラミングについて説明しています。
本記事の内容
- ChatGPTとの会話
- ChatGPTを利用して開発した成果物
- ChatGPTを利用したプログラム開発のまとめ
それでは、上記に沿って解説していきます。
ChatGPTとの会話
PHPをサーバサイドに利用して、問い合わせフォームを作りたい。
PHPを使って問い合わせフォームを作ることはできますよ。
まず、フォームを作るにあたり、HTMLを使ってフォームを作成します。
フォームには、名前、メールアドレス、問い合わせ内容などを入力するためのテキストボックスやテキストエリア、送信ボタンなどが含まれます。
次に、フォームから送信されたデータをPHPで受け取ります。
PHPでは、$_POSTや$_GETというスーパーグローバル変数を使って、フォームから送信されたデータを受け取ることができます。
最後に、受け取ったデータを使って、データベースに保存する処理や、メールを送信する処理などを実装することで、問い合わせフォームの機能を完成させることができます。
以上が、PHPを使って問い合わせフォームを作る一般的な流れです。
詳しい実装方法については、より詳しくお伺いしましょうか?
はい
問い合わせフォームを作るにあたり、まずはHTMLでフォームを作成します。
以下に、基本的なフォームの例を示します。
<form action="send.php" method="post"> <label for="name">名前:</label><br> <input type="text" id="name" name="name"><br> <label for="email">メールアドレス:</label><br> <input type="text" id="email" name="email"><br> <label for="message">問い合わせ内容:</label><br> <textarea id="message" name="message"></textarea><br> <input type="submit" value="送信"> </form>
このフォームでは、名前、メールアドレス、問い合わせ内容を入力するテキストボックスやテキストエリアがあります。
また、送信ボタンもあります。
次に、フォームから送信されたデータをPHPで受け取る方法を説明します。
フォームで送信されるデータは、HTTPリクエストのボディに含まれて送信されます。
そのため、PHPでは、$_POSTや$_GETというスーパーグローバル変数を使って、フォームから送信されたデータを受け取ることができます。
具体的には、以下のようにして、$_POST変数を使ってフォームから送信されたデータを受け取ることができます。
$name = $_POST['name']; $email = $_POST['email']; $message = $_POST['message'];
このようにして、フォームから送信されたデータをPHPで受け取ることができます。
最後に、受け取ったデータを使って、データベースに保存する処理や、メールを送信する処理などを実装します。
例えば、データベースに保存する場合は、データベースに接続して、INSERT文を実行することで、データを保存することができます。
また、メールを送信する場合は、PHPで標準的に用いられるmail関数を使用することができます。
mail関数の第一引数には、送信先のメールアドレスを指定します。
第二引数には、件名を指定します。
第三引数には、本文を指定します。
以下に、mail関数を使って、問い合わせフォームから送信された内容を送信する例を示します。
$to = "example@example.com"; $subject = "問い合わせフォームからのお問い合わせ"; $body = "名前: $name\nメールアドレス: $email\n問い合わせ内容: $message"; if (mail($to, $subject, $body)) { echo "送信に成功しました"; } else { echo "送信に失敗しました"; }
このようにして、問い合わせフォームから送信された内容をメールで送信することができます。
以上が、PHPを使って問い合わせフォームを作る方法についての説明でした。
これで問い合わせフォームを作ることができると思います。
もし、詳しい実装方法や、その他の質問があれば、お気軽にお問い合わせください。
セキュリティ対策は大丈夫ですか?
問い合わせフォームを作る上で、セキュリティ対策はとても重要です。
具体的には、以下のような対策をすることが望ましいです。
- HTTPSを使用する
- フォームデータをサニタイズする
- フォームデータを検証する
- CSRF対策をする
1.HTTPSを使用する
フォームを使ったデータの送信を行う場合、通信を暗号化することが望ましいです。
そのためには、通信に HTTPS を使用することが推奨されます。
HTTPSを使用するには、サイトにSSL証明書をインストールする必要があります。
SSL証明書を取得するには、サイトを運営する会社や団体の情報を登録し、証明書を発行するCA(Certificate Authority)から証明書を取得する必要があります。
2.フォームデータをサニタイズする
ユーザーからのフォームデータは、悪意のある攻撃者からの攻撃を受けやすいです。
そのため、フォームデータをサニタイズすることが重要です。
サニタイズとは、悪意のあるスクリプトやタグを含む不正なデータを、安全なデータに変換することを指します。
PHPでは、htmlspecialchars関数やstrip_tags関数を使って、フォームデータをサニタイズすることができます。
3.フォームデータを検証する
フォームデータをサニタイズするだけでは、不正なデータをすべて除去することはできません。
そのため、フォームデータを検証することが重要です。
フォームデータを検証するには、入力されたデータが適切であるかどうかを検証する必要があります。
具体的には、以下のような検証を行うことが望ましいです。
- 必須項目が入力されているかどうか
- 入力された文字列が、期待される形式であるかどうか(例えば、メールアドレスの形式が正しいかどうか)
- 入力された値が、期待される範囲内であるかどうか(例えば、数字が期待される項目に文字列が入力されていないかどうか)
検証を行うには、if文や正規表現を使用することができます。
4.CSRF対策をする
CSRF(Cross-Site Request Forgery)とは、攻撃者が、ユーザーがアクセスしているサイトに対して、不正なリクエストを送信させる攻撃のことを指します。
CSRF対策をするには、フォームにトークンを含めることが有効です。
トークンとは、一時的なランダムな文字列のことです。
フォームを送信するときに、トークンを送信することで、不正なリクエストからサイトを保護することができます。
以上が、問い合わせフォームを作る上でのセキュリティ対策についての説明です。
フォームを作る際は、これらの対策を必ず行うようにしましょう。
セキュリティ対策を行ったサンプルコードを書いてください。
お手数をおかけしますが、ご要望をお知らせいただいた通り、
セキュリティ対策を行った問い合わせフォームのサンプルコードを書いてみました。
<?php // フォームが送信されたときの処理 if ($_SERVER['REQUEST_METHOD'] === 'POST') { // CSRF対策: トークンを検証する if (!isset($_POST['token']) || $_POST['token'] !== $_SESSION['token']) { // トークンが無い、または、一致しない場合は、エラーを表示して処理を中止する echo "不正なリクエストです"; exit; } // フォームデータを取得する $name = $_POST['name']; $email = $_POST['email']; $message = $_POST['message']; // フォームデータをサニタイズする $name = htmlspecialchars($name, ENT_QUOTES, 'UTF-8'); $email = htmlspecialchars($email, ENT_QUOTES, 'UTF-8'); $message = htmlspecialchars($message, ENT_QUOTES, 'UTF-8'); // フォームデータを検証する if ($name === '') { // 名前が未入力の場合は、エラーメッセージを表示する echo "名前を入力してください"; exit; } if ($email === '') { // メールアドレスが未入力の場合は、エラーメッセージを表示する echo "メールアドレスを入力してください"; exit; } if (!preg_match('/^[0-9a-z_.\/?-]+@([0-9a-z-]+\.)+[0-9a-z-]+$/', $email)) { // メールアドレスの形式が不正の場合は、エラーメッセージを表示する echo "メールアドレスの形式が不正です"; exit; } if ($message === '') { // 問い合わせ内容が未入力の場合は、エラーメッセージを表示する echo "問い合わせ内容を入力してください"; exit; } // メールを送信する $to = "example@example.com"; $subject = "問い合わせフォームからのお問い合わせ"; $body = "名前: $name\nメールアドレス: $email\n問い合わせ内容: $message"; if (mail($to, $subject, $body)) { // 送信に成功した場合は、送信完了ページを表示する include "complete.html"; } else { // 送信に失敗した場合は、エラーメッセージを表示する echo "送信に失敗しました"; } }
上記で紹介したサンプルコードを使用することで、
セキュリティ対策を行った問い合わせフォームを作ることができると思います。
追加でわからないことや、サンプルコードでは対応できないような場合は、お気軽にご質問ください。
問い合わせのhtmlタグをすべて載せてください。
ご要望をお知らせいただいた通り、問い合わせのHTMLタグをすべて載せることを試みます。
以下に、問い合わせのHTMLタグのサンプルを掲載します。
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>問い合わせ</title> </head> <body> <h1>問い合わせ</h1> <form method="post" action=""> <label for="name">名前:</label><br> <input type="text" name="name" id="name"><br> <label for="email">メールアドレス:</label><br> <input type="text" name="email" id="email"><br> <label for="message">問い合わせ内容:</label><br> <textarea name="message" id="message"></textarea><br> <input type="hidden" name="token" value="<?= h($_SESSION['token']) ?>"> <input type="submit" value="送信"> </form> </body> </html>
上記のように、HTMLのフォームタグを使用することで、問い合わせフォームを作ることができます。
さらに、サンプルコードでは、CSRF対策を行うために、セッションを使用しています。
セッションを使うためには、セッションを開始する必要があります。
session_start();
また、HTMLをエスケープする関数も準備することをお忘れなく
// HTMLをエスケープする関数 function h($str) { return htmlspecialchars($str, ENT_QUOTES, 'UTF-8');
CSRF対策におけるトークンの検証は、値の存在チェックだけでよいのですか?
CSRF対策においては、トークンの値だけでなく、生成時刻も検証することが一般的です。
値の存在チェックだけでは、トークンを再利用される可能性があります。
また、トークンが生成されてから長期間経過している場合も、
セッションハイジャックなどの攻撃を受ける可能性があります。
そのため、トークンの検証には、以下のような流れが一般的です。
- リクエストパラメータからトークンを取得する
- セッションからトークンを取得する
- リクエストパラメータのトークンとセッションのトークンが一致するかどうかを検証する
- 一致している場合、トークンを生成した時刻から経過した時間が許容範囲内かどうかを検証する
具体的なコードを以下に示します。
// リクエストパラメータからトークンを取得する $request_token = $_POST['token']; // セッションからトークンを取得する $session_token = $_SESSION['token']; // リクエストパラメータのトークンとセッションのトークンが一致するかどうかを検証する if ($request_token !== $session_token) { // トークンが不正の場合の処理を行う exit; } // 一致している場合、トークンを生成した時刻から経過した時間が許容範囲内かどうかを検証する $now = time(); $diff = $now - $_SESSION['token_time']; if ($diff > 3600) { // トークンが期限切れの場合の処理を行う exit; } // ここまで到達した場合、トークンは有効であると判定できる
上記のようにして、トークンの検証を行うことで、CSRF対策を実装することができます。
なお、このようなトークンの検証に加えて、不正なリクエストを防ぐため
続き
ご要望をお知らせいただいた通り、CSRF対策について詳しく説明します。
CSRF対策には、トークンを使用する方法があります。
トークンを使用する方法は、サイトにアクセスした際に、サーバ側でランダムな値を生成して、その値をセッションやクッキーに保存します。
そして、その値をHTMLフォーム内に埋め込んで送信することで、不正なリクエストを防ぐことができます。
トークンを使用する方法の一例を以下に示します。
<?php // セッションを開始する session_start(); // トークンを生成する $_SESSION['token'] = bin2hex(random_bytes(32)); // トークンを生成した時刻を記録する $_SESSION['token_time'] = time(); ?> <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>問い合わせ</title> </head> <body> <h1>問い合わせ</h1> <form method="post" action=""> <label for="name">名前:</label><br> <input type="text" name="name" id="name"><br> <label for="email">メールアドレス:</label><br> <input type="text" name="email" id="email"><br> <label for="message">問い合わせ内容:</label><br> <textarea name="message" id="message"></textarea><br> <input type="hidden" name="token" value="<?= h($_SESSION['token']) ?>"> <input type="submit" value="送信"> </form> </body> </html>
ChatGPTを利用して開発した成果物
ChatGPTとの会話をもとに開発した成果物を載せておきます。
ファイルは以下の2ファイルです。
- index.php
- send.php
以下でそれぞれを確認します。
index.php
<?php // セッションを開始する session_start(); // トークンを生成する $_SESSION['token'] = bin2hex(random_bytes(32)); // トークンを生成した時刻を記録する $_SESSION['token_time'] = time(); // HTMLをエスケープする関数 function h($str) { return htmlspecialchars($str, ENT_QUOTES, 'UTF-8'); } ?> <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>問い合わせ</title> </head> <body> <h1>問い合わせ</h1> <form action="send.php" method="post"> <label for="name">名前:</label><br> <input type="text" name="name" id="name"><br> <label for="email">メールアドレス:</label><br> <input type="text" name="email" id="email"><br> <label for="message">問い合わせ内容:</label><br> <textarea name="message" id="message"></textarea><br> <input type="hidden" name="token" value="<?= h($_SESSION['token']) ?>"> <input type="submit" value="送信"> </form> </body> </html>
ChatGPTが提案したコードをそのまま利用しています。
send.php
<?php // セッションを開始する session_start(); // フォームが送信されたときの処理 if ($_SERVER['REQUEST_METHOD'] === 'POST') { // CSRF対策: トークンを検証する if (!isset($_POST['token']) || $_POST['token'] !== $_SESSION['token']) { // トークンが無い、または、一致しない場合は、エラーを表示して処理を中止する echo "不正なリクエストです"; exit; } else { // 一致している場合、トークンを生成した時刻から経過した時間が許容範囲内かどうかを検証する $now = time(); $diff = $now - $_SESSION['token_time']; if ($diff > 3600) { // トークンが期限切れの場合の処理を行う echo "トークンの期限が切れています"; exit; } } // フォームデータを取得する $name = $_POST['name']; $email = $_POST['email']; $message = $_POST['message']; // フォームデータをサニタイズする $name = htmlspecialchars($name, ENT_QUOTES, 'UTF-8'); $email = htmlspecialchars($email, ENT_QUOTES, 'UTF-8'); $message = htmlspecialchars($message, ENT_QUOTES, 'UTF-8'); // フォームデータを検証する if ($name === '') { // 名前が未入力の場合は、エラーメッセージを表示する echo "名前を入力してください"; exit; } if ($email === '') { // メールアドレスが未入力の場合は、エラーメッセージを表示する echo "メールアドレスを入力してください"; exit; } if (!preg_match('/^[0-9a-z_.\/?-]+@([0-9a-z-]+\.)+[0-9a-z-]+$/', $email)) { // メールアドレスの形式が不正の場合は、エラーメッセージを表示する echo "メールアドレスの形式が不正です"; exit; } if ($message === '') { // 問い合わせ内容が未入力の場合は、エラーメッセージを表示する echo "問い合わせ内容を入力してください"; exit; } // メールを送信する $to = "example@example.com"; $subject = "問い合わせフォームからのお問い合わせ"; $body = "名前: $name\nメールアドレス: $email\n問い合わせ内容: $message"; if (mail($to, $subject, $body)) { // 送信に成功した場合は、送信完了ページを表示する include "complete.html"; } else { // 送信に失敗した場合は、エラーメッセージを表示する echo "送信に失敗しました"; } } ?>
こちらは、若干手を加えています。
セッションの開始が、ChatGPTのコードでは抜けていました。
// セッションを開始する session_start();
トークンの妥当性チェックを加えています。
} else { // 一致している場合、トークンを生成した時刻から経過した時間が許容範囲内かどうかを検証する $now = time(); $diff = $now - $_SESSION['token_time']; if ($diff > 3600) { // トークンが期限切れの場合の処理を行う echo "トークンの期限が切れています"; exit; } }
ChatGPTを利用したプログラム開発
率直な意見から言うと、「ChatGPT 半端ないって」の一言です。
しかし、完全にChatGPTに任せることはできません。
あくまで、人間がChatGPTを利用するということが前提です。
完全に任せると質の低いプログラムを作って終わりの可能性がありました。
今回の件で言うと、セキュリティの低いプログラムが出来上がっていた可能性があります。
基本的には、ChatGPTに依頼・指示しています。
その出力に対して、疑問や懸念があれば突っ込むという形を取りました。
今回であれば、次の質問です。
- セキュリティ対策は大丈夫ですか?
- CSRF対策におけるトークンの検証は、値の存在チェックだけでよいのですか?
突っ込みを入れると、ChatGPTは軌道修正してくれました。
この柔軟性が、「ChatGPT 半端ないって」と感じるのです。
知識があることが前提としても、このことは人間だとなかなか難しいところがあります。
人間だとプライドや感情が邪魔したりして、すぐに軌道修正ができないことがありえます。
その点、ChatGPTには感情はありません。
こちらも遠慮無く、どんどんと突っ込みができます。
もちろん、知識が半端ないレベルであるのがそもそもスゴイのですけどね。
ここまで褒めて言うのもなんですが、私なら問い合わせフォームはこんな形で作りません。
Ajaxを使って非同期通信で行います。
入力チェックは、クライアント側のJavaScriptでも行います。
でも、これもこちらが適切に誘導すれば、ChatGPTは上手くコーディングするとは思いますけどね。
結局は、ChatGPTを使う側のスキルや知識が重要だと思います。