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宣言も代わるけど、いまは深く考えなくていいと思います~。