##ユーザー管理の基本 必要な知識 ###言語リファレンス
- $_SESSION
- $_COOKIE
- htmlspecialchars
- 特殊文字を HTML エンティティに変換する
- array_push
- 一つ以上の要素を配列の最後に追加する
- array_pop
- 配列の末尾から要素を取り除く
- isset
- 変数がセットされていること、そして NULL でないことを検査する
- empty
- 変数が空であるかどうかを検査する
- sha1
- 文字列の sha1 ハッシュを計算する
###データのフィルタリング
- 概要
- filter_var
- 指定したフィルタでデータをフィルタリングする
- フィルタの型
###セッション処理
- 概要
- session_start
- 新しいセッションを開始、あるいは既存のセッションを再開する
- session_destroy
- セッションに登録されたデータを全て破棄する
- session_set_cookie_params
- セッションクッキーパラメータを設定する
- session_regenerate_id
- 現在のセッションIDを新しく生成したものと置き換える
###ネットワーク 関数
###PHP Data Objects
####PDOでDBへ接続/切断(connection/disconnection)
try {
// MySQLサーバへ接続
$pdo = new PDO("mysql:host=localhost; dbname=pdotest",
"root", "password");
} catch(PDOException $e){
var_dump($e->getMessage());
}
// 切断
$pdo = null;
####PDOでデータの取得(SELECT)
try {
$pdo = new PDO("mysql:host=localhost; dbname=pdotest",
"root", "pass");
$stmt = $pdo->query("SELECT * FROM CD");
while($row = $stmt->fetch(PDO::FETCH_ASSOC)){
echo implode(", ", $row) . PHP_EOL;
}
} catch (PDOException $e){
var_dump($e->getMessage());
}
$pdo = null;
####PDOでデータの追加・更新・削除(INSERT/UPDATE/DELETE)
$ids = array(10, 11, 12);
$titles = array('COUNTRY', 'PARTY', 'QUIZ');
$contents = array('Country Song', 'Party Music', 'Quiz Song');
try {
$pdo = new PDO(
"mysql:host=localhost; dbname=pdotest", "root", "pass");
$stmt = $pdo->prepare(
"INSERT INTO CD(ID, TITLE, CONTENT) VALUES(:ID, :TITLE, :CONTENT)");
for($i = 0; $i < 3; $i++){
$stmt->bindValue(':ID', $ids[$i]);
$stmt->bindValue(':TITLE', $titles[$i]);
$stmt->bindValue(':CONTENT', $contents[$i]);
$stmt->execute();
}
} catch (PDOException $e){
var_dump($e->getMessage());
}
$pdo = null;
- 例1 プリペアドステートメントを使用して、繰り返し挿入処理を行う
<?php
$stmt = $dbh->prepare("INSERT INTO REGISTRY (name, value) VALUES (:name, :value)");
$stmt->bindParam(':name', $name);
$stmt->bindParam(':value', $value);
// 行を挿入します
$name = 'one';
$value = 1;
$stmt->execute();
// パラメータを変更し、別の行を挿入します
$name = 'two';
$value = 2;
$stmt->execute();
?>- 例2 プリペアドステートメントを使用して、繰り返し挿入処理を行う
<?php
$stmt = $dbh->prepare("INSERT INTO REGISTRY (name, value) VALUES (?, ?)");
$stmt->bindParam(1, $name);
$stmt->bindParam(2, $value);
// 行を挿入します
$name = 'one';
$value = 1;
$stmt->execute();
// パラメータを変更し、別の行を挿入します
$name = 'two';
$value = 2;
$stmt->execute();
?>##例外(exceptions)
###tryブロック、throw文、catchブロック
<pre>
<?php
echo "--- Exception Test ---\n\n";
try{
echo "****** Begin try ******\n\n";
#引数が不正な関数コール(「Warning」警告)
substr();
echo "****** End try ******\n\n";
}catch(Exception $e){
echo "****** catch ******\n\n";
}
echo "--- Exception Test ---";
?>
</pre>
##三項演算子
<?php
// 三項演算子の使用例
$action = (empty($_POST['action'])) ? 'default' : $_POST['action'];
// 上記は以下の if/else 式と同じです。
if (empty($_POST['action'])) {
$action = 'default';
} else {
$action = $_POST['action'];
}
?>
##エラー処理およびログ記録
Webサイトにスクリプトや自動転送(HTTPリダイレクト)を仕込むことによって、閲覧者に意図せず別のWebサイト上で何らかの操作(掲示板への書き込みなど)を行わせる攻撃手法。
ユーザはCSRFの仕込まれたサイトにアクセスすることによって、特定の掲示板やアンケートなどに書き込まされたり、オンラインショップで買い物をさせられたりしてしまう。ブラウザでアクセスしただけで実行されてしまうため、ユーザが閲覧前に危険が無いかを調べて回避するのは現実的には難しい。
サーバ側でCSRFを防ぐには、サイト外からのリクエストの受信を拒否する必要がある。ヘッダに含まれる情報を元に参照元が正規のページかどうかをチェックしたり、フォームの一部にランダムな数値を隠しておいてアクセスの一貫性をチェックしたり、コンピュータが読み取れないよう画像として表示したチェックコードの入力をユーザに要求するなどの手法があり、これらを組み合わせて対策を講じる必要がある。