PHP講習会私的メモ(第6回)


9月末に通っていたPHP講習会の私的メモ。
最終回(第6回)が終わって2ヵ月が経ち、今更ながら慌てて復習記事をアップしたのは昨日から同じ会社の「セキュリティ編」に出席しているためです。
なお何度も繰り返しますが、小生の知識レベルはASP(.NETでない)は基本レベル、Perlをかじった程度です。
●トラックバックの実装
今まで作ってきたブログシステムにトラックバック機能を実装します。
トラックバックの仕組みは理解していましたが、技術的な側面を今回初めて知ることができました。
「トラックバックpingを打つ」と言いますが、その実態は単なるPOSTによる値の送信なのでした。
(てっきりコマンドの「ping」と関係ある通信方式だと思っていた)
ということは、別にブログでなくてもフォームを用意すれば、どんなブログにでもトラックバックを打ち込めるのでは・・・?
トラックバック送信フォームを作成できそうだ(悪用厳禁)。
なお文字コードはUTF-8からEUC-JPへの変換が必要。
$tb_blog_id=sqlite_escape_string(iconv("UTF-8", "EUC-JP", $_REQUEST["blog_id"]));
$tb_title=sqlite_escape_string(iconv("UTF-8", "EUC-JP", $_POST["title"]));
$tb_excerpt=sqlite_escape_string(iconv("UTF-8", "EUC-JP", $_POST["excerpt"]));
$tb_url=sqlite_escape_string(iconv("UTF-8", "EUC-JP", $_POST["url"]));
$tb_blog_name=sqlite_escape_string(iconv("UTF-8", "EUC-JP", $_POST["blog_name"])

なおトラックバックの受信側は次のレスポンスを返す必要がある。
トラックバックが成功(受信できた)の場合。
<?xml version="1.0" encoding="iso-8859-1"?><response><error>0</error></response>
失敗(エラー)の場合。
<?xml version="1.0" encoding="iso-8859-1"?><response><error>1</error><message>error!</message></response>
参照
トラックバック技術仕様書
http://lowlife.jp/yasusii/stories/8.html

●RSSの配信
RSSについても日々利用しているので一定フォーマットのテキストファイルだとはわかっていました。
今回はテキストファイルを書き出すのではなくrss.phpを用意してヘッダにContent-Type: text/xmlを出力しています。
RSSのフォーマットはこんな感じ(smartyでループさせる)。
<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
<channel>
<title>ブログのタイトル</title>
<link>http://umakoya.com/</link>
<language>ja</language>
{foreach from=$blog_list item=blog}
<item>
<title>{$blog.blog_title}</title>
<link>http://umakoya.com/blog/detail.php?blog_id={$blog.blog_id}</link>
<description>{$blog.blog_body}</description>
<pubDate>{$blog.blog_date}</pubDate>
<author>馬小屋</author>
</item>
{/foreach}
</channel>
</rss>

講義内容は以上でしたが、実際はコードを書く作業が大半。
持ち帰りでいろいろな課題を出されましたが、いまだ手付かず。
正月くらいにPHP本を1冊読みながらコードを打ってみたいと思っています。
どこかで評価されていた参考書籍

Eclipse3ではじめるPHP5プログラミング入門
掌田 津耶乃
秀和システム
売り上げランキング: 179046
おすすめ度の平均: 4.0

3 内容は充実しています。
5 EcliceでPHP

PHP講習会私的メモ(第4回・第5回)


通っているPHP講習会の私的メモ。
何度も繰り返しますが、小生の知識レベルはASP(.NETでない)は基本レベル、Perlをかじった程度です。
●SQLiteでDB作成
今回よりブログシステムの作成になります。
まずはブログのデータを入れるDBを作成します。
CREATE TABLE blog_m(
blog_id INTEGER PRIMARY KEY,
blog_date,
blog_title,
blog_body,
delete_flag
);

INTEGER PRIMARY KEYでオートインクリメントのデータ型設定。
その他DB作成時のTips。
delete_flagで論理削除をしよう
・パスワードを保存する際はmd5()関数を使う
●PHPからDBを利用(sqlite関数)
$db = sqlite_open("../blog.db");//DB接続
$date=date("Ymd");
$sql = "INSERT INTO blog_m (blog_date,blog_title,blog_body) VALUES ({$date},'タイトル','本文')";
$result = sqlite_query($db,$sql);//SQL文の実行のみ
$sql = "SELECT * FROM blog_m WHERE delete_flag<>1";
$blog_list = sqlite_array_query($db,$sql);//SQLの結果を配列で受け取る
print_r($blog_list);//わかりやすく配列を見れる(htmlじゃなくてソースで確認)

●PHPからDBを利用(smarty)
<?php
include_once("../libs/Smarty.class.php");
$db = sqlite_open("../blog.db");
$sql = "SELECT * FROM blog_m WHERE delete_flag<>1";
$blog_list = sqlite_array_query($db,$sql);
$smarty = new Smarty();
$smarty->assign("blog_list",$blog_list);//SQLの結果をそのままassign
$smarty->display("blog.html");
?>

smarty側はforeachで値を表示。
{foreach from=$blog_list item=blog}
{$blog.blog_date|escape}<br>
{$blog.blog_title|escape}<br>
{$blog.blog_body|escape|nl2br}<br>{*nl2brは改行コードを<br>に変換*}

やったことをまとめると以上です。実際はコードを書く作業が大半でした。
いまいちforeach文や二次元配列を理解しきれていない。
構文として丸覚えするか。
こっから第5回内容。
●SQLインジェクション
価格.comが1年前にクラックされたのはこれが原因。
価格.comの攻撃手法はSQLインジェクション(2005/05/24)
入力されたデータは全て下記でサニタイズ処理せよ。
sqlite_escape_string($_POST["blog_title"])
sqlite_escape_string($_POST["blog_body"])

※DBごとにより危険な文字、サニタイズすべき文字が異なる。DB専用の関数を使おう!
sqliteは“sqlite_escape_string()”
mysqlは“mysql_real_escape_string()”
PostgreSQLは“pg_escape_string()”
汎用関数addslashes()は漏れがあるので使用禁止!
習ったことは以上。
えー!?講習内容は実装作業が大半でした。
ここまででブログの投稿とコメント機能を開発しました。
DBへの入力と出力さえ押さえれば、基本的なモノはとりあえず形にできそうです。
(色々な関数や機能はその都度、調べながらおぼえていこう)
次回はRSSとトラックバックを実装して完成です。

PHP講習会私的メモ(第2回・第3回)


通っているPHP講習会の私的メモ。
繰り返しますが、小生の知識レベルはASP(.NETでない)は基本レベル、Perlをかじった程度です。
●smartyとは
smartyは高機能なテンプレートエンジンでphp開発のデファクトスタンダードになっている。
小生は初めてテンプレートエンジンに触れます。
[手順]
1.smartyをダウンロード
2.解凍してlibsフォルダをpublic_htmlと同階層にアップ
3.public_html下にtemplates、templates_cディレクトリ作成(※)
4.templates_cに書き込み権限(777)
5.おしまい
※この位置はセキュリティの都合上public_htmlと同列に変更した方が良い(後述)。
public_html/smarty.php
public_html/templates/templates.html
public_html/templates_c/****

smarty.phpにアクセスするとtemplates.htmlを解析して、templates_cにコンパイルファイルが生成される。
→タイムスタンプを見て一度だけコンパイルするので高速
●smartyの使い方
public_html/smarty.php
<?php
$scalar="hello Smarty!";
$array=array("m"=>"男","f"=>"女");
$age=20;
require("../libs/Smarty.class.php");//smartyを読み込み
$smarty = new Smarty();//smartyインスタンス生成
$smarty->assign("word",$scalar);//assignメソッドで変数割り当て
$smarty->assign("sex",$array);
$smarty->assign("age",$age);//
$smarty->display("templates.html");//displayメソッドでテンプレート呼び出し
?>

public_html/templates/templates.html
{*コメント。ブラウザに出力されない*}
{$word|escape}<br>{*パイプ+escape修正子で出力文字のサニタイジング*}
{$sex.m}<br>{*配列は.で*}
{$sex.f}<br>
{if $age==20}{*テンプレート内でif文もできるよ*}
20歳です。
{elseif $age==30}
30歳です。
{else}
その他
{/if}

assignの扱いが混乱しそう。php側とテンプレート側で変数名はそろえた方が良い?
escape修正子は出力文字列のサニタイジング。
php側で対策する場合はhtmlspecialchars($str,ENT_QUOTES)
(両方やっちゃうとだめ)
こっから第3回内容。
●templatesディレクトリの移動
public_html内にtemplates、templates_cディレクトリがあるのはまずい。
→ソースコードの漏洩
→public_html外に保存してhttpアクセスをさせない
libs内にMySmarty.class.phpを作成
MySmarty.class.php
<?php
define("ROOT_DIR","/home/umakoya");
include_once(ROOT_DIR."/libs/Smarty.class.php");
class MySmarty extends Smarty{
function MySmarty(){
$this->template_dir = ROOT_DIR."/templates";
$this->compile_dir = ROOT_DIR."/templates_c";
$this->Smarty();
}
}
?>

ディレクトリの指定先を変更する。
php内では下記で呼び出し。
require("../libs/MySmarty.class.php");//MySmartyを読み込み
$smarty = new MySmarty();//Mysmartyインスタンス生成

●debug機能
{debug}をテンプレート内にいれるとassignされた値を表示する。
●smarty雑感
・テンプレートエンジンを初めて使った
・デザインとプログラムの分離
・業務フロー的にどうだろう?(静的htmlとphpが混在するサイトの場合)
●SQLite
・php5から標準で利用可能
・検索速度が早く、商用DBと遜色ない
・DBはファイル形式(書込権限に注意)
・データ型なし
・大文字、小文字区別なし
今回はsshPutty日本語化)でSQLiteを操作し、SQL文の練習をした。
$ sqlite member_db
sqlite>CREATE TABLE member_m (member_no,member_name,password);
sqlite>INSERT INTO member_m (member_no,member_name,password) VALUES(1,'umakoya','pass');
sqlite>SELECT * FROM member_m;
sqlite>UPDATE member_m SET member_name='UMAKOYA' WHERE member_no='1';
sqlite>DELETE FROM member_m WHERE member_no='1';
sqlite>.help
sqlite>.exit

●SELECT文の練習そのほか
ORDER BY *** (DESC) LIMIT 上限数 OFFSET 下限数
a LIKE 'uma%'
a LIKE 'uma_'
a IS NULL
a IN ('a','b','c')

SQLite ControlCenter 日本語版ではGUIでDBの操作が可能です。
この日は他の受講者とも少し会話しました。
友人と(?)起業された方で、急遽PHPを勉強しているんだとか。
他のスクールにも通っているが、ここは格安で実践的で講師も現場の人だから非常に良いとのことでした。
そんな小生が通っている講習会はこちら。
アシアル株式会社 事業紹介 PHPスクール
講師がイケメンだよ!
次回からブログシステムの制作になります。

PHP講習会私的メモ(第1回)


先日のPHP講習会の私的メモ。
なお小生の知識レベルはASP(.NETでない)は基本レベル、Perlをかじった程度です。
●基本
<?php
$hensu="Hello";
print("$hensu Word!");
$array = Array("a","b","c");
?>

変数は$“”は変数展開。文末は;。perlと一緒だ。
配列も$だから注意。連想配列もあるよ。
<?phpの書き出しに慣れない。ASPは<%でタイプ数も少ない。
あとperlのuse strict;みたいなのはないのかな?まだ習ってない。
●関数
http://www.php.net/関数で検索。
例:http://www.php.net/print
やー!これは便利。
●フォーム入力
$_POST/$_GETにformのnameをキーにして連想配列。
これはすごい!(タイプが面倒っぽいけど)
$value=$_POST["name"];
ASPのようにRequestで取得しなくて良いんだ。
●ループ制御
foreach ($_POST as $key=>$value){
print("$key is $value");
}

$valueだけ欲しい場合はas $key=>を省略可。
●セッション
session_start();//セッションスタート
$_SESSION["name"]="umakoya";//セッション代入

この辺はASPと一緒。
●セッション固定攻撃
phpは設定によってはGETでセッションを引き回せる(cookieに対応していないブラウザ向けに便利)。
hoge.php?PHPSESSID=xxxxxx
でもこれだとセッションIDを指定した偽URLをクリックさせ、セッションを乗っ取ることができる!!

http://hoge.co.jp/login.php?PHPSESSID=danger

これってかなり危なくね?
対策としてはアクセス直後にセッションIDを変更する関数を使用して乗っ取りを防ぐ。
session_start()
session_regenerate_id(true)//セッションIDを変更
//以下処理

今回は第1回ということもあり、ついていくことができました。
間違いなどお気づきの点はご指摘いただければと思います。

  • 他のブログ

    育児で買ったモノたち
  • Twitter

  • 最近の投稿

  • 最近のコメント

  • はてなブックマーク

  • RSS購読

    RSS Feed RSS - 投稿

  • カテゴリー

  • 月別

  • カレンダー

    2017年4月
    « 3月    
     12
    3456789
    10111213141516
    17181920212223
    24252627282930
  • プロフィール


    健康・医療系の出版社でウェブに関わる営業企画と浅い技術。Webディレクター?
  • キーワード検索