QA@IT

【PHP】SESSION変数について

4197 PV

IDとパスワードを入れて、それを修正するというコードをセッションで書きました。
しかし、値を何も入力していないときも、何かが入力されている扱いになってしまいます。
どこがいけないのでしょうか?

first.php

<?php
session_start();
if(isset($_SESSION['ID'])){
    $ID = $_SESSION['ID'];
}else{
    $ID = '';
}
if(isset($_SESSION['pass'])){
    $pass = $_SESSION['pass'];
}else{
    $pass = '';
}
?>
<!DOCTYPE html>
<html lang="ja">
<head><meta charset="utf-8"><title></title></head>
<body>
<form action="second.php" method="post">
<dl>
<dt>ID</dt>
<dd>
<input type="text" name="ID" value="<?= $ID ?>" size="5" maxlength="10">
</dd>
<dt>パスワード</dt>
<dd>
<input type="pass" name="pass" value="<?= $pass ?>" size="5" maxlength="10">
</dd></dl>
<input type="submit" value="送信する">
</form>
</body>
</html>

second.php

<?php
session_start();
?>
<!DOCTYPE html>
<html lang="ja">
<head><meta charset="utf-8"><title></title></head>
<body>
<?php
if(isset($_POST['ID'])){
    $_SESSION['ID'] = $_POST['ID'];
    $ID = $_POST['ID'];
    print "IDは" . $ID . "です";
}else{
    $ID = '';
    print "IDが入力されていません";
}
print "<br><br>";
if(isset($_POST['pass'])){
    $_SESSION['pass'] = $_POST['pass'];
    $pass = $_POST['pass'];
    print "パスワードは" . $pass . "です";
}else{
    $pass = '';
    print "パスワードが未入力です";
}
?>
<a href="first.php">戻る</a>
</body>
</html>

回答

second.php の以下のif文のelseブロックに入らないという意味でいいですか?

if(isset($_POST['ID'])){
  /* 略 */
}else{
  $ID = '';
  print "IDが入力されていません";
}

issetは値が空かどうかではなくセットされているかを判断します。
テキストボックスを空のままでも、空文字 '' が送信されますので、$_POST['ID'] はセットされています。

なので

if(isset($_POST['ID']) && $_POST['ID'] != ''){
  /* 略 */
}else{
  $ID = '';
  print "IDが入力されていません";
}

などと内容も確認しなければいけません。
※ issetも残してください。


あとこれためしてませんがこのままだとIDやPASSにHTMLタグが書けてしまう気がします。
特にscriptタグが送信されると危険です。

表示の際には htmlspecialchars (http://php.net/manual/ja/function.htmlspecialchars.php) などを利用するようにしましょう。

質問のために簡易的にそのように省略されている場合はこの部分は無視してください。
よくわからなければ、IDのテキストボックスに <script>alert('hello');</script> と入力してみてください。
(Chromeあたりだとブラウザがブロックしてしまうかもしれません。)

編集 履歴 (0)
  • 回答ありがとうございます。
    htmlspe....は故意に省きました。記載すべきでした。

    どうして、isset($_POST['ID'])も残す必要があるのでしょうか?
    「$_POST['ID']が空文字だけではない」=「値がなにかしら入っている」という意味にはならないのでしょうか
    -
  • 返信遅くなりました。issetが必要なのは、不正なFormからのpostも想定すべきだからです。name="ID"のないFormを用意してPOSTすればこのphpはエラーを起こします。そういった状況にも対応した強いコードにすべきです。 -
  • 「このphpはエラーを起こします」は現状でなくて、「issetを無くした場合に(IDなしでPOSTすると)$_POST['ID']がエラーを起こす」の間違いでした。 -
  • 初歩の質問に分かりやすく回答していただき、本当に助かりました!
    ありがとうございます!
    -
ウォッチ

この質問への回答やコメントをメールでお知らせします。