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."%'";
}