Skip to content

Instantly share code, notes, and snippets.

@c-taka
Last active December 21, 2015 22:08
Show Gist options
  • Select an option

  • Save c-taka/6372828 to your computer and use it in GitHub Desktop.

Select an option

Save c-taka/6372828 to your computer and use it in GitHub Desktop.

##ユーザー管理の基本 必要な知識 ###言語リファレンス

  • $_SESSION
  • $_COOKIE
  • htmlspecialchars
    • 特殊文字を HTML エンティティに変換する
  • array_push
    • 一つ以上の要素を配列の最後に追加する
  • array_pop
    • 配列の末尾から要素を取り除く
  • isset
    • 変数がセットされていること、そして NULL でないことを検査する
  • empty
    • 変数が空であるかどうかを検査する
  • sha1
    • 文字列の sha1 ハッシュを計算する

###データのフィルタリング

###セッション処理

###ネットワーク 関数

  • setcookie
    • クッキーを送信する
  • header
    • 生の HTTP ヘッダを送信する

###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'];
}

?>

##エラー処理およびログ記録

CSRF 【 Cross Site Request Forgeries 】

Webサイトにスクリプトや自動転送(HTTPリダイレクト)を仕込むことによって、閲覧者に意図せず別のWebサイト上で何らかの操作(掲示板への書き込みなど)を行わせる攻撃手法。

ユーザはCSRFの仕込まれたサイトにアクセスすることによって、特定の掲示板やアンケートなどに書き込まされたり、オンラインショップで買い物をさせられたりしてしまう。ブラウザでアクセスしただけで実行されてしまうため、ユーザが閲覧前に危険が無いかを調べて回避するのは現実的には難しい。

サーバ側でCSRFを防ぐには、サイト外からのリクエストの受信を拒否する必要がある。ヘッダに含まれる情報を元に参照元が正規のページかどうかをチェックしたり、フォームの一部にランダムな数値を隠しておいてアクセスの一貫性をチェックしたり、コンピュータが読み取れないよう画像として表示したチェックコードの入力をユーザに要求するなどの手法があり、これらを組み合わせて対策を講じる必要がある。

セッションハイジャック対策

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment