質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

2回答

2460閲覧

PHP、CSRF対策で文字化け

na3kick

総合スコア12

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2016/02/10 10:24

PHPの勉強で問い合わせフォームを作成しています。
こちらのCSRF対策のコードを書いて実行したら、文字化けしました。

// CSRF対策 if (!isset($_POST['token']) || $_POST['token'] !== getToken()) { exit('処理を正常に完了できませんでした'); }

それまでは正常に表示されていました。
原因は何でしょうか?
教えて下さい。
以下、長いですがコードです。

form.php

1<?php 2session_start(); 3 4if ($_SERVER['REQUEST_METHOD'] === "POST") { 5 6 // CSRF対策 7 if (!isset($_POST['token']) || $_POST['token'] !== getToken()) { 8 exit('処理を正常に完了できませんでした'); 9 } 10 11 // バリデーション 12 $inquiry = $_POST['inquiry']; 13 $name = $_POST['name']; 14 $email = $_POST['email']; 15 $error = array(); 16 17 if (empty($inquiry)) { 18 $error['inquiry'] = '必ずご記入下さい'; 19 } 20 21 if (empty($name)) { 22 $error['name'] = '必ずご記入下さい'; 23 } 24 25 if (!filter_var($email, FILTER_VALIDATE_EMAIL)) { 26 $error['email'] = 'メールアドレスの形式が正しくありません'; 27 } 28 29 // バリデーションエラーが無い場合お問い合わせを受付 30 if (empty($error)) { 31 32 header('Location: thanks.html'); 33 exit; 34 } 35} 36 37/** 38 * HTMLの特殊文字をエスケープして返す 39 */ 40function h($str) 41{ 42 return htmlspecialchars($str, ENT_QUOTES, 'UTF-8'); 43} 44 45/** 46 * CSRF対策用 トークンを取得 47 */ 48function getToken() 49{ 50 return hash('sha256', session_id()); 51} 52 53?> 54<!DOCTYPE html> 55<html lang="ja"> 56<head> 57 <meta charset="utf-8"> 58 <title>お問い合わせフォーム</title> 59</head> 60<body> 61 <h1>お問い合わせフォーム</h1> 62 <form action="" method="post"> 63 <input type="hidden" name="token" value="<?php echo getToken(); ?>"> 64 <p>お問い合わせ内容 ※必須</p> 65 <?php if (isset($error['inquiry'])) echo h($error['inquiry']); ?> 66 <p><textarea name="inquiry" rows="10" cols="100"><?php if (isset($inquiry)) echo h($inquiry); ?></textarea></p> 67 <p>お名前 ※必須</p> 68 <?php if (isset($error['name'])) echo h($error['name']); ?> 69 <p><input type="text" name="name" vale="<?php if (isset($name)) echo h($name); ?>"></p> 70 <p>ご連絡用Email ※必須</p> 71 <?php if (isset($error['email'])) echo h($error['email']); ?> 72 <p><input type="email" name="email" vale="<?php if (isset($email)) echo h($email); ?>"></p> 73 <p><input type="submit" value="送信"></p> 74 </form> 75</body> 76</html> 77

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

保存するときに UTF-8 以外で保存されている可能性がありますのでご確認ください。

また 保存した文字コードが正しかったとしても エラーメッセージは文字化けすると思います。

php

1// CSRF対策 2 if (!isset($_POST['token']) || $_POST['token'] !== getToken()) { 3 exit('<meta charset="utf-8">処理を正常に完了できませんでした'); 4 }

上記のようにすれば一応回避できます。

投稿2016/02/11 00:00

pac894398

総合スコア429

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

na3kick

2016/02/12 07:26

回答ありがとうございました。
guest

0

ベストアンサー

そのPHPファイル自体の文字コードがUTF-8なのか確認してみてください。

投稿2016/02/10 16:11

amaranthine

総合スコア501

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

na3kick

2016/02/12 07:25

回答ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問