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

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

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

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

PHP

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

Q&A

解決済

4回答

3420閲覧

phpでの値の受け渡しについて

kakkydayo

総合スコア16

HTML5

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

PHP

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

0グッド

1クリップ

投稿2016/04/06 14:36

現在。htmlで値を取得しphpでチェック処理しております。

name="password"はしっかり値が渡せて、phpでチェックができるのですが、
name="username"に関しては、値は渡せているのですがphpでカラのチェックや
hash化した際の突合せチェックができません。

またname="username"に1文字だけ入れて実行しても”idが入力されていません”
と出力されます。

name="username"はどうすればphpでチェックできまでしょうか??

宜しくお願い致します。

下記にコードを記載致します。

html

1<form action="{$script}" method="POST"> 2 <p class="comment">ID パスワードを入力してください</p> 3 ID<p class="input"><input type="text" name="username"/></p> 4 pass<p class="input"><input type="password" name="password" /></p> 5 <ul> 6 <li><input type="submit" name="login_button" value="ログイン" /></li> 7 </ul> 8 {$login_error_message} 9 </form>

php

1 global $admin_password;//config.phpのパス 2 global $admin_id; 3 global $login_error_message; 4 5 $admin_id = htmlspecialchars($_POST['username'],ENT_QUOTES,'UTF-8'); 6 $input_password = htmlspecialchars($_POST['password'],ENT_QUOTES,'UTF-8'); 7 $admin_id_sha = hash('sha512',$admin_id);//idをハッシュ化 8 $admin_password_sha = hash('sha512',$admin_password);//パスをハッシュ化 9 10 11 if(empty($admin_id)){ 12 $login_error_message = '<p class="error_message">idが入力されていません</p>'; 13 show_login_form(); 14 exit; 15 } 16 17 if(empty($input_password)){ 18 $login_error_message = '<p class="error_message">パスワードが入力されていません</p>'; 19 show_login_form(); 20 exit; 21 } 22 23 if(hash('sha512',$admin_id) != $admin_id_sha){ 24 $login_error_message = '<p class="error_message">idが違います</p>'; 25 show_login_form(); 26 exit; 27 } 28 29 if(hash('sha512',$input_password) != $admin_password_sha){//ハッシュ化したpassの比較 30 $login_error_message = '<p class="error_message">パスワードが違います</p>'; 31 show_login_form(); 32 exit; 33 }

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

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

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

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

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

guest

回答4

0

ベストアンサー

「PHPによる簡単なログイン認証いろいろ」を参考にどうぞ.実装サンプルがあるので多分これだけでも答えになるかと思います.


またname="username"に1文字だけ入れて実行しても”idが入力されていません”

と出力されます。

ちょっとこの点だけがコードの内容と整合性が取れていない気がするのですが,まず最初に直すべき点をあげると,kei344さんがすでに仰られている通り,$admin_idへの代入を$input_idに直すことですね.global宣言が無意味になるのでおそらくミスです.

その他,気になったことを挙げると

  • $scriptをaction属性の値に使っているが,もしここに$_SERVER['PHP_SELF']を使っている場合XSS脆弱性となるので絶対にやめること.$_SERVER['SCRIPT_NAME']を使っている場合はセーフだが,そもそもaction属性の値を空文字列にした場合は自分自身に対してPOSTすることになるので,これが一番いい.

  • エラーが発生するリスクがあるので,変数の存在確認に関してノーチェックで$_POST['username']などを参照しない.最低限issetでの存在確認を行う.最善を求めるなら更に配列を弾くために文字列であるかどうかの検証も行う.この処理をfilter_inputを使うと1つにまとめることができる.

備考: $_GET, $_POSTなどを受け取る際の処理

  • HTML出力以外の処理(ハッシュ生成など)を行うタイミングでhtmlspecialcharsの目的外使用をしない.これはテキストをHTMLとして埋め込む瞬間にのみ使うべき関数である.パスワードに「&」などの特殊文字が含まれていた場合,生成されるハッシュが誤ったものになってしまう.

備考: 「何故htmlspecialcharsを通すのか?」を一言でどうぞ

  • SHA512はハッシュ関数としては十分な強度があるが,ソルト無しで使うとレインボーテーブル攻撃に弱いという欠点があるので,必ずソルトを入れる.更にソルトを毎回ランダムにしてくれるpassword_hash関数やそれに対応した検証関数のpassword_verifyを使うのが最もセキュリティが固くなるので,これを使うべき.

備考: PHPによる簡単なログイン認証いろいろ

  • ユーザ名までハッシュ化してしまうと利便性の面で大きなディスアドバンテージがあるので,パスワードのハッシュ化が強力であればそれだけで十分.

【追記】

直すならこんな感じでしょうか. <input /> はHTMLとしては誤っているのでついでに <input> に直しておきます.また後から気づいたんですが,パスワードの方もハッシュ化が無意味になってる気がします. $admin_password_shaは最初から直接文字列で定義されているかと思いきや,平文の$admin_passwordから毎回生成されていますよね.**平文でパスワードをスクリプトに書いてはいけません.**それを避けるためにハッシュ関数があるんですから.

HTML

1<form action="" method="post"> 2 <p class="comment">IDとパスワードを入力してください</p> 3 ID<p class="input"><input type="text" name="username"></p> 4 PW<p class="input"><input type="password" name="password"></p> 5 <ul> 6 <li><input type="submit" name="login_button" value="ログイン"></li> 7 </ul> 8 {$login_error_message} 9</form>

PHP

1global $admin_id; // 平文 2global $admin_password_hash; // password_hash関数で生成しておいたBlowfishハッシュ 3global $login_error_message; 4 5$input_id = (string)filter_input(INPUT_POST, 'username'); 6$input_password= (string)filter_input(INPUT_POST, 'password'); 7 8if ($admin_id === '') { 9 $login_error_message = '<p class="error_message">idが入力されていません</p>'; 10 show_login_form(); 11 exit; 12} 13if ($input_password === '') { 14 $login_error_message = '<p class="error_message">パスワードが入力されていません</p>'; 15 show_login_form(); 16 exit; 17} 18if (($admin_id !== $input_id) | !password_verify($input_password, $admin_password_hash)) { 19 $login_error_message = '<p class="error_message">IDまたはパスワードが違います</p>'; 20 show_login_form(); 21 exit; 22}

こういうケースではIDもできれば隠蔽したいことでしょう.そのために「IDまたはパスワードが違います」というエラーメッセージでまとめたほうが望ましいです.また,password_verifyを確実に実行しないと実行時間の差から「最低限IDが間違っている」ということは推測されますので,論理演算子の||ではなく短絡評価のないビット演算子の|を敢えて使っています.

投稿2016/04/06 15:41

編集2016/04/07 18:36
mpyw

総合スコア5223

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

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

kakkydayo

2016/04/07 12:14

回答ありがとうございます。 idに1文字だけ入れて、チェックにかかってしまったのはemptyが0もカラ扱いにしてしまっていたせいでした。emptyを!issetに変更しました。 またみなさんのご指摘通り$input_idに変えて行ったところ、今度はidがカラでも、 ”idが入力されていません”が出力されなくなってしまいました。 どなたか、ちょっとしたことでも良いのでご教授お願い致します。
mpyw

2016/04/07 18:18

そりゃ,未入力だとしても $_POST['username'] は空文字列として送信されてきますし,もしフォームのsubmitを使わずに独自のスクリプトで奇妙なPOSTリクエストが飛ばされてきて $_POST['username'] が未定義であったとしても (Noticeレベルのエラーを発生しながら)強引に htmlspecialchars の実行結果が $input_id に代入されることは確定しているので,当然の挙動です.
guest

0

皆さんの回答からいろいろ作法があるようですが、まずはusernameの件に特化して考えた方が良いでしょう。
PHP側でhtmlspecialchars関数で処理していますので、これを使わない場合はどうなりますか?
値が取れているようでしたら、htmlspecialchars関数の使い方に問題があることになります。
では問題があるとすれば?影響しそうなのは第三引数のencodingですね。
UTF8を指定していますが、HTML側で正しくUTF8で送る設定になっていますか?
PHP側とHTML側で文字コードの統一ができているか、確認してみてください。

投稿2016/04/07 04:13

ttyp03

総合スコア16998

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

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

mpyw

2016/04/07 08:41

「1文字だけ入れた」というのが日本語などのマルチバイト文字で,且つUTF-8以外の文字コードで書かれている,というケースであれば説明はつきますね.ただし半角英数字の場合は相変わらず原因不明です…
mpyw

2016/04/07 18:14

あ,"0" を入力されていたのが原因だったようですw (まさかのピンポイント一致
guest

0

$admin_id は統一されてるので問題ないのでは…?
$input_password と $admin_password が混ざっているのが気になりました。

投稿2016/04/06 15:49

ttoonnaa

総合スコア57

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

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

mpyw

2016/04/06 15:56

逆です,統一されているとこのスクリプトの目的が不明になります. $admin_id_sha = hash('sha512',$admin_id); if (hash('sha512', $admin_id) != $admin_id_sha) { } これはつまりこういうことです. if (hash('sha512', $admin_id) != hash('sha512',$admin_id)) { } このif文に何の意味があるのでしょうか.
ttoonnaa

2016/04/06 15:59 編集

これは恥ずかしい勘違いでした…。場を汚してしまい申し訳ないです。ご指摘ありがとうございます。
guest

0

ひとまず $input_id が無い状態なので、そこを修正されてはいかがでしょう。

PHP

1// $admin_id = htmlspecialchars($_POST['username'],ENT_QUOTES,'UTF-8'); 2// ↓ 3 $input_id = htmlspecialchars($_POST['username'],ENT_QUOTES,'UTF-8'); 4 $input_password = htmlspecialchars($_POST['password'],ENT_QUOTES,'UTF-8');

投稿2016/04/06 15:07

kei344

総合スコア69407

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問