PHP 10日目
(なんか、WordPressの見出しデザインとかブロックの設定パネルとか…フォントサイズも変わっている…)
第16章:関数
★基本的にはJSと一緒
(ただし、PHPは「イベント」の概念はない)
①引数無し・戻り値なし関数
<?php
// 定義部分
// よく使う処理をまとめておく
// ◆メリット
// ・PGを短く記述できる
// ・問題発生時は定義部分だけ修正すればOK
function attack() {
echo '攻撃した!!<br>';
}
function guard() {
echo '防御している・・・<br>';
}
?>
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>引数なし・戻り値なし関数</title>
</head>
<body>
<?php
echo '<h2>1回目の出力</h2>';
// 関数の呼び出し
attack();
guard();
?>
</body>
</html>
②引数あり・戻り値なし関数
<?php
// 関数定義
function attack($name) {
echo $name . 'は攻撃した!!<br>';
}
function guard($name) {
echo $name . 'は防御している・・・<br>';
}
function magic($name, $magicName) {
echo $name . 'は' . $magicName . 'を唱えた!<br>';
}
?>
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>引数あり・戻り値なし関数</title>
</head>
<body>
<?php
echo '<h2>1回目の出力</h2>';
attack('田中');
// 引数(パラメータ)
// 関数外から関数内に値を渡す
guard('佐藤');
attack('鈴木');
echo '<h2>2回目の出力</h2>';
magic('田中', 'メラミ');
echo '<h2>3回目の出力</h2>';
attack();
// 引数を受け取る関数に
// 正しく引数を渡さないと「Fatal error」になる
// ただし関数定義の引数部分に
// デフォルト値設定(代入の記述)があれば
// その値を使用して処理が続行されるためエラーにならない
?>
</body>
</html>
Fatal error:Uncaught ArgumentCountError → 「引数が少ないですよ」
引数を受け取らなかった時の初期値を設定
function attack($name = 'プレイヤー') {
echo $name . 'は攻撃した!!<br>';
}
echo '<h2>3回目の出力</h2>';
attack();
③引数なし・戻り値あり関数
<?php
function enemy() {
$point = rand(1, 100);
// rand:7.1以降はmt_randと同じ挙動(乱数生成)をする
echo $point . 'ダメージを受けた!!<br>';
return $point; // 戻り値あり
// 戻り値:関数呼び出し部分に値を戻す
}
function recovery() {
$num = rand(1, 10);
echo $num . '<br>';
if ($num > 8) {
echo '大回復した<br>';
return 500;
// 関数呼び出し部分に値が戻るので
// 戻り値を何らかの処理に使用する
// 今回は戻り値を減算代入に使っている
}
echo '回復した<br>';
return 200;
}
?>
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>引数なし・戻り値あり関数</title>
</head>
<body>
<?php
$life = 1000;
echo '<h2>1回目の出力</h2>';
$life -= enemy();
// 関数呼び出し部分に値が戻るので
// 戻り値を何らかの処理に使用する
// 今回は戻り値を減算代入に使っている
echo $life;
echo '<h2>2回目の出力</h2>';
$life += recovery();
echo $life;
?>
</body>
</html>
④引数あり・戻り値あり関数
<?php
// 定義部分
function enemy($name) {
$point = rand(1, 100);
echo $name . 'は' . $point . 'ダメージを受けた!!<br>';
return $point;
}
function recovery($name, $magicID) {
// $name:'田中'
// $magicID:1
switch ($magicID) {
case 1:
$magicName = 'ホイミ';
$point = 100;
break;
case 2:
$magicName = 'ベホイミ';
$point = 200;
break;
case 3:
$magicName = 'ベホマズン';
$point = 300;
break;
}
echo $name . 'は' . $magicName . 'を唱えた!' . $point . '回復<br>';
return $point;
}
?>
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>引数あり・戻り値あり関数</title>
</head>
<body>
<?php
$playerList = [
['name' => '田中', 'life' => 1000],
['name' => '佐藤', 'life' => 500],
];
echo '<h2>1回目の出力</h2>';
$playerList[0]['life'] -= enemy($playerList[0]['name']);
// 田中のライフ -= enemy('田中')
echo $playerList[0]['life'];
echo '<h2>2回目の出力</h2>';
$playerList[0]['life'] += recovery($playerList[0]['name'], 1);
// 田中のライフ += recovery('田中', 1);
echo $playerList[0]['life'];
?>
</body>
</html>
よく使う処理を関数化
例)よく使うpreタグ付きのvar_dump出力を短い「v」という名前で呼び出せるようにする。
// preタグ付きのvar_dump用関数を作る
function v($val) {
echo '<pre>';
var_dump($val);
echo '</pre>';
}
$playerList = [
['name' => '田中', 'life' => 1000],
['name' => '佐藤', 'life' => 500],
];
echo '<h2>3回目の出力</h2>';
v($playerList);
関数を共通パーツにして読み込む
よく使う関数の定義部分を別ファイルに切り離し共通パーツ化、このファイルを複数のPHPファイルで読み込んで使用する。
共通関数ファイルは「functions.php」という名前の場合が多い。
<?php
// 「functions.php」は
// システム全体で使用する
// オリジナル関数を定義したファイル
// システム開発時にこのファイルの読み込みを義務付けると
// 共通オリジナル関数の管理が楽になる
// デバック関数
function v($val) {
echo '<pre>';
var_dump($val);
echo '</pre>';
}
PHPのみのファイルの場合、PHPブロックの「?>」を記述しない。そうすることで不要な改行文字を出力しないようにする。
<?php
// 共通関数定義ファイルは
// ファイル上部で読み込む
// 【require_once】
// ・1回のみ読み込み可能(2回目以降は無視される)
// ・読み込み失敗時は「Fatal error」で処理が停止する
require_once 'functions.php';
?>
<!DOCTYPE html>
・
・
<body>
<?php
$playerList = [
['name' => '田中', 'life' => 1000],
['name' => '佐藤', 'life' => 500],
];
echo '<h2>1回目の出力</h2>';
v($playerList);
?>
</body>
</html>
【プリント資料】セキュリティ対策
★最低限対策すべき部分
クロスサイトスクリプティング(XSS)
不正なJavaScriptコードを使用し、他のサイト訪問者に攻撃を仕掛けること。
ループさせたり、勝手にページ移動させたり・・・
HTMLで意味のもつ記号をエスケープする
htmlspecialchars(string変換対象文字[,intオプション[,stringエンコード]]):string
<h1>XSS対策のテスト</h1>
<?php
$code = '<p style ="color:red;">段落\'s</p>';
echo $code . PHP_EOL;
echo htmlspecialchars($code);
// htmlspecialchars関数
// HTMLで意味のある記号を実態参照に変換する
// HTMLタグを認識させないように変換する
// 第1引数:変換対象の文字列
// 第2引数:オプション
// クォートの変換方法をオプション用定数を使って設定できる
// 推奨:ENT_QUOTES
// 第3引数:文字コード(基本的にUTF-8を指定)
// 戻り値:HTMLタグを無効化した文字列
?>
<h1>XSS対策のテスト</h1>
<p style ="color:red;">段落's</p>
<p style ="color:red;">段落's</p>
定数名 | 説明 |
---|---|
ENT_COMPAT | ダブルクォートは変換するがシングルクォートは変換しない |
ENT_QUOTES【推奨】 | シングルクォートとダブルクォートを共に変換する |
ENT_NOQUOTES | シングルクォートとダブルクォートは共に変換されない |
ENT_HTML401 | コードを HTML4.01 として処理する |
文字セット | エイリアス | 説明 |
---|---|---|
Shift_JIS | SJIS,SJIS-win,cp932,932 | 日本語 |
EUC-JP | EUCJP,eucJP-win | 日本語 |
UTF-8 | ASCII互換のマルチバイト 8ビット Unicode |
htmlspecialchars()関数を実行するとHTMLで意味をもつ記号を実態参照に置き換えてくれる。
$code = '<p style ="color:red;">段落\'s</p>';
echo $code . PHP_EOL;
echo htmlspecialchars($code) . PHP_EOL;
echo htmlspecialchars($code, ENT_COMPAT) . PHP_EOL;
echo htmlspecialchars($code, ENT_QUOTES) . PHP_EOL;
echo htmlspecialchars($code, ENT_NOQUOTES) . PHP_EOL;
echo htmlspecialchars($code, ENT_HTML401) . PHP_EOL;
<p style ="color:red;">段落's</p>
<p style ="color:red;">段落's</p>
<p style ="color:red;">段落's</p>
<p style ="color:red;">段落's</p>
<p style ="color:red;">段落's</p>
<p style ="color:red;">段落's</p>
サニタイジングのタイミング
sanitize:清掃・殺菌などで衛生的にする
プログラム処理が終わり、出力する値が確定したタイミングで一気にサニタイジングを行えば、サニタイジング忘れや重複サニタイジングを防げる。
値を受け取ったタイミングでサニタイジングすると、後から値が追加された場合に再度サニタイジングを行わなければならない。この方法だとサニタイジング処理が分散してしまいサニタイジング忘れや、重複しえサニタイジングしてしまう可能性が高くなる。
セッションハイジャック
セッションIDの乗っ取り
対処法
セッションハイジャックを防ぐには予測できない文字列のセッションID発行や、クッキーの有効期限を短くする方法、サイトにアクセスするたびにセッションIDを新たに発行する方法などがある
セッションIDの再発行
session_regenerate_id(TRUE);
// セッションハイジャック対策
// PHPSESSIDの値を変更する
// 引数は常に「TRUE」を指定(省略しない!!)
// TRUE → 古いセッションファイルを削除
// 複数ページで処理する場合
// 始点となるファイルでPHPSESSIDの値を変更することが多い