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関数:引数で指定したファイルパスからファイル名を除いてディレクトリまでの
// 絶対パスを返す関数
// データベースの接続
// ORの特殊な使い方
// 第一条件:mysqli_connect関数の戻り値を変数dbobjに代入して
// 変数dbobjの値で真偽値の判断
// 接続ok:mysqliオブジェクトがあるので「true」
// 第二条件は見ない
// 接続NG:falseなので「false」
// 第二条件を見る
// 第二条件:die関数は引数を出力してPHP処理を停止
$dbobj = mysqli_connect(
'Tanaka', //DBユーザ名
'Manager' //DBパスワード
)
or die('接続不可');
mysqli_select_db($dbobj, 'practice');
mysqli_set_charset($dbobj, 'utf8');
// 実行するSQL文を変数に代入
// $sql = 'SELECT*FROM stationery';
// mysqli_query関数でSQL文を実行
// 戻り値としてstationeryテーブル情報が返る
// 変数resultSetに代入
// ORの特殊な使い方
// 第一引数:SQL文の結果を変数resultSetに代入
// 変数resultSetの値で真偽値判定
// SQL文実行okでテーブル情報あり「true」
// SQL文実行NGで「false」
// 第二条件を見る
// 第二条件:die関数の実行
// die関数の引数に「mysql_error関数」
// mysql_error関数:DBエラーメッセージをDBから取得して返す関数
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>
<title>商品管理システム</title>
</head>
<body>
<div class="debug">
</div>
<div id="container">
<div id="head">
</div>
<div id="content">
<table>
<tr>
<th>ID</th>
<th>商品名</th>
<th>価格</th>
<th>在庫</th>
<th>キーワード</th>
<th>メーカー</th>
<th>電話番号</th>
<th>編集</th>
<th>削除</th>
</tr>
<tr>
<td>編集</td>
<td>削除</td>
</tr>
</table>
<p>商品がありません</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 {
// 配列じゃないときの処理
}
}
// デバック用関数
function v($val)
{
echo '<pre>';
var_dump($val);
echo '<?pre>';
}