2011年2月28日月曜日

2/28覚書

1時間目
☆クラス復習。

クラスの内容と実行ファイルを分けましょう。
includeさせるほうが一般的だし管理も楽。

ファイル名はHuman classなら、最初を大文字にしてHuman.class.phpとなる。

set_ini関数
ini_set()
レンタルサーバーで直接php.iniを触れないときに利用する。
いいんちょ曰く、この説明はいっちーが話していたそうな。
すまん覚えてない。

Notice: Undefinedとは、
未定義変数の場合の警告。エラーではないがあるとよろしくない。
デバッグ時にphp.iniの
error_reporting = E_ALL & ~E_NOTICE & ~E_DEPRECATEDを
error_reporting = E_ALL
; & ~E_NOTICE & ~E_DEPRECATED
に変更。;にするとコメントアウトする。

よろしくない理由はエラーが残っているとHTML以外のデータファイルの場所がわかり、
ハッキングなどの攻撃を受ける恐れがあり、防ぐための対処である。

授業の疑問。べたな書き方言うけどそこから勉強するんじゃねえの?

クラス継承
extendsというコードで継承させる。

目覚まし時計の行動を例に。
Tokei.class.php
MezamashiTokei.class.php
call_mezamashi_class.php

上記ファイル名で3つ作成。
call_mezamashi_class.phpをブラウザで出してみよう。

Tokei.class.php

<?php
class Tokei {
 function getTime(){
  return date('H:i:s');
 }
}
?>

MezamashiTokei.class.php

<?php
require_once('./class/Tokei.class.php');

class MezamashiTokei extends Tokei {

 function getTime(){
  return date('H時i分です');
 }

 function getBell(){
  return "リンリンリン!";
 }

}
?>

call_mezamashi_class.php

<?php
require_once('./class/MezamashiTokei.class.php');

$mezamashi = new MezamashiTokei();
print $mezamashi->getTime()."<br>";
print $mezamashi->getBell();

?>

Tokei.class.phpのgetTime()が、
MezamashiTokei.class.phpのgetTime()に上書きされている。
実際にMezamashiTokei.class.phpの下記部分を/*~*/で囲うとわかるよ。
function getTime(){
return date('H時i分です');
}

関数の上書きをオーバーライブというそうな。

privateとpublic
アクセス件の一種。何も書かなければpublicとして扱われる。
※基本Functionの前にprivate置くことはありません。class内の宣言とは違います。

ここから引用。
PHP5のアクセス制御にprivate、protected、publicがあります。
それぞれの違いを明記しておきます。
private そのクラスからしかアクセスできない
protected そのクラスと、サブクラスからしかアクセスできない
public どこからでもアクセスできる

ごめん。privateとpublicをつけてやるの聞いてなかった。
あれはアクセス権を理解するための処理にしかすぎない、と思ってしまいますた。
つうか同時に存在するクラスってその時点でクラス分けるべきだとおもうのだ。

Javaでの参考情報。とほほのWWW入門から修飾子
ていうかクラス図ってまたJavaですか。
UMLの概念を常に持ってほしいってことですね。
自分も忘れかけてたので再度紹介。
astah* community無償のUMLモデリングツール。せっきー紹介。
まあ、初日ですから。

2011年2月25日金曜日

2/25覚書

今日で拡張最後。
何とか更新まではこぎつけたものの、最後のエラーチェックが通らない・・・
管理者判定。これ便利だなあ。直リンク防止用だね。

ユーザー情報更新処理まではできなかったなぁ;

くわっちょお疲れ様!!
来週から見守ってて~

AAずれご容赦を;


。 ◇◎。o.:O☆οo.
。:゜ ◎::O☆∧_∧☆。∂:o゜
/。○。 ∂(*゚ー゚)O◇。☆
/  ◎| ̄ ̄∪ ̄∪ ̄ ̄ ̄|:◎:
/    ☆。|。.:*・ありがとう・:*..:。|☆
▼       。○..io.。◇.☆____| 。.:
∠▲―――――☆ :∂io☆ ゜◎∂:.

2011年2月24日木曜日

2/24覚書

今日も今日とてログイン処理。
そして何とかできたupass_update。たぶん。
でもソース長いよ。それでもよければどぞ。

session_start();

//セッションハイジャック対策
session_regenerate_id(true);

require "./include.php";

//ログインチェック処理読み込み
require_once "./ctr/login_ctr.php";

//エラーチェック読み込み
require_once './include_errorcheck.php';

$n1password = $_POST["n1password"];
$n2password = $_POST["n2password"];
$password = $_POST["password"];

$sql ="SELECT * FROM user WHERE user_id = '".$_SESSION["user_id"]."'";
$result = mysql_query($sql);
$row = mysql_fetch_array($result);

//旧パスワード判定と代入
if($password !="" || $password !=NULL){
  if ($row["password"] == $password) {
   $_SESSION["password"] = $row["password"];

  }else{
   if ($row["password"] != $password) {
    $error_msg["ecpass"]= "パスワードが違います";
    $error_yn = "y";
    }
   }


  if($n1password == $n2password){
   $_SESSION["n1password"] = $n1password;
   $_SESSION["n2password"] = $n2password;
   header("Location:./upass_complete.php");
   //print "デバッグ用目印。使うときはheaderに//をつける";
   exit;

  }else{
   if($n1password != $n2password){
    $error_msg["e1pass"]= "パスワードが一致しません";
    $error_yn = "y";
    }
   }
}

print_r($sql);
print_r($_SESSION);
print_r($_POST);
?>

<!DOCTYPE br PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>ユーザーパスワード変更画面</title>
</head>
<body>
  <h1>ユーザーパスワード変更画面</h1>
 <table border=0  cellspacing="0" cellpadding="5" Align=Center>
  <tr>
  <td>
   <?php echo $_SESSION["user_nickname"] . "さんでログインしています" ?>
  </td>
  <td>
    権限:<?php echo $authority[$_SESSION["authority"]]?>
  </td>
  <td>
     <a href="./ctr/logout_ctr.php">ログアウト</a>
  </td>
  </tr>
  </table>
 <hr noshade size="1">
 <hr noshade size="1">
  <!-- ユーザーパスワード変更画面 -->

 <form action = "upass_update.php" method = "POST" >
  <table border="1" cellspacing="0" cellpadding="5" bordercolor="#333333" Align="center">
  <tr>
   <td>現在のパスワードを入力してください<br><span style="color : #2f4f4f; font-size : 9pt">4文字以上8文字以内</span></td>
   <td>
   <!--現パスワード -->
   <input type = "password" name = "password" value = "" /><br>
   <span style="color : red; font-size : 9pt"><?php echo $error_msg["epass"]; ?></span>
   <br>
   <span style="color : red; font-size : 9pt"><?php echo $error_msg["ecpass"]; ?></span>
   </td>
  </tr>
  <tr>
   <td>新しいパスワードを入力してください<br><span style="color : #2f4f4f; font-size : 9pt">4文字以上8文字以内</span></td>
   <td>
   <!--名 -->
   <input type = "password" name = "n1password" value = "" /><br>
   <!-- エラーメッセージの表示 -->
   <span style="color : red; font-size : 9pt"><?php echo $error_msg["e1pass"]; ?></span>
   <br>
   <span style="color : red; font-size : 9pt"><?php echo $error_msg["e2pass"]; ?></span>
   </td>
  </tr>
  <tr>
   <td>もう一度新しいパスワードを入力してください<br><span style="color : #2f4f4f; font-size : 9pt">4文字以上8文字以内</span></td>
   <td>
   <!--フリガナ姓-->
   <input type = "password" name = "n2password" value = "" /><br>
   <br>
   <!-- エラーメッセージの表示 -->
   <span style="color : red; font-size : 9pt"><?php echo $error_msg["e1pass"]; ?></span>
 </td>
 </tr>
</table>
 <input type = "submit" name = "send" value = "変更" />
 </form>
 <hr noshade size="1">
</body>
</html>

2011年2月22日火曜日

2/22覚書

今日も1時間目から実習。
ループしてログアウトできない・・・・・・昼直前まで検索等行うも解決ならず、くわっちょにHELP。
したらあったよおかしいところ。
//session開始
session_start();

//セッションハイジャック対策
session_regenerate_id(true);

//データベース読み込み
require "./include.php";

//ユーザー名とパスワードが一致したらPOSTに格納
if($_POST["user_name"] !="" || $_POST["user_name"] !=NULL){
 $user_name = $_POST["user_name"];
}
if($_POST["password"] !="" || $_POST["user_name"] !=NULL){
 $password = $_POST["password"];
}
//XSS対策
$user_name = hg($_POST["user_name"]);
$password = hg($_POST["password"]);

require_once './include_errorcheck.php';

//print_r($_POST);

//ユーザー名を指定検索することでif判定と同等の処理。
$sql ="SELECT * FROM user WHERE del_flg=0 AND user_name ='".$user_name."'";
 $result = mysql_query($sql);
//上記が通らないとデータが出ない。
//$row = mysql_fetch_array($result);
//print ($error_msg["euname"]);

//if($row["password"] == $password){
//上の$resultは抜けていたが、NULL判定がないために、
//『$passwordは空欄で正しい』という処理になっていた。

//$resultできたらパスワード判定と代入

if($row = mysql_fetch_array($result)){
 if ($row["password"] == $password) {
 $_SESSION["user_name"] = $row["user_name"];
 $_SESSION["user_nickname"] = $row["user_nickname"];
 $_SESSION["authority"] = $row["authority"];
 header("Location: ./menu.php");
 exit;
 //print "デバッグ用目印。使うときはheaderに//をつける";
 }else{
 if($row != mysql_fetch_array($result)){
  $error_msg["euname"]= "ユーザーが確認できません。";
  $error_yn = "y";
 }

  if($row["password"] != $password){
   $error_msg["epass"]= "パスワードが間違っています";
   $error_yn = "y";
  }
 }
}

うー、とりあえずなんとか。
ユーザー名だけが合って、パスワードが間違ってたら×
エラーの言葉おかしいような気もするが、今日はログインここまで。
気分転換にmenuの表示判定。
<h2 Align=Center>メニュー</h2>
<table border=0  cellspacing="0" cellpadding="5" Align=Center>
 <tr>
 <td>
  <?php echo $_SESSION["user_nickname"] . "さんでログインしています" ?>
 </td>
 <td>
   権限:<?php echo $authority[$_SESSION["authority"]]?>
 </td>
 <td>
    <a href="./ctr/logout_ctr.php">ログアウト</a>
 </td>
 </tr>
 <tr>
 <td>
  <ul type="circle">
  <?php if($_SESSION["authority"] ==1){?>
   <li><a href="./index.php">一覧表示</a></li>
   <li><a href="./upass_update.php">パスワードの変更</a></li>
  <?php }else{?>
   <li><a href="./index.php">一覧表示(新規登録・更新・削除)</a>span予定</li>
   <li><a href="./upass_update.php">パスワードの変更</a></li>
   <li><a href="./user_insert.php">ユーザーの登録</a></li>
  <?php }?>
  </ul>
 </td>
 </tr>
</table>

明日はindexでのユーザーと管理者の表示判定・・・・・・
あー、やっぱし変数化がほしいいぃいい><

2011年2月21日月曜日

2/21覚書

1時間目からsession認証実習。
相変わらずループで出ないなあ・・・・・・。
2時間目
昨日のダメージが今頃戻ってきた。いっぱい寝たのに眠気と戦い。

3時間目以降も一緒なのだけれど。
やぎーにifで変数にしたuser_nameとpasswordが一致したら遷移を教えてもらって、
やってみたら、エラー処理は入れてないけど、insertしていないIDははじく。
なぜかでけた。

しかし一歩進んで二歩下がる。
メニュー画面でニックネームと権限表示。
$rowでいいのかなー。

あれ、いつの間にかまたログインできない;
くわっちょ救援隊出動で直った。
//session開始
session_start();

//セッションハイジャック対策
session_regenerate_id(true);

//データベース読み込み
require "./include.php";

$user_name = hg($_POST["user_name"]);
$password = hg($_POST["password"]);

//ユーザー名を指定検索することでif判定と同等の処理。
$sql ="SELECT * FROM user WHERE user_name ='".$user_name."'";
$result = mysql_query($sql);

//上記が通らないとデータが出ない。
$row = mysql_fetch_array($result);

if($row["password"] == $password){
 $_SESSION["user_name"] = $user_name;
 header("Location: ./menu.php");
 //print "デバッグ用目印。使うときはheaderに//をつける";
}
//エラーMSG
$error_msg["ename"]="ユーザー名が見つかりません";
$error_msg["epass"]="パスワードが一致しません";

?>

また一歩(ry

session破棄できない(´;ω;`)ウッ…
今日はあきらめて、またあした~

2011年2月20日日曜日

2/19~20河津桜

【注意!!】
【かなり残念なネタにあふれています。】
【気分を害されても責任は負えません。ご了承ください。】


今回の宿は全てに対し言葉に出来ない。
いや、何もかも最悪だった、と表現でもしたいが、
後味の悪さと自らの選択に自責がつのり、音にしたくない。

事の顛末は宿が圏外ゆえまとめて投下
繋がってたら全世界に詳細にツイートしたかった。

友人+友人母(料理研究家。本当に腕が良い)+友人娘で河津桜を愛でに女4人旅。
親子旅で、友人母をもてなすのがコンセプトだった。

!------------------引用ここから---------------------------
【予約内容】
プラン名:【1泊2食】四季折々の伊豆の幸を味わう贅沢プラン。
チェックイン可能時間:14:30~18:00
チェックアウト時間:11:00
プラン内容:山間の一軒宿で伊豆の幸を味わう贅沢プラン。
【夕食】伊豆料理~フレンチテイスト~前菜9種のサラダ、サザエのエスカ
ルゴ風、伊豆牛の陶板焼き、焼きたてパン、日替わりスープ、伊豆牛のロー
ストビーフ等。
【朝食】贅沢健康和食、地物朝採れ野菜や敷地内の山で採れる山菜等をふん
だんに使った創作和食膳、他伊勢海老や金目鯛のお味噌汁等。
食事:朝あり
夕あり
------------------引用ここまで---------------------------!

残念ながら河津桜は三分咲きでトラブルで写真も撮れず、
喫茶店も無く、風も冷たくなり早めのチェックイン。
予定した時刻より大分早まるため宿へ連絡するも出ず……。
発信履歴は13時-14時のあいだに8回。これってCB/発信業務じゃない。

洋風で、フレンチディナーに近ければ尚良く、友人母希望の洋室(4人)で、
条件に合い、評判が高めででも批判もしっかりしてて・・・の宿を探し、決めた。

ペンションファンファーレクラブ

http://www.jalan.net/uw/uwp3000/uww3001.do?yadNo=378789

だが。
玄関鍵かかってる。インターフォン応答なし。

14時過ぎで他宿泊客は見えず、玄関先に経営者のご友人だか
スタッフだか業者だか良く分からんが、女性一人困惑気味に待ちぼうけ。

この時点で地雷の存在を察知はした。そんな事は無いと信じたかったが。

数分でスタッフ到着。
部屋に案内されるなか、食堂経営がメインで、
河津桜祭りで客の入りも多くて忙しくてすみませんね。

だそうだ。(ここで女三人軽く切れる)

転送ぐらい苦でもなかろう。
この祭りで賑わう期間のみ転送設定の手間が惜しいか。
電話会社への高くて千円~数千いくらが惜しいか。いずれでもないだろう。

部屋はトリプル+エキストラベッド有りで予約するもお忙しいようで用意&説明なし。
部屋数は10室。当日の組は3組。
たかが三組の客情報の把握も困難か。
施設内の自販機が故障していた旨を伝えるとこちらも忙しい。そうですか。

ぜひリンクを見て欲しい。
温水洗浄トイレあり→部屋付ではなく共用部分男女1つずつのみ
まあこの程度は施設設備の範疇でも良いだろう。

大理石貸切風呂2(各サウナ付)24h可→予約表には入浴時間23:00迄と矛盾。

とりあえずは散策で冷えた身体をとにかく温めたいと先にお風呂へ。
お風呂は家族風呂の一回り大きなもの。
大理石いいえタイルですが何か?
設備にサウナ、表記あり、実際に洗い場に入口ありましたが、
サウナ入口前に桶山積み。

暗い。冷たい。スイッチ無い。

…………楽しみにしていた友人母落胆。私のテンションも激落。

サウナは最後まで説明無くスイッチもわからず利用不可。
夏期限定の張り紙も見当たらず。

さらに、アメニティ表記のバスローブ。
有料ジャグジー利用者のみと質問して初めて回答。
表記はどこだ…………。
指摘すればあからさまに不快感の接客業従事者。
浴衣ですら言わなきゃ出さないなら表記するな。

入浴を済ませ夕食まで待つ。食事はすべて1階の食堂だ。

そして、地雷しかないモノが来た。

■伊豆料理~フレンチテイスト~前菜9種のサラダ
前菜はALL市販の和もの。皿『だけ』洋風。
function menu($menu){ 
if(! "フレンチ" || "イタリアン"){ 
return "( ゚Д゚)<br >\n"."(゚Д゚)<br >\n"."(゚Д゚)...<br >\n"; 
} 
ゴマ豆腐がフレンチテイストですかそうですか。
空腹ゆえ食べる。この時点ではまだ許せる味だった。

■伊豆牛の陶板焼き……フレンチは?
しかも伊豆牛とは名ばかりの外国産の適当な肉。
今更産地偽装ですか。私にはSAN値偽装です。
『生で食べれます』と仰せだが、見本を見せて欲しいものだ。
おまけに固形燃料を下げる時までも消さないスタイルは、
私の人生の中で初めてだった。
他に経験した方は居るのだろうか。
脂だけが灼かれ広がる煙と匂い。安値焼き肉の臭みが服に身体に全部染みた。
友人母だけでも浴衣でよかったと心底思う。
なにせロビーはもとより、利用した三階の廊下にまで臭いが流れ、
寝る直前まで窓を開ける程だったのだ。

■サザエのエスカルゴ風
つぼ焼きにせずガーリックと料理酒とオリーブオイルをかけて焼いただけ。
塩味はにんにく臭くて感知不可。
磯臭さとオイルの風味が反比例してすごいくさい。
ガチガチに固くなった身に切れ込みも無い。
何故添えられたシルバーがスプーンなんだ。
おつゆをひと舐めで断念。無理に食べた友人胸焼け。

■日替わりスープ
ボタン肉inミネストローネ。その神経を疑う。
『このイノシシは猟で仕留めるより臭みがない』
鼻をつく豚臭さ。匙ですくえる香辛料で誤魔化しつつ仕上げた逸品に
御高説の女将っぽいそれの存在を疑う。
謝れ! 猟友会の皆さんに謝れ! マジで!!
売って貰えないだけだろと邪推せざるを得ない。
スーパーの刺身に市販のドレッシングかけてもマリネにはならんよ。
ここでようやくフランスパン登場。
馴染みのある味すぎてバゲットとは言わん。

■伊豆牛のローストビーフ
オージーのローストビーフ三切れ。きゅうり薄切りふた切れ。
一見で驚きのあまり吹き出したが、ソースは前菜の流用。

謝れ! 伊豆牛とフレンチに謝れ!!

きゅうりでソースをどけて醤油で食す。
きゅうりの使い方位説明が欲しい。

最大限譲歩でマシだったのはパンとデザートのいちご(1/2)だけ。
チョコケーキ、コンビニのほうがマシ。

お子様ランチ。幼児の加算は2500円。
焦げたコロッケ、焦げすぎてハンバーグに見えるコロッケ、
わずかなサラダにプロセスチーズ、俵型を輪切りにしたおにぎりのワンプレート。
プラス別皿(頼んでもいないのでおそらくセット)の刺身はスーパー以下略。

その場でクレームをいう必要?
わざわざ場の空気を濁し、精神的ダメージを負ってやるほど優しくはない。

機械的に給仕するスタッフに、エキストラベッドの未対処を伝えたときも、
忙しいと言い訳する始末。もういいから。

げんなりな食事を終えてすぐに臭い落としに再度入浴。
その後、一階の喫煙所兼歓談室にに行くと先客が居て、相席でテレビ見てるとスタッフ登場。
ボリューム絞れと上の客からクレーム…………。
いやいやいやいや壁薄すぎ。
ならばアップライトピアノにアンプに46インチのBRAVIA置くな。


翌朝。戦々恐々しつつ準備中の食堂を偵察。

【朝食】贅沢健康和食、地物朝採れ野菜や敷地内の山で採れる山菜等をふん
だんに使った創作和食膳、他伊勢海老や金目鯛のお味噌汁等。

冷凍のアジ開き陶板焼きが創作和食と呼ばれるようになったのはいつからだ?
昨夜の匂いを生臭さに変えて再び浴びろと。

朝食は取らずにチェックアウト決定。
三賢者全て承認。
フロントから朝食のコールが来て、急遽出立のため(嘘)で断ると、
謝罪の言葉をこちらが伝えている途中で電話を切る暴挙。
嗚呼、元々マナーが無いのだと判断した。

予想通り、荷物をまとめ出る際には焼き魚の匂いが充満していた。

最後の清算時も素晴らしい対応だった。
エキストラベッド利用時は別料金だが、夕食の給仕の不手際もあり、
幼児利用分と合せて+5000円で良いと紋切。
不手際は全てだろうと言いたくなったが、馬に念仏を実践する余裕は無く、
友人とともに支払う。
明細は出さない。素晴らしい処理だ。
清算時に入湯税の記載が無かったことも付け加えよう。

更に信じがたい続きがある。
朝食抜きは辛かろう、と子供用に海苔巻きを出される。
スーパーで前日購入としか見えない海苔巻き。
ラップも巻かず、チャック付ビニールに直入れで変形している。
出された瞬間に$menu展開。条件を追加し、
}をここに持ってくるべきだった。

気遣いのみ感謝しつつ心の底から辞退し迅速に離脱。
セブンイレブンで購入したいつものサンドイッチが虚しいうまさだった。
函南町のまともなフレンチで口直しして帰路につく。

これで値段相応と満足できるはずもなく。
じゃらんで平日6000円ならば納得だ。心構えが違う。
しかし、シーズン料金14000円だ。
差額8000円はどこに使われているのだろう。

袖すりあうも他生の縁とは言うが、対価に対する提供が無い場合、
相応の処方がある。

ここで衝撃的な事実に気づく。
まとめゆえの弊害だが、いや、じゃらんにリンクが無かったのだが、
http://www.fclub.jp/index.html
これが宿のサイト。まとめ中に初めて出てきた。

じゃらん側にある峰温泉のかけらも無い。
単純泉の記載。当然浴室での掲示などあるわけない。
記述に差異があっても良いのか。温泉法は適用されないのか。
軽く調べてみるが、温泉である以上、開示しなくても良いという説明が見つからない。

そもそも、じゃらんおよび宿の情報を信用してはいけなかったのか……。

永遠に同じ程度の提供が不可能なのは理解する。
同名検索でヒットした別サイトがあり、どうも色々苦労があった様子。

だが。
マナー以上に経営者側のことを思いやる必要が必要なのか?

消費者様にはなりたくない、が、無理だった。
整理して整理して状況を書き留めてはいるが、思い出す度に虚しくなる。
今迄私は運が良かったのだ。
このような対応に一度も遭わず、旅の楽しさを享受してきた。
最低を知ることで今までの旅に感謝できる、貴重な体験をしたと思う。思いたい。

この場を借りて改めて同行者にお詫びする。

ペットと泊まれるだけの宿で売り込めばそもそも候補にならなかった。
この文章をさらにまとめ、宿の評価に投稿する。

旅ができる余裕が当分先になったため、次回以降は教訓を生かそう。

料理研究家の友人母がいつ席を立ったか。
――――知らないほうが良いこともある。

2011年2月18日金曜日

2/18覚書

1時間目は都道府県FizzBuzz。
時間外だけどやぎーにヒントもらって何とかクリア。
今日の問題は自力で解けなかった;
やり直すか・・・。

2時間目
cookieのこと。タイムアウト処理は省略。
sessionにも時間制限設定やりたかった(・・・と思ったら住所録拡張につながったよ↓)

cookieは値を直接ブラウザに入れる。
sessionはサーバー上に鍵(cookie)付の一時キャッシュで保管され、
ブラウザに鍵(cookie)が渡される。
アクセスのたびに鍵(cookie)を使い、サーバーにアクセスする。
そのままだと防御の手立てがないため、セットで覚える。
session_start()させたら、
攻撃を防ぐ関数:session_regenerate_id()を使う。

◆セッション開始とログイン処理の例。
//セッション機能を開始する=ロッカーを使用できるようにする=鍵を発行する
//セッションID(SESSID)=セッションの鍵は32ケタの英数字
session_start();

//セッションハイジャック対策
session_regenerate_id(true);

if ($_POST["id"] =="yamazaki" && $_POST["pass"] =="pass") {
 $_SESSION["loginname"]= $_POST["id"];
 print 'ログインしました<a href="./session2.php">マイページ</a>へ進む<br />';
 exit;
}
?>
<!DOCTYPE br PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
 "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
</head>
<body>
ログインしてください<br />
<form action = "session1.php" method = "POST" >
 ID:<br>
 <input type = "text" name = "id" value = "" /><br />
 Password:<br>
 <input type = "password" name = "pass" value = "" /><br />
 <input type = "submit" name = "login" value = "ログイン" />
</form>
</body>
</html>

◆セッション処理してマイページ表示
/*****************************************************************

■プログラム概要
【セッションIDが確認できる場合】
マイページを表示
【セッションIDが確認できない場合】
ログインページ(session1.php)に強制的に戻す
header("location: http://*****)
session2.php

*****************************************************************/

//既にセッションが開始=鍵が発行されているので、その鍵をブラウザから受け取って
//ロッカーの中身を確認しに行く
session_start();

//セッションハイジャック対策
session_regenerate_id(true);

if($_SESSION["loginname"]!="yamazaki"){
 //header("location: http://*****)で、*****へ強制ジャンプ。ローカルは省略可能。
 header("location: session1.php");
}
?>
<!DOCTYPE br PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
 "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
</head>
<body>
マイページです。
<a href = "session3.php" >ここをクリック</a>するとログアウトします。
</body>
</html>

3時間目

◆セッション削除

/*****************************************************************

■プログラム概要
ログアウトページ(セッションIDの破棄)

session3.php

セッションの破棄
・$_SESSION = array() ; //ロッカー自体を撤去
※array()は配列変数を初期化する記述
・session_destroy //ロッカーの中身だけを消去

*****************************************************************/
//セッション機能を開始する=ロッカーを使用できるようにする=鍵を発行する
//セッションID(SESSID)=セッションの鍵は32ケタの英数字
session_start();

//セッションハイジャック対策
session_regenerate_id(true);

//ロッカー自体を撤去
$_SESSION = array() ;

?>
<!DOCTYPE br PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
 "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
</head>
<body>
ログアウト(セッション変数を消去)しました。<br />
現在未ログイン状態です。<br />
このまま<a href = "session2.php" >マイページ</a>に遷移することはできません
</body>
</html>

MVCモデル Model View Controllerから、
controllerの概念と機能を勉強するよ!

WEBアプリ必須のログイン画面をcontrollerでつけていくよ。

◆address_bookにuserテーブル追加~
CREATE TABLE `address_book`.`user` (
`user_id` VARCHAR( 20 ) NOT NULL ,
`user_name` VARCHAR( 20 ) NOT NULL ,
`user_nickname` VARCHAR( 20 ) NOT NULL ,
`password` VARCHAR( 10 ) NOT NULL ,
`authority` TINYINT( 1 ) NOT NULL ,
`create_at` DATETIME NOT NULL ,
`update_at` DATETIME NULL ,
`del_flg` TINYINT( 1 ) NOT NULL ,
PRIMARY KEY ( `user_id` ) ;

すいません取り合えずinsertからやりました。
でもあり? 権限はどこで処理するんだ?
管理者パスワードとユーザーパスワードとほんとは判定別だよね;
細けぇ(ryでAdminでとりま変更。

sessionのincludeは、HTMLの宣言前に置かないとエラーになる、そうです。
これで40分ぐらい悩みました・・・。

自分用メモ。
びびえすみなおせ~

2011年2月16日水曜日

2/16覚書

1時間目
掃除と都道府県リスト。あとちょっとだったのにいいいい。

2時間目
実習となり、偶数のヒントが宿題九九2問目と判明。やたーできたー!
くわっちょこぼれ話のお勧めセキュリティはESET Smart Securityだよん。

ネタバレだけど自分用に。
<html>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<head><title>都道府県リスト</title>
</head>
<body>
<?php
$pref =array("▼都道府県を選択してください","北海道","青森県","岩手県",
"宮城県","秋田県","山形県","福島県", "茨城県","栃木県","群馬県","埼玉県",
"千葉県","東京都","神奈川県", "新潟県","富山県","石川県","福井県","山梨県",
"長野県","岐阜県","静岡県","愛知県","三重県","滋賀県","京都府","大阪府",
"兵庫県","奈良県","和歌山県","鳥取県","島根県","岡山県","広島県","山口県",
"徳島県","香川県","愛媛県","高知県","福岡県","佐賀県","長崎県","熊本県",
"大分県","宮崎県","鹿児島県","沖縄県");
?>
<table border=1>
<caption>都道府県リスト</caption>
<tr>
 <?php foreach ($pref as $key => $value) {?>
  <?php if (($key%2) ==0){?>
<td>
   <?php echo $key?>
</td>
<td>
   <?php if (($key%2) ==0){?>
    <?php echo $pref[$key]?>
   <?php }?>
  <?php }?>
</td>
</tr>
<?php }?>
</table>
</body>

3時間目
クロスサイトスクリプティングテスト つづりはCross Site Scriptingだそうな。
ながーい解説はクロスサイトスクリプティング対策の基本(前編)を参考にどぞ。
一応リンク先にもあるけど補足。
※クロスサイトスクリプティング脆弱性のことを「XSS」と表記するのは、
「Cross Site Scripting」の略であるから「CSS」と表記したいけど、
「Cascading Style Sheets」の略も「CSS」となり紛らわしいため、
「XSS」と表記する場合が多くなってます。

フォームにはHTMLタグが入れられてしまう。
ウィルスを仕込まれたり、cookieをそのまま盗まれる危険性があるので、
XSS対策を行う必要性がある。

で、対策としては
■関数 htmlspecialchars()を使います。
フォームの中のPOST&GETで入るHTMLタグを変換してただの文字列に変えちゃうのだ。
参考サイト
実例
$xss_text = htmlspecialchars($_GET["user"], ENT_QUOTES,"UTF-8");
$xss_text = $_GET["user"];
echo $xss_text;

これを住所録に関数化してincludeさせよう!

で、こんな感じ。includeはこう。
function hg($str) {
 return htmlspecialchars($str,ENT_QUOTES,"UTF-8");
}
insertで例。
$sei=$_SESSION["sei"] = hg($_SESSION["sei"]);//セッションを受け取る
入力した文字列の判定だけできればいいので、使うのはindex、insert、updateだよ~。
ただし、配列ごとの処理が必要なので["mei"]等々もおんなじよーにつけます。
他にも入力フォームつけてるヒトは適宜ヨロシコ。

4時間目

SQLインジェクション
【' OR ''='】をフォームに入れると、入っているデータが全部出てしまう。
【''='】はどんな条件でも架空のカラムが存在しないなら、すべて引き出せてしまう。
mixiアプリの実例も記憶に新しいところですが、マジ怖い。
//エスケープ処理前
//$sql="SELECT * FROM sql_esc WHERE pass='".$request."'";
//エスケープ処理後
$sql = sprintf("SELECT * FROM sql_esc WHERE pass = '%s'",
 mysql_real_escape_string($request));

未対処は
SELECT * FROM sql_esc WHERE pass='' OR ''=''
のあとにデータがだ~~~と出てきます。

実際に対策すると
SELECT * FROM sql_esc WHERE pass = '\'\' OR \'\'=\'\'
って意味のない文字になる

実践的で100%じゃないけどいい感じのところ
MySQL mysql_real_escape_stringでSQLインジェクションを防ぐ


おまけ
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
 "http://www.w3.org/tr/html4/loose.dtd">
これって何?
DOCTYPE宣言と言うそうな。
HTMLには複数のバージョンがあり、文法や用法がバージョンごとに違いが出ています。
そのため、どのバージョンで作成されたか宣言が必要なのです。
まあHTML5を使うときはこのDOCTYPE宣言も代わるけど、いまは深く考えなくていいと思います~。

2011年2月15日火曜日

2/15覚書

あったらいいな機能
・検索条件保持
・ワイルドカード検索(*を%に変換)
・announce_twitteでツイート連動
・escapeでPOST期待値以外は捨てることでセキュリティ向上。
・ページング機能

苦労した点
・sessionでデータの受け渡しの処理の理解に時間がかかりました。
・全角カナのエラーチェックに最後まで苦しみました。
・フォームの"登録する"や"戻る"で前後に半角スペースを入れたために受け渡しができずに悩みました。
その分、&nbsp;(出ないので全角)の重要性を理解することができました。
わかるようになってきたこと
・構文エラーなどに対して自力で解決できることが増えた。
修正が必要な箇所
最初から項目を変数化しておくことで手順が並列化し、作業効率が上がる。
・登録完了しないとセッションがクリアできない。時間設定がセキュリティ的にも必要。
・変数は項目に併せた名称にすることでケアレスミスを防ぐ。
・ifの判定は関数化しないときは個別に行わないと動作しない?
 動かなかった;
 }else{入れてifで条件つけたほうが見た目もすっきりするなあ。

いい感じのツール
Inkscapeドローツールなのかな?
astah* community無償のUMLモデリングツール。せっきー紹介。
ソフトウェア開発支援ツール。
目からウロコのすごいやつ
疑似個人情報データ生成サービス

これはすごい。

今後予定
・セキュリティ対策
・管理者設定
・来週からSmarty

うーむ。今日は夜歯医者さんなのでとりあえず帰ります。
またあした~

2011年2月14日月曜日

2/14覚書

insertで成功したエラーチェックで全角カナが動かない><
午後全部使って判明。

//カタカナseiチェック
if (preg_match("/^(?:\xE3\x82[\xA1-\xBF]|\xE3\x83[\x80-\xB6])+$/",$sei_kana)) {
 $em_sei_kana_error_yn = "n";
 }else{
 $error_msg["em_sei_kana"] = "全角カタカナで入力してください";
 $em_sei_kana_error_yn = 'y';
 $error_yn = "y";
}

どこから入力された情報なのか、って大原則の変数指定が違ってた;
preg_machで見るのは入力された$sei_kanaなのに、ここをいじってしまっていた;
そら無理だよねー;

あとはエラーのときだけ戻るボタンに注釈。
 <?php if ($error_yn == "y") {?>
 <?php $error_msg["input"]="戻るボタンを押して訂正してください"?>
 <span style="color : red; font-size : 9pt"><?php echo $error_msg["input"] ?></span>
 <?php $input_error_yn = 'y'?>
 <?php $error_yn = "y"?>
 <?php }else {?>
 <?php }?>

ただ、エラーした後訂正して戻るとセッションにエラーMSGが残ってしまって、
判定とは別に文言が残る・・・・・・どうしようかなあ。

2011年2月10日木曜日

2/10覚書

1時間目九九+FizzBuzz
色づけしたいと思いつつ撃沈。
宿題みなおそ~

2時間目
update側だけだった注釈のspanタグ埋め込み+修正

3時間目
テスト報告書テンプレ探す・・・が見つからず。
いっちーがテンプレくれるそうなので微調整。

テンプレキタ――(゚∀゚)――!!
ですが、エラーメッセージの処理に欲を出してしまい、最終日に持ち越し;ごめんよいっちー;

4~5時間目
エラーフラグの処理で
 <?php }if ($input == $error_yn = "y") {?>
  <?php $error_msg["input"]="戻るボタンを押して訂正してください"?>
  <?php $input_error_yn = 'y'?>
  <?php $error_yn = "y"?>

 <?php }?>
を戻るボタンの前に出したい! でもでない、ていうかフラグが【y】になってる><
でもエラーメッセージは出てない。なんでやああああ。
$error_yn = "y"をとにかく//で消してみるデバッグをくわまんから伝授され、
やってみたら、includeさせてたがゆえの問題。
各ページの戻るボタンの上において成功;┐(´д`)┌ヤレヤレ

あとはupdate更新不可ってかIDが渡せてない・・・なんでや~
ええ、hiddenでID渡し忘れてました。ほんとにもう。冷静になれわたし。

2011年2月8日火曜日

2/8覚書

1時間目
・九九FizzBuzz
2時間目
・住所録~
sessionの開放。1個じゃ消えなかったので2個に。
//sessionの削除
$_sesstion = array();

// 最終的に、セッションを破壊する
session_destroy();

エラー表示改
$error_msg = array();で配列
$error_msg["sei"]="255字以内で姓を入力してください";
で格納
実際の表示は
<span style="color : red; font-size : 9pt"><?php echo $error_msg["sei"]; ?></span>

変に難しく考えてしまい、迷路に迷い込みました。
また休み明け~。

2011年2月7日月曜日

2/7覚書

1時間目
九九+FizzBuzzテスト再び。
student3に送ってしまう凡ミス;

2時間目
デバッグ方法その2
・sql文の直下でprint sql;を実行。ブラウザで出た情報をプロンプトで貼り付けて実行。
 実行できなかったらどこかにエラーがあるので根気で探す。
・//$result = mysql_query($sql);の動作check
if (result){
print "SQL実行OK
";
}else{
print "SQLエラー
" ;
}

3時間目
hiddenで戻すかセッションで戻すか1時間悩む。
くわまんにヘルプすると、入力した値とresultの値とifで分岐させるから
どっちでもいいそうな。
ついでに変数に格納したほうがあとあと楽、と言うことがわかり、
field_displayとassocってのを使ってみる。
・・・・・・が、なんか余計こんがらがった;
登録済みの値は
$field_display = $_REQUEST["field_display"];
になる。つまりいまのおいらの考え方だと、
最初っからnameを"field_display"に指定してないといけないのだ。それは時間的に無理。
無理だけど今後のためにいちお続き。
update_comfirmの戻るボタンの前で
<input type="hidden" name="assoc[]" value="<?php echo $sei ?>">
って入れてって、updateで
$assoc = $_REQUEST["assoc"];
って指定して

if(($_REQUEST["assoc"])=="NULL"){
※sqlとか読み込み省略
echo $_REQUEST["assoc"];
}else(($_REQUEST["field_display"])=="NULL"){
echo $_REQUEST["field_display"];
※sqlとか読み込み省略
}
やるんだろうな、とは思う。けど。
今はやめときます。

んで、一覧から編集に飛ぶと中身がなーい!! アワワ ヽ(´Д`;≡;´Д`)丿 アワワ
原因は、value="戻る"におもっきしスペースが入ってたですよ_| ̄|○
単純ゆえに悩みました。
きっと先人の皆様もつまづいたんだろうなあ、と思いたい。

☆気づいたポイント(いまさら)
・都道府県の配列名はpref以外に。かぶるんで。
・for選択
<?php for($i =0; $i <=47; $i++){ ?>
<option value="<?php echo $i>"><?php echo $変数[$i]></option>

2011年2月4日金曜日

2/3・2/4覚書

2/3は前日の疲れが残っててすっかり忘れてました;

1時間目
2/4 新しいテスト。

九九の計算+FizzBuzzって。
いつもの面子以外クリアできず。ええおいらもできんかった;
あとちょっとだけだったんで、詰まったところ含めて復習。
ifの閉じタグ}の位置が甘く、九九の結果をFizzBuzzの判定後に入れる考えがなかった;

<html>
<head>
<title>九九+FizzBuzz</title>
</head>
<body>

<table border=1 cellpadding=5 align="center">
<caption>九九+FizzBuzz 3の倍数はFizz。5の倍数はBuzz。公倍数はFizzBuzz。</caption>
<tr>
<?php $k ="Fizz"?>
<?php $l ="Buzz"?>
<?php for ($i = 1; $i <=9 ; $i++) {?>
 <?php for ($j = 1; $j <=9 ; $j++) {?>
 <td align="center">
 <?php if ((($i*$j)%3) ==0) {?>
  <?php echo $k?>
 <?php }?>
 <?php if ((($i*$j)%5) ==0) {?>
  <?php echo $l?>
 <?php }?>
 <?php if ((($i*$j)%3) !=0 && (($i*$j)%5) !=0) {?>
 <?php echo $i*$j?>
 <?php }?>
</td>
<?php }?>
</tr>
<?php }?>

</table>

</body>

</html>

2時間目
デバッグ方法
ifやループ処理のネストは2つまでが共通認識。
それ以上になる場合は関数化してまとめよう。

エラーチェックおわた;
文字checkはeregが今回はあっているようだ。
//カタカナseiチェック
if (ereg('/[ァ-ヶー]+/u', $sei_kana)) {
 $error_msg = "全角カタカナで入力してください";
 $sei_kana_error_yn = 'y';
 $error_yn = "y";
}

検索・・・
せっきー&はっしー&いいんちょありがとー!!!

1.検索欄の属性をPOST
<input type="text" name="name" size="30">
なら
$name = $_POST["name"];
検索SQL文の前に置くよ。
実際の検索文。
//検索文
if($name !=""){
$sql.= " AND concat(sei,mei) like '%".$name."%'";
}

2011年2月1日火曜日

2/1覚書

・1時間目は掃除と九九計算。
・2時間目以降
 14:00頃にスケジュール確認
 作成が終わった場合は下記
 テスト仕様書の作成
 テスト実施
・午前中でupdateとupdate_comfirmが片付いた・・・ふへー;

と思ったら・・・・・・・。
戻る処理がうまくいかん><
もー無理_| ̄|○
その代わり委員長に教わりつつupdate_completeができた;
しかし、sqlのupdate文思いっきり間違えてました。
$sql = "UPDATE address_book SET sei = '".$sei."',mei = '".$mei."',
~以下,でつなぎ、WHERE id=".$id;で終わる。
WHEREの直前にカンマは不要。

デバッグ色々
print_r ($_POST);
print_r ($_SESSION);
includeに入れておく
#デバッグモード
$debug = false;//デバッグOFF
$debug = true;//デバッグON

使いたい箇所で↓入れる
if($debug)echo ($sql);
if($debug)print($result);
明日はみんなで陸っぱりとごはん♪
楽しみですにゃ~♪