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

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

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

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

PHP

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

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

CSRF

クロスサイトリクエストフォージェリ (Cross site request forgeries、CSRF)は、 外部Webページから、HTTPリクエストによって、 Webサイトの機能の一部が実行されてしまうWWWにおける攻撃手法です。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

解決済

2回答

5719閲覧

CSRF対策

ryohasegawa

総合スコア437

HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

PHP

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

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

CSRF

クロスサイトリクエストフォージェリ (Cross site request forgeries、CSRF)は、 外部Webページから、HTTPリクエストによって、 Webサイトの機能の一部が実行されてしまうWWWにおける攻撃手法です。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

1グッド

3クリップ

投稿2017/01/01 11:46

ページにフォームを設置し、フォームから実際送られてきた情報か確かめるために以下のプログラムを作ったのですが、実際にフォームから送信したデータも、エラーで弾いてしまいます。
関数部分です。

php

1function h($s){ 2 return htmlspecialchars($s, ENT_QUOTES, "UTF-8"); 3} 4 5function setToken(){ 6 if(!isset($_SESSION['token'])){ 7 $_SESSION['token'] = sha1(uniqid(mt_rand(), true)); 8 } 9} 10function checkToken(){ 11 if(empty($_POST['token']) || $_POST['token'] != $_SESSION['token']){ 12 echo "不正な処理です。"; 13 exit; 14 } 15} 16

メインコード部分

php

1if($_SERVER['REQUEST_METHOD'] != "POST"){ 2 //投稿前 3 4 //CSRF対策 5 setToken(); 6}else{ 7 //投稿後 8 checkToken(); 9 10 $name = $_POST['name']; 11 $email = $_POST['email']; 12 $memo = $_POST['memo']; 13 14 $error = array(); 15 16 //エラー処理 17 18 if(!filter_var($email, FILTER_VALIDATE_EMAIL)){ //メールの形式が正しくなかったら 19 $error['email'] = 'メールアドレスの形式が正しくありません。'; 20 } 21 if($email == ''){ //メールの形式が正しくなかったら 22 $error['email'] = 'メールアドレスを入力してください。'; 23 } 24 if($memo == ''){ //メールの形式が正しくなかったら 25 $error['memo'] = '内容を入力してください。'; 26 } 27 28 if(empty($error)){ 29 //DBに格納 30 } 31} 32?> 33<!DOCTYPE html> 34<html lang="ja"> 35 <hrad> 36 <meta charset="UTF-8"> 37 <title>お問い合わせフォーム</title> 38 </head> 39 <body> 40 <h1>お問い合わせフォーム</h1> 41 <form method="POST" action=""> 42 <p>お名前:<input type="text" name="name" value="" ></p> 43 <p> 44 メールアドレス*:<input type="text" name="email" value="" > 45 <?php if($error['email']){echo h($error['email']);} ?> 46 </p> 47 <p>内容*:</p> 48 <p><textarea name="memo" clole="40" rows="5"></textarea></p> 49 <?php if($error['memo']){echo h($error['memo']);} ?> 50 51 <p><input type="submit" value="送信"></p> 52 <input type="hidden" name="token" value="<?php echo h($_SESSION['token']); ?>"> 53 </form> 54 </body> 55</html>

どこでエラーになっているかだけでも教えていただけると嬉しいです。

7968👍を押しています

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

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

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

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

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

guest

回答2

0

ベストアンサー

コードを動かしてみましたが、session_start()を追加するくらいで動きました。

ところで、トークン生成に uniqid(mt_rand(), true) を使っているのはよくありません。mt_randは、マニュアルに記載されいてるとおり、暗号学に安全ではないからです。すなわち、攻撃者がいくつか自分のブラウザでトークンを生成させてみて、前後の(他人の)トークンを予測できる余地がある、ということを意味します。

警告

この関数が生成する値は、暗号学的に安全ではありません。そのため、これを暗号として使ってはいけません。暗号学的に安全な値が必要な場合は、random_int() か random_bytes() あるいは openssl_random_pseudo_bytes() を使いましょう。
PHP: mt_rand - Manual より引用

このため、PHP 7.0以降をお使いであれば、以下が好ましいです。

PHP

1 $_SESSION['token'] = bin2hex(random_bytes(32));

PHP 5.3以降であれば、以下も利用できます。opensslが導入されていることが前提ですが、導入されている場合が多いと思います。

PHP

1 $_SESSION['token'] = bin2hex(openssl_random_pseudo_bytes(32));

投稿2017/01/01 13:24

ockeghem

総合スコア11701

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

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

ryohasegawa

2017/01/01 13:40

uniqid(mt_rand(), true)に関しては、学習的なことでやっています。 そこに回答頂いてありがとうございます。 これから、セキュリティーについてもっと勉強していきます。
ryohasegawa

2017/01/01 13:42

session_start()をどこに記述されたか教えてもらえますか? 自分のコードにも書いてあるんですが・・・
ockeghem

2017/01/01 13:49

session_start()はスクリプトの先頭に書きました
ryohasegawa

2017/01/01 14:02

自分は、関数部分を別ファイルから呼び出しているんですが、その次に書けばいいでしよね?
ockeghem

2017/01/01 14:08

ご自身で試してみたらどうでしょうか? …と突き放すだけでは不親切なので、ヒントを…以下の両方は最低限満足する必要があります。 ・なにかしら表示をする前 ・セッションを利用する前
ryohasegawa

2017/01/01 14:14

ありがとうございます。
ryohasegawa

2017/01/02 12:06

すいません、解決したように思えたのですが・・・・ Windows10では問題なく動くのですが、Macで・・・・
ockeghem

2017/01/02 13:36

Windows10とMacでというのは、ブラウザの違いでしょうか? サーバーの違いでしょうか? いったん php.iniで display_errorsをONにして、その後表示されるすべてのエラーを解消した方がよいと思います。
ryohasegawa

2017/01/02 13:47

PHP -SでサーバーをWindowsで開いています。 Windowsからは、自分のIPでMacからはWindowsのIPで接続しています。 ブラウザはOperaを使っています。両方。 php.iniを見てみます。
ryohasegawa

2017/01/02 13:49

display_errorsをONにしただけではエラーメッセージ表示しませんよね?
ockeghem

2017/01/02 14:00

display_errorsをONにして、アプリケーションを動かせば、警告レベルのエラーメッセージが表示される可能性があります。その警告の原因を取り除く、という意味です。
ryohasegawa

2017/01/02 14:03

すいません。データベースの名前が間違ってました。 問題は解決したんですが違う問題がでてしまい考えて見ます。
ryohasegawa

2017/01/02 14:17

何も警告が表示されないです。
ockeghem

2017/01/02 14:24

そうですか。僕が動かしたときはいくつか警告が表示されました。その後変更された結果、警告も出なくなったのかもしれませんね。失礼しました。
ryohasegawa

2017/01/02 14:28

いえいえ。とても勉強になります。 有難うございました。今は違う問題に直面していて・・・・ 本当に有難うございました。
guest

0

session_startをメインコードの1番上の行に追加してみてはいかがですか?

PHP

1session_start();//メインコードのプログラム先頭にこの一行を追加する。

投稿2017/01/02 02:26

s8_chu

総合スコア14731

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

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

ryohasegawa

2017/01/02 11:15

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問