alienHRNの訓練日記

IT業界初心者で勉強中。

20200929 授業メモ

授業内容

 

エラー名:undifined barriable
→変数名を確認
変数名が大文字小文字で違っていたり抜けていたりする場合が多い


XSS対策
タグを認識させないように対策をする


index.phpより

<?php
// デバッグ用領域の表示・非表示
$debug = true;

// 自分で作成した関数functions.phpを読み込んで利用できるようにする
// ・h関数:XSS対策用関数
// ・v関数:デバッグ表示用関数
// require_once:読み込み失敗時にFatal_Errorで処理を停止させる
// →once・・・同じファイルを複数回読み込みさせない
// ・・・うっかり複数回読み込んでも2回目以降は無視
// dirname(__FILE__)→_DIR__
// ↑上記はどちらも同じ意味
// 今動いているファイルのフォルダまでの絶対パスが返ってくる
// __FILE__:PHPがあらかじめ用意している定数
// マジカル定数
// 今動いているファイルまでの絶対パス
// dirname関数:引数で指定したファイルパスからファイル名を除いてディレクトリまでの
// 絶対パスを返す関数



require_once dirname(__FILE__. '/functions.php';
// データベースの接続
// ORの特殊な使い方
// 第一条件:mysqli_connect関数の戻り値を変数dbobjに代入して
// 変数dbobjの値で真偽値の判断
// 接続ok:mysqliオブジェクトがあるので「true」
// 第二条件は見ない
// 接続NG:falseなので「false」
// 第二条件を見る
// 第二条件:die関数は引数を出力してPHP処理を停止


$dbobj = mysqli_connect(
  'localhost'//DBサーバの場所
  'Tanaka'//DBユーザ名
  'Manager' //DBパスワード
)
  or die('接続不可');
mysqli_select_db($dbobj'practice');
mysqli_set_charset($dbobj'utf8');
// 実行するSQL文を変数に代入
// 複雑なSQL文になった時に変数を使ってSQL文をデバック表示できるように
// $sql = 'SELECT*FROM stationery';
$sql = 'SELECT*FROM stationery left join trader on stationery.maker=trader.m_id';
//  mysqli_query関数でSQL文を実行
// 戻り値としてstationeryテーブル情報が返る
// 変数resultSetに代入
// ORの特殊な使い方
// 第一引数:SQL文の結果を変数resultSetに代入
// 変数resultSetの値で真偽値判定
// SQL文実行okでテーブル情報あり「true」
// SQL文実行NGで「false」

// 第二条件を見る
// 第二条件:die関数の実行
// die関数の引数に「mysql_error関数」
// mysql_error関数:DBエラーメッセージをDBから取得して返す関数



$resultSet = mysqli_query($dbobj$sql)
  or die(mysqli_errnor($dbobj));
//mysqli_affected_rows関数
// 直前に実行したSQL文の結果を返す
// 直前に実行したSQL文がSELECT文だった場合、取得したレコードの件数を返す
// 変数名bl(bool値の意味)はHTML側でこの値を真偽値がわりに使っているので
// あまりよくないかも
// 数値が入っていることがわかる変数名の方がよい

$bl = mysqli_affected_rows($dbobj);
v($bl);

?>

<!DOCTYPE html>
<html>

<head>
  <meta charset="UTF-8">
  <link href="style.css" type="text/css" rel="stylesheet">
  <title>商品管理システム</title>
</head>

<body>
  <?php if ($debug) : ?>
    <div class="debug">
      <p>デバッグ</p>
      <p>$sql:<?php print $sql?></p>
      <p>$bl:<?php print $bl?></p>

    </div>
  <?php endif ?>

  <div id="container">
    <div id="head">
      <h1>商品一覧<?php echo $bl?></h1>
    </div>
    <div id="content">
      <?php if ($bl) : ?>
        <table>
          <tr>
            <th>ID</th>
            <th>商品名</th>
            <th>価格</th>
            <th>在庫</th>
            <th>キーワード</th>
            <th>メーカー</th>
            <th>電話番号</th>
            <th>編集</th>
            <th>削除</th>
          </tr>
          <?php while ($data = mysqli_fetch_assoc($resultSet)) : ?>
            <tr>
              <td><?php echo h($data['id']); ?></td>
              <td><?php echo h($data['item']); ?></td>
              <td><?php echo h($data['price']); ?></td>
              <td><?php echo h($data['stock']); ?></td>
              <td><?php echo h($data['keyword']); ?></td>
              <td><?php echo h($data['company']); ?></td>
              <td><?php echo h($data['tell']); ?></td>
              <td>編集</td>
              <td>削除</td>
            </tr>
          <?php endwhile?>
        </table>
        <php else: ?>
          <p>商品がありません</p>
        <?php endif?>
        <p class="btn"><a href="entry.php">新規登録</a></p>
        <!--#content-->
    </div>
    <!--#container-->
  </div>

  <?php
  $str = '<h1>てすと</h1>';
  echo $str;
  echo htmlspecialchars($str);
  // htmlspecialchars()関数
  // HTMLで意味がある記号を実態参照に置き換える
  // →XSS攻撃を防ぐ
  // XSS(クロスサイトスプリクッティング):scriptタグを使ったJSによる攻撃
  // 対策としてHTMLタグを無効化して防ぐ。

  // 第一引数(必須):変数対象文字列
  // 第二引数:クォートを実態参照にするか
  // ダブルクォートは指定なしでも実態参照にする
  // scriptタグ内で出力した際にJSの文字列を無効化するため
  // 第三引数:文字コードを指定
  // 違う文字コードも文字列の場合に第三引数で指定した文字コードに変換
  // 戻り値:タグを無効化した文字列
  // htmlspecialchars()でユーザ入力値を無害化(サニタイジング)する
  // タイミングは出力直前で行う。
  // 複数サニタイジングはNG


  ?>


</body>

</html>



functions.phpより
<?php
// HTMLでのエスケープ処理をする関数
// 引数に変数も配列も両方受け取って
// サニタイジングできるカンストして定義
function h($var)
{
  if (is_array($var)) {
    // 配列を受け取った時の処理
    return array_map('h'$var);
  } else {
    // 配列じゃないときの処理
    return htmlspecialchars($var, ENT_QUOTES, 'UTF-8');
  }
}

// デバック用関数
function v($val)
{
  echo '<pre>';
  var_dump($val);
  echo '<?pre>';
}

// MySQL(MariaDB)に接続する関数