FC2ブログ

ファイルの解析

ファイルの解析

http://www.byakuya-shobo.co.jp/hj/data/HJ2013_03_Q1.zip
から圧縮ファイルをダウンロード

Unzip HJ2013_03_Q1.zip
で解凍し
bin200
をだす

この拡張子もないファイルを解析していく

VMイメージのBT5R3 は
USキーボードなので
USキーボードと日本のキーボードの違い
http://www.nagasaki-gaigo.ac.jp/toguchi/pc/multilingual/keyboard_us_jis.htm
を見ながら行う
一番わかりにくいのは
全角、半角の切り替えキーが
shift + 全角半角 で ~
全角半角は` というバッククオートになるということ
USキーボード形式は全角半角はたしかに使うことがないと思う
だって英語圏だし

今回のこの問題に必要なスキルは
バイナリ解析系

まず、どんなファイルかを調べるため
file コマンドで調べる

file bin200

すると
bin200: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.15, not stripped

となる
この結果から読み取れるのは
ELF 32-bit LSB executable, Intel 80386,
ということなので
IA32アーキテクチャの32bit Linux 用ELFファイルであること

このファイルのバイナリを静的解析して処理のあたりをみつける

使うのは
IDA Pro free 5.0

とはいっても使い方がわからないので検索

http://ameblo.jp/a-f-s-g/entry-11476490443.html
によれば vim でもバイナリエディタ代わりになるとのこと

vim bin200
でファイルを開いて
:%! xxd でバイナリが表示

使い方いまいちわからないので後にして今後の参考に

backtrack ida
で検索したら
http://www.byakuya-shobo.co.jp/hj/moh2/bt5_tools_list.html#p6

Reverse Engineering のところに
install ida-pro free
と有ったので
仮想マシンのBT5R3 で
startx で GUI画面にして
Applications > BackTrack > Reverse Engineering > ida-pro free
で起動

ただ、時間がなかったので
途中でキャンセルしたらインストールできなくなったため
次回。新しく仮想マシンを作りなおして実験

今回は
gdb という動的解析用デバッガーで
スタックとプログラムカウンター(EIPレジスター)
をいじくり
ptrace を経由せずに直接 GeneratePassword を実行する
まず
apt-get install gdb
でインストールして
gdb ./bin200 を行う

この時点ではまだ実行されていないので
break main
でブレークポイントの設置

しかし、次の gdbの使い方がわからないので
とりあえず
これの使い方を調べるところからになりそう
スポンサーサイト



テーマ : セキュリティ
ジャンル : コンピュータ

実践CTF模擬訓練の準備

実践CTF模擬訓練の準備

CTFで出題された問題が
Hacker Japan のサイトに公開されたり
リンクが貼られているので
これと
Hacker Japan (ハッカー ジャパン) 2013年 03月号 [雑誌]
の掲載されている内容を参考に実践

hacker japan の過去問のリンクは
http://www.byakuya-shobo.co.jp/hj/backnumber.html

HackerJapan2013年3月号

Q1 謎 のファイルを解析する
Q2 バラバラ画像パズル
Q3 不 審な通信を見つけ出せ!
Q4 マウスポインターが勝手に動く謎
Q5 間 抜けな暗号解読
Q6 JPG 画像の秘密
Q7 見 えないファイルを探せ
Q8 USB デバイス通信を調査
Q9 プ ログラムに隠された文字

のところから行える

解析に使うのは
すでにダウンロード済みの
BT5R3 を使う
ものによっては、windows も使用する

テーマ : セキュリティ
ジャンル : コンピュータ

ログイン処理の実装

ログイン処理の実装

#12 ログイン処理を作っていこう
http://dotinstall.com/lessons/sns_php_v2/9612
を参考に
新規登録処理のあとのログイン処理について学習

その前に登録処理の動作確認

適当に名前、メールアドレス、パスワードを入力し
エラーがないのを確認したら
開発環境のサーバーで
mysql -u root -p
でログインして
use dotinstall_sns_php;
でDBを指定

select * from users;
として
今回登録したユーザが入っているならOK

また、パスワードについては暗号化されているのが確認できる

ここまでエラーが起きなければ
次のログイン処理になるけど
もしエラーが起きているのなら

HTTPステータスコード
http://www5.plala.or.jp/vaio0630/mail/st_code.htm
も見ながらデバッグする

デバッグ完了したら
login.php の編集

ソースがそのままなら
singup.php の
32行目あたりの
if ($_SERVER['REQUEST_METHOD'] != 'POST') {

から
86行目の if の終了あたりまでをコピーし

login.php の
if (!empty($_SESSION['me'])) {
header('Location: '.SITE_URL);
exit;
}

のしたあたりにペースト

内容はその後編集して
if ($_SERVER['REQUEST_METHOD'] != 'POST') {
// CSRF対策
setToken();
} else {
checkToken();

$email = $_POST['email'];
$password = $_POST['password'];

$dbh = connectDb();

$err = array();


if (empty($err)) {
}

}
となり、処理は新たに作成する

トークンチェックも行うので
singup.php から
<input type="hidden" name="token" value="<?php echo h($_SESSION['token']); ?>">
をコピペし
login.php の
</form>
の上あたりに貼りつける

そして、signup.php で作ったユーザ関数は
今後も使うので
functions.php へコピーして
どのファイルからでも読み込んで使えるライブラリにする

書き込む場所は
function h($s){

}
のしたあたり

テーマ : プログラミング
ジャンル : コンピュータ

ユーザ登録の実装

ユーザ登録の実装

#11 ユーザーを登録しよう
http://dotinstall.com/lessons/sns_php_v2/9611
を参考にDBへユーザ情報を登録する方法を学習


singup.php を編集する

if(empty($err)){
}
の中に書いていく

登録はDBなので
$sql ="insert into users (name,email,passowrd,created,modified)
values(:name,:email,:password,now(),now())";
としてSQLを変数へ格納する

$stmt =$dhb->prepare($sql);
として prepare() でSQLを実行
また、プレースホルダーを使うので、これにも prepare() を使う必要がある

$param = array(
":name"=>$name,
":email"=>$email,
":password"=>getSha1Password($password)
);

password に関しては暗号化するので
getSha1Password($password)
としている
これは、セキュリティのことを考えてのこと
getSha1Password()
はユーザ関数

$stmt->execute($params);
でプレースホルダーにしたものを実行

終わったら、header() で指定した Location へ飛ばす
header('Location: '.SITE_URL.'.login.php');
でログイン画面に飛ばす

ここまできたら、exit;
で正常終了

ユーザ関数の getSha1Password() は

function getSha1Password($s){
return sha1(PASSWORD_KEY.$s);
}
というようにして
config.php で指定している定数
PASSWORD_KEY と $s つまり
入力したパスワードをつなげて
sha1 で暗号化している

テーマ : プログラミング
ジャンル : コンピュータ

CTF 攻略ツール

CTF 攻略ツール

掲載されていたので。メモがわりにかいてみた

とりあえず、これだけは知っておいたほうがいいということなので

まず、ネットワーク解析として
wireshark
これはパケット解析の定番ツール
一般的にはIPパケットの解析につかう

wireshark でUSBのキャプチャーデータ解析などもある

コマンドライン系なら
tshark


次に、プログラム解析として
IDA
これは逆アセンブラソフト
フリーでも使えるけど
製品版になると複数のアーキテクチャ対応になる
ただし、かなり高額
製品版の IDA pro は使えそうにないので
objdump コマンドで逆アセンブル
デバッガーによるトレースができるようにしたいところ

objdump コマンドは linux のコマンドで
オブジェクトファイルの情報を表すけど
逆アセンブルにも使える
ただし、普通にインストールした状態だと
ネイティブアーキテクチャしか対応しないとのこと
複数アーキテクチャ対応にするには
binutils を使うことになる

次に、windows系のものだけど
WinDbj
これは MicroSoft製の windows 用デバッグツール
windows バイナリのメモりダンプするときに必要

あと、windows で使える無料デバッガとしてOllyDebg
ゲーム解析、改造するときの定番ツール

次にバイナリエディタ
これはプログラム海席次に必須ソフト
Bz
Stirling
HxD
などいろいろ

そして、仮想マシン環境
VMware
VirtualBox が結構有名
これは私も結構使っている
IA32ならこれだけで十分だけど
これ以外のアーキテクチャの ARMとかMIPSになると
QEMU が必要

そして、プログラミング言語環境
これはexploit を書いたり
簡単なデータパーサーをかくのに必要
そもそも開発環境がないとプログラミングできないし

国内外のCTF解説によれば pythonが多いらしい
これである程度のスクリプトが書ける程度のスキルは必須
また、PHPもマスターして環境の構築も必要

python ,PHP を開始するには
ドットインストールで無料で学習できるので
未経験の場合は参考にするとわかりやすい

そして、web 関連
javascript 実行環境
Paros などのデバッグ環境を用意しておく

web ブラウザーで
chromeとか firefox でアドオンとか
デベロッパーツールなどが使えるとやりやすいかもしれない

そして、Linux 環境
とりあえず、CTF関連を行うなら
backtrack 5 や kalilinux などを使えるようにしておく
Linux 未経験の場合、ubuntu あたりを
vmware や virtualbox など仮想マシンで体験するとよいかも
サーバー構築関連を学ぶなら
最近では ubuntu が多いけど
centOS が結構情報が多い
Linux 関連の雑誌で
日経Linux とか Ubuntu Magazine とか見ると
わかりやすい
あと、Linux100%などで、どんなものか使ってみるという方法もある

Linux でファイルの素性を知るために
file コマンドを使ったり
文字列抽出のために strings コマンドを使うこともある

そして、チーム参戦になるので
情報共有システムもほしいところ

wiki レンタルサービスをつかうか
wikiシステム構築になるけど
システムを構築してしまったほうがいいと思う
wiki 関連のシステムは
pukiwiki とか mediawiki などで
ローカルに wiki 環境の構築が可能なので
興味があれば構築すると面白いかもしれない

また、リアルタイム情報交換にはIRCなどのシステム構築が必要
事前準備などの場合は
掲示板とかグループウェアなどもよいらしい

また、インターネット接続環境については
普通に外部アクセスする環境と
課題を解くために必要なもう1つのネット環境が必要になる

これはDEFCON予選問題の中に
NAPTでない環境からの接続を前提とした問題があったため
このため普通にルータ経由でNAPTで接続する環境
そしてグローバルIPが使える環境
が必要になりそう

テーマ : セキュリティ
ジャンル : コンピュータ

登録画面でエラーメッセージの表示方法

エラーメッセージの表示

#10 エラーメッセージを表示する
http://dotinstall.com/lessons/sns_php_v2/9610
を参考に
エラーがおきたときにエラーメッセージが表示されるようにする

signup.php の
HTML部分のform部分にある
<p>お名前:<input type="text" name="name" value=""></p>
の後ろへ
<?php echo h($err['name']); ?>
を追記

<p>メールアドレス:<input type="text" name="email" value=""></p>
の後ろに
<?php echo h($err['email']); ?>
を追記

<p>パスワード:<input type="password" name="password" value=""></p>
の後ろに
<?php echo h($err['password']); ?>
を追記

この状態で
ページで何も記入せずに送信するとエラーがでる

ただし、以前のものをコピペしていると
$_SERVER

$_SEVER
となっていることがあるので注意
これを修正しないとエラーが表示されない

ただ、このままだと入力した内容が消えて面倒なので
value="" のところを
value="<?php echo h($name); ?>"
というようにすれば
入力した内容がそのまま保存されている状態になる

ただ、パスワードに関しては
セキュリティのため毎度入力にしている

ソースにすると
<p>お名前:<input type="text" name="name" value="<?php echo h($name); ?>"><?php echo h($err['name']); ?></p>
<p>メールアドレス:<input type="text" name="email" value="i<?php echo h($email); ?>">
<?php echo h($err['email']); ?></p>
というように変わる

テーマ : プログラミング
ジャンル : コンピュータ

メールアドレスの形式および存在チェック

#09 エラーチェックを行おう (2)
http://dotinstall.com/lessons/sns_php_v2/9609
を参考に
メールアドレスの形式及び存在のチェック

変更するソースファイルは
signup.php のみ

メールアドレスが正しいかどうかは
filter_var()
を使う

filter_var($email,FILTER_VALIDATE_EMAIL)
で正しいか判定

正しくないか判定するには
if(!filter_var($email,FILTER_VALIDATE_EMAIL)){
}
となる

そして、もし正しくないならエラーを出す為
$err['email']='メールアドレスの形式が正しくないです';
とする

また、すでにメールアドレスが登録済みなら
ユーザ関数 emailExists() を使って
if(emailExists($email , $dbh)){
$err['email']='このメールアドレスはすでに登録ずみです';
}
というようにする

ユーザ関数
emailExists() は

function emailExists($email,$dbh){
}
としてDB接続して行う関数になる

この関数の中身は
$sql ="select * from users where email = :email limit 1";
として
$sql にSQLで検索した内容を格納

$stmt =$dbh->prepare($sql);
というように
prepare() へ $sql を指定する
prepare() はデータの挿入とか削除などにつかう

次に、プレースホルダーを使うので
$stmt->execute(array(":email"=>$email));
とexecute() 内部で配列を指定

$user =$stmt->fetch();
で$stmt からデータを fetch() でとりだして
$user へ格納

あとは return で
return $user ? true : false;
というように三項演算子で判定すればOK

テーマ : プログラミング
ジャンル : コンピュータ

CTF参考サイト(海外のがほとんど)

DEFCON CTF

http://ctftime.org/
でCTF開催予定、結果などがアーカイブされている

Hacker Japan (ハッカー ジャパン) 2013年 03月号 [雑誌]
をみて、今回興味深かったのは
CTFで戦うためにどんな準備が必要か
そして
何が必要なのかということがインタビューされていたこと

セキュリティカンファレンスが開かれているという
http://ja.avtokyo.org/projects
をみたけど、現在は
google グループ参加している人のみと言う状態のようだ

CTFはチームの最大人数はきまっているけど
最低人数はきまっていないので
1人で挑む事も可能

ただし、かなり苦戦すると思う

CTFに関係する勉強方法としては
受験や試験みたいに過去問による傾向と対策
そして
実践を通して学び、気づくことが重要とのこと

CTF TIME は twitter アカウントがあるので
フォローしてみると面白いかもしれない

今回 紹介されていたのは
ロシアチームのサイト
http://smokedchicken.org/

米CMUチームのPPPサイト
http://ppp.cylab.cmu.edu/wordpress/

オランダチームのサイト
http://eindbazen.net/

イギリスチームのサイト
http://0xbadf00d.co.uk/

shell-storm CTF repository
http://repo.shell-storm.org/repo/CTF/

CTF archive
http://captf.com/


CTF参加にあたり
英語とコミュニケーションスキルは必須で
英語ができれば海外チームとのコミュニケーションが取れるし
日本語化されていない技術情報へ
ダイレクトアクセスできるというメリットもある

テーマ : セキュリティ
ジャンル : コンピュータ

日本国内で開催されているCTF

日本国内で開催されているCTF

Hacker Japan (ハッカー ジャパン) 2013年 03月号 [雑誌]
にてCTF特集があったので、しばらくはCTFの勉強

日本国内で開催されているCTFに限っても

セキュリティキャンプのCTF
SECCON
CTF-challenge
ksnctf
Flaggers
HackIT
といろいろ

CTFの問題の特徴としては
ツールに頼るだけではとけない
奇をてらった手法を使わずとける
複数分野を網羅する
問題作成者以外の人に何らかの形で解かれている
というもの

とくに、基礎として必要なものは参考になった

TCP/IP のパケットを読み解く場合でも
3ウェイハンドシェイクを知っておかないとダメだったり

wireshark でパケットデータを解析するには
解析結果からデータを正確に読み取れるようになったり
という基礎が必要になる

効率よくスキルアップするためには
CTF問題の解説サイトでいろいろ問題を解いていく
とよいようだ

読むだけでは覚えないので
仮想環境を構築し
実際にハンズオンでやってみたり
実験結果をブログに買いたりというようにすると
アウトプットもあり効率的に学習できる
ブログに書くのはちょっと...
というように公開するのは不安というなら
ローカル開発環境を構築し
そこにwordpress をインストール
そして
ここに日々の記録をつけていけば
世間に公開することなくスキルを上げることができる

また、基本的にCTFはチーム戦となるので
自分の得意分野を特化させるのも重要


テーマ : セキュリティ
ジャンル : コンピュータ

CSRF対策

#07 CSRF対策を施そう
http://dotinstall.com/lessons/sns_php_v2/9607
を参考にCSRF対策を学習

今回、変更を加えるのは
signup.php になる

sha1はハッシュという技術で
暗号化とは異なる

暗号化は
鍵があれば元に戻せるけど
ハッシュは
元に戻せない

function setToken(){
}

function checkToken(){
}
というユーザー関数を作り

setToken() のほうは適当な文字列をつくり
それをセッションのほうにセットする

mt_rand()で適当な文字列を作成し
sha1() で暗号化する

これを$token に格納しておく

$token = sha1(uniqid(mt_rand(), true));
$_SESSION['token']=$token;
というようになる

そしてHTML部分に
<input type="hidden" name="token" value="<?php echo h($_SESSION['token']); ?>">
というように
hidden というタイプを設定することで
画面には見えないようにセットすることができる

こうしておけば php のほうで
token による判定ができるようになる

ソースをブラウザで見てみると
tokenの value が毎回変わるのを確認できる

次に、checkToken() で
セッションに入っているものが正しいか判定する

これには if を使う
if(empty($_SESSION['token']) || ($_SESSION['token'] != $_POST['token'])){

token が空
もしくは token がPOSTされたものと一致しない場合
ときの処理になる

このときの処理は
echo "不正なPOSTが行われました";
exit;
と表示して終了するようにする

PHP + MySQL でログイン画面作成

PHP + MySQL でログイン画面作成

#05 ログイン画面を作ろう
http://dotinstall.com/lessons/sns_php_v2/9605
を参考に
ログインチェックとログイン画面作成について学習

ログインチェックは
ログインしていないなら ログイン画面にとばすようにする

この動作をするlogin.php は
cp index.php login.php
でコピーして内容を改造していく

session_start();

if(empty($_SESSION['me'])){
header('location: '.SITE_URL.'login.php');
exit;
}


セッションの中に me という文字があるか調べる
内のなら
header() で指定のURLへ飛ばす
今回はlogin.php に飛ばす

そして、login.php の方のheader では
header('location: '.SITE_URL);
とすることで、index.php に飛ばすことができる

こちらの login.php では
フォームを作成して
メールアドレス
パスワード
の入力欄
そして送信ボタンを作成する
もし、登録していないのであるなら
登録画面になる signup.php へのリンクもつくる

フォームはPOSTで送信する

action="" というように空欄なのは
この
login.php 自身に送信するから

このフォームのソースは
<form action="" method="POST">
<p>メールアドレス:<input type="text" name="email" value=""></p>
<p>パスワード:<input type="password" name="password" value=""></p>
<p><input type="submit" value~"ログイン"><a href="signup.php">新規登録>はこちら</
a></p>
</form>

となる

次に、画面を読み込む前に
signup.php の作成を行う

#06 新規ユーザー登録画面を作ろう
http://dotinstall.com/lessons/sns_php_v2/9606
を参考に、ユーザ登録画面の作成

今後、自分でサービスを作る時にも使うので
覚えておくと後が便利

そして、このsignup.php も
cp login.php signup.php
として、ファイルをコピーしたものを改造したほうが
手間が省ける

この改造点は
すでにログイン判定はすませているので
if による判定を削除

あとはHTML部分の改造

完了したら実行してみたけど
画面が真っ白

ということで設定を変更

219行目のコメントアウトをはずし
sudo vim /etc/apache2/mods-enabled/mime.conf

AddHandler cgi-script .cgi .pl
へ変更

sudo vim /etc/apache2/sites-available/default

10行目へ
ExecCGI
を追記
Options Indexes FollowSymLinks MultiViews ExecCGI
とした

そして
AllowOverride None を
AllowOverride All へ変更し保存

sudo service apache2 restart
したものの、解決しないため

CentOSのローカル開発環境で実験したら
あっさりできた

ということで続き

フォームがPOSTされたか、そうでないかで
処理を分岐するため if を使う

if($_SERVER['REQUEST_METHOD'] !='POST'){
//SCRF対策
setToken();
}else{
checkToken();
}
というようにする

フォームを投稿したときにトークンをセットしておき
そのフォームがPOSTされたときに
値が一致しているか調べる

テーマ : プログラミング
ジャンル : コンピュータ

よく使う関数の登録

よく使う関数は登録

#04 便利な関数を登録しておこう
http://dotinstall.com/lessons/sns_php_v2/9604
を参考に、ホーム画面の作成と
関数を記述した外部ファイルを作成

vim function.php
で使う関数を記述しておく

まずDB接続するのを書いておく

function connectdb(){
try{
return new POD(DSN,DB_USER,DB_PASSWORD);
}catch(POEException $e){
echo $e->getMessage();
exit;
}
}

もし、エラーがあれば
echo $e->getMessage()
で表示する

DB接続には POD オブジェクトを作成する
return new POD(DSN,DB_USER,DB_PASSWORD);
がその部分
大文字で書いてあるのは定数


次にHTML出力の時のエスケープ
htmlspecialchars() を毎回かくのは面倒なので
function h($s){
return htmlspecialchars($s,EXT_QUOTES,"UTF-8");
}
というように作成しておく

この設定ファイルになる config.php
関数を書いた function.php ができたら

index.php を作成する

まずは、require_once()で設定ファイルなどを読み込む
require_once('config.php');
require_once('function.php');

このしたにHTMLで作成する

しかし、何も表示されなかったため

WordPress のインストール手順 (ubuntu 12.04 LTS)

を参考に、必要になりそうなパッケージをインストール
sudo apt-get install php5-cgi php5-mysql libphp-phpmailer php5-gd libjs-prototype libjs-scriptaculous tinymce libphp-snoopy libjs-jquery php-gettext libjs-cropper

もっとも、原因はもっと単純なミスで
require_once() で読み込むファイルを間違えていた

とりあえず、表示確認できたので

次に
以前 twitter アプリでつまづいた
ログイン画面の作成について
http://dotinstall.com/lessons/sns_php_v2/9605
を見ながら行っていく

テーマ : プログラミング
ジャンル : コンピュータ

ユーザ管理システム作成

ユーザ管理システム作成

ユーザー管理をするWebサービスを作ろう (全19回)
http://dotinstall.com/lessons/sns_php_v2
を参考に
PHP + MySQL で新規登録
ログイン
ログアウト
ホーム画面表示などを学習

まずは
ユーザ情報管理のためのDB作成

http://dotinstall.com/lessons/sns_php_v2/9602
を参考に作成

vim commands.sql として
sql ファイルを作成し内容を

メールは重複しないように unique をつけるようにし
id は自動連番にするので
id int not null auto_increment primary key;
とする

ソースにすると

create database dotinstall_sns_php;
grant all on dotinstall_sns_php.* to dbuser@localhost identified by 'w9EtratU';
use dotinstall_sns_php;

create table users(
id int not null auto_increment primary key,
name varchar(255),
email varchar(255) unique,
password varchar(255),
created datetime,
modified datetime
);

あとは、mysql でDB作成

mysql -u root -p < commands.sql
でsql ファイルからDBを作成
この場合パスワードを聞かれる

しかし
mysql -u root -pddpx22358 < commands.sql
というように
mysql のパスワードを -p の後に続けて書くと
そのまま実行になる

もし、テーブル作成で失敗しているのなら
データベースを一度削除してもう一度実行でOK

DB削除は
mysql -u root -p で
ログインして
drop database dotinstall_sns_php;
で削除できる

次に、設定ファイルを php で設定
共通のものは定数で作成して
分割したほうがメンテが楽

vim config.php で作成
まずは、そのまえに作成するディレクトリなども作っておく
mkdir /var/www/sns_php
cd /var/www/sns_php/

vim config.php でファイルを作成
これは
http://dotinstall.com/lessons/sns_php_v2/9603
を見ながら作成

php の定数の作成は
define() で行う
define('定数','内容');
となる

URLとかDBへの接続はほとんど定数にする
define('SITE_URL','http://192.168.10.248/sns_php');
というように
ローカル開発環境なのでIPを指定

そして
define('PASSWORD_KEY','xfd8sdf');
というように
パスワードをDBに入れる時に暗号化するのに使うものを作成する

そして、エラー出力について
NOTICE 以外はすべて表示したいので
error_reporting(E_ALL & -E_NOTICE);

セッションが有効になるディレクトリも指定するため
session_set_cookie_param(0,'/sns_php/');
として
sns_php の中だけセッションが有効になるようにする

テーマ : プログラミング
ジャンル : コンピュータ

PHP でのファイル分割

PHP でのファイル分割

#12 ファイルを分割してみよう
http://dotinstall.com/lessons/basic_php_advanced/6912
を参考に
PHPでのファイルの分割について学習

メンテなどを考えると
1つのファイルにすべて記述するのは好ましくない

このため、
クラスだけ別のファイルに書いて読み込むようにする

今回なら
vim user.class.php
として

class User {
public $name;
protected $email;

public function __construct($name, $email) {
$this->name = $name;
$this->email = $email;
}

public function sayHi() {
echo "hi! my name is ".$this->name;
}
}

class SuperUser extends User{
public function superSayHi(){
echo " URyyyyyyyyyyyyy!!! \n my email is ".$this->email;
}
}

というクラス部分だけ記述
そして、元の index.php の部分は
この部分は削除してOK

こうして分割されたクラスファイルを読み込むには
PHPの場合
require_once()
を使う

これは require_once('読み込むファイル');
というようにする

今回は、分割したファイルを
index.php で読み込みたいので
reqire_once('user.class.php');
とする

これで、分割前とおなじ結果になるなら成功

ほかにも
require()
include()
include_once()
などがあり、それぞれ挙動が異なる

require() はファイルを読み込むけど
require_once() は一度だけ読み込む

require()
は途中でエラーが起きた時エラーで強制停止する

include() はエラーで警告はだすけど実行はされる
という違いがある

テーマ : プログラミング
ジャンル : コンピュータ

PHPのクラス継承とサブクラス

クラス継承とサブクラス

#11 クラスを継承してみよう
http://dotinstall.com/lessons/basic_php_advanced/6911
を参考に
PHPでの継承とサブクラスについて学習

クラスをつくり、拡張したいときには
継承を使う

これは extends すればいい

例えば、
class User を継承して
SuperUser というクラスを作りたいのなら
class UperUser extends user{}

とする
ちなみに、継承すると
User で定義した
メンバー変数とかユーザ関数も使えるし
さらに書き換えて別の機能を実装することもできる

これが継承というもの
PHP以外にも java とかで使われる機能

あとは、クラスの中に新しい関数を用意してみた
public function superSayHi(){
echo "URyyyyyyyyyyyyyyyy !";
}

そして
あとは実体化するため
$bob = new superUser("bob","dummy@dummybob.com");
とする

クラスは設計図
new でこのようにかくことで実体化させることができる

superUser クラスで
User クラスと同じ構造で実体化できるのは
継承により
public function __construct($name, $email) {
$this->name = $name;
$this->email = $email;
}
も受け継いでいるため
再度 コンストラクタを書く必要性がない

あとは
$bob->superSayHi();
とすれば
Uryyyyyyyyyyyyy!
と表示される

あと、継承に関しては
public
private
の他に
protected が存在する

protected で宣言したメンバー変数などは
定義したクラスや
それを継承してできたサブクラス(継承して拡張したクラスなど)
でも使える
private との違いは
private だと
作成したクラスではアクセスできるけど
これを元に作成したサブクラスでは作った変数とかが使えないというようになる

ためしに、
class User {}
の中になる
public $email;

protected $email;

と変更して

class SuperUser extends User{}
の中の
echo の部分を
public function superSayHi(){
echo "URyyyyyyyyyyyyyyyy !";
}
から
public function superSayHi(){
echo " URyyyyyyyyyyyyy!!! \n my email is ".$this->email;
}
と変更すると

URyyyyyyyyyyyyy!!! my email is dummy@dummybob.com
となり
. で連結した文字部分の
$this->email;
が表示できているのがわかる

もし、
protected ではなく private にするとエラーになる

アクセス可能な領域により使い分けることになる

テーマ : プログラミング
ジャンル : コンピュータ

PHPのセッションについて

PHPのセッションについて

セッションを使ってみよう
http://dotinstall.com/lessons/basic_php_advanced/6907
を参考に
セッションについて学習

cookieと似て
複数ページで使い回しができる仕組み

cookieは、ブラウザーにデータを保存する

sessionは、サーバー側にデータを保存する

セッションを使うには、まず
session_start();
とする

そして、セッションに値をセットするには
$_SESSION['userName']="taguchi";
というように

$_SESSION['セッション変数']="セッションの値"
とする

このままブラウザーでよみこんでも
何も表示はされないけど

echo $_SESSION['userName'];
すれば
値として設定した
taguchi
が表示される

また、設定したセッションを削除するには
unset()
を使う

今回なら
unset($_SESSION['userName']);
というように
unset($_SESSION['セッション変数'])
とすることで
設定したセッションの値を削除できる

cookieと似ているけど
sessionのほうが安全性は高い

cookieは改ざんの可能性や
中身が見えるなど
セキュリティー関連の問題があるため
sessionのほうがセキュリティーは高くなる

ローカルセキュリティ検証環境構築

やられサーバーその3攻略準備

Hacker Japan (ハッカー ジャパン) 2013年 05月号 [雑誌]
を参考に BT5R3 を使ったローカルセキュリティ検証環境を作成、実践していきます

もう少しゆっくりとやっていく予定でしたが
Hacker Japan (ハッカー ジャパン) 2013年 07月号 [雑誌]
の開発者インタビューによれば
今後数ヶ月後には Kali Linux に移行するため
BackTrack リポジトリは閉鎖されるとのこと

このため、再現するのが難しくなりそうなので、やれるだけやっておこうと思います

BT5R3関連といえば

無線LANセキュリティの教科書2013 (DVD付) (白夜ムック)
も使って検証しているので
こちらも優先して行ってみます

とりあえず、解析に使えるらしい無線LANアダプタ
I-O DATA IEEE802.11n/a/g/b準拠 無線LANアダプター WN-AG300U
これを購入し実践していきます

以下はやられサーバーその3の攻略の準備です

virtualbox で仮想マシンを読み込み
ネットワークを
NAT からbridged に変更して起動

サーバー攻略の練習のため。ユーザパスワードを変更する

やりかたは単純で
ESC キーを押しながら仮想マシンを起動

するとGRUB 起動メニューが表示されるので
Ubuntu, kernel 2.6.15-53-386 (recovery mode)
を選択する

すると
root ユーザコンソールで起動する
見分け方は
root@gt:~#
となっているので
最初から root というのが確認できる

passwd hjtarget
でパスワードを変更しておく

パスワードは front242
としておく

あとは
reboot
して対象サーバーを起動すれば準備完了

ipアドレスはDHCPなので、まずこのサーバーを探すことから始まる


テーマ : Linux
ジャンル : コンピュータ

PHP と cookie

PHP と cookie

#06 Cookieを使ってみよう
http://dotinstall.com/lessons/basic_php_advanced/6906
を参考に
ブラウザにデータを保存する仕組みであるCookieについて学習

使い方は
setcookie("クッキーの名前","クッキーの値")
となる

setcookie("userName","taguchi");
で保存してブラウザでアクセスし
echo $_COOKIE['userName'];
を追記してから再度リロードすると

userName の中身である
taguchi
が表示される

また、
setcookie() には有効期限の設定ができる
というよりも
この有効期限を設定しない場合
ブラウザを閉じると消えてしまうので注意

書き方は
setcookie("クッキー名","値",有効期限)
となる

有効期限はUNIXタイムスタンプになる
2週間にするなら
time()+60*60*24*14
となる

time() で現在時刻
60*60*24*14

60秒*60*24*14という意味

あと、cookie の指定時間にマイナスで指定すると
削除する意味になる
なので、
setcookie('userName','' ,time()-60);
とすれば cookie の削除が可能

テーマ : プログラミング
ジャンル : コンピュータ

PHPからデータベースのレコードを更新、削除

PHPからデータベースのレコードを更新、削除

#05 データの更新・削除をしてみよう
http://dotinstall.com/lessons/basic_php_advanced/6905
を参考に
データベースのレコードを更新、削除
影響を受けたレコードの数の表示を学習

PODでデバッグするときには
エラーメッセージを表示させる
var_dump($stmt->errorInfo());
が便利

今回は、更新と削除ということで
名前が n から始まる人のメルアドを
dummy
に変えてみる

これには
prepare()
内部で SQL を発行し実行すればいい
実行するのは
更新に使う update

そして where とlike をつかう
これに関しては
#10 条件付きで抽出してみよう (1)
http://dotinstall.com/lessons/basic_mysql_v2/7410
を参考にするとわかりやすい

通常、where をつかうけど
文字列で あいまいな検索をするなら
like をつかう

今回、発行するSQLは
update users set email = :email where name like :name"

この意味は
users テーブルの email を :email に変更する
変更場所は where で指定している
name が :name になっている場所
という意味

:email
:name
はプレースホルダーの ?.?の代わりなので
execute() の中で
array() で指定する

また、mysql で ~から始まるというようなときには
%をつける
今回のように
nから始まるというなら
n%
となる

なので、
execute(array(":email"=>"dummy",":name"=>"n%"))
というようにする

これで、mysql -u root -p
でログインして
select * from users;
で確認すると
email カラムの内容が
dummy に変更されているのが確認できる

次に、削除について
今回はパスワードがp10 のものを削除する

削除するためのSQLは
delete を使う
削除も prepare() を使って実行する

発行するSQLは
delete from users where password =:password
これで、users テーブルの password が
:password になっているものを削除する

:password は ?のプレースホルダーの代わりなので
これも
execute() の中に array() で指定する

今回は p10 の部分を削除したいので
execute(array(":password"=>"p10"))

これだけでも消すことはできるけど
何件削除したか表示したほうがわかりやすいので
rowCount() を使うことで、
何件削除されたかを知ることができる
これを echo で表示すればOK

echo $stmt->rowCount() ."records deleted";
というように
PHP では . でjavascript の+のように文字列連結を
. で行えるので、
分かりやすい文章を表示できる

私の場合だと10件有ったので
10 records deleted
と表示されました

テーマ : プログラミング
ジャンル : コンピュータ

プリペアードステートメントとbindParam

プリペアードステートメントとbindParam

#04 データを挿入してみよう (2)
http://dotinstall.com/lessons/basic_php_advanced/6904
を参考に
プリペアードステートメントとbindParam
の使い方
そして
挿入されたレコードのIDの取得を学習


プリペアードステートメントの違った書き方
まず、
prepare() で
SQLを用意する

プレースホルダーには
?,?,? ではなく
:変数名,:変数名,:変数名
の方を使う

結果については、変数 $stmt に格納

ソースにすると
$stmt = $dbh->prepare("insert into users (name,email,password) values (:name,:email,:password)");

次に、
bindParam() を使うことで、
それぞれのプレースホルダーと変数を結びつける

bindParam(":プレースホルダ変数",$変数)
というように書く
今回なら
$stmt->bindParam(":name", $name);
$stmt->bindParam(":email", $email);
$stmt->bindParam(":password", $password);

次に、結びつけた変数に値を代入
$変数 ="代入する値";

今回なら
$name = "n10";
$email = "e10";
$password = "p10";

あとは、
execute()
を引数なしで実行すればOK
$stmt->execute();

これで、ブラウザで確認してみて
mysql -u root -p
でログインし
use blog_app;
select * from users;

代入した値が反映されていれば成功

かなり面倒な書き方だけど
データの一部だけ変更して挿入するときなどには有効な手段になる

$name="n10";
$email="e10";
$password="p10";

$stmt->execute();


$name = "n10x";
$stmt->execute();

とすることで
1つ
name=n10x
で他の値は同じというものが作成される

値を変更したら
execute();
するのを忘れずに


あと、最後に insert された値のIDを知るには
lastInsertId()
を使う

これを echo で表示すればIDが表示される

これで、ページをリロードして
表示された数値と
DBで
select * from users;
で表示される id の値が同じになる

動画では44だけど
私の場合DBにそこまで書き込んでいないので
19になりました

テーマ : プログラミング
ジャンル : コンピュータ

PHP + MySQL のデータ挿入

PHP + MySQL のデータ挿入

#03 データを挿入してみよう (1)
http://dotinstall.com/lessons/basic_php_advanced/6903
を参考に
プリペアステートメントを使ったDBへのデータ挿入を学習

SQL文をつくるとき
データをエスケープしなくてはならない場合
プリペアードステートメントを使うのが一般的

エスケープさせるのは
DB破壊されるのを防いだり
いろいろと悪意あるコードを使われるのを防ぐため

いままでは
query()をつかっていたけど
プリペアードステートメントを使う場合には
prepare() をつかってSQLを発行する

$stmt = $dbh->prepare("insert into users(name,email,password) values(?,?,?)");

values() の中身が
?,?,?
となっているけど、これはプレースホルダーといって
ここにはいる命令を次の文に埋め込むときに使われる

埋め込むには
execute() をつかい、配列で与える

今回なら
name = n
email = e
password = p
という単純なものにするので
$stmt->execute(array("n","e","p"));
とする

最後にわかりやすくするため
echo "done";
としてページを開くと
DBにデータがかきこまれている

確認するには
mysql -u root -p
でログインして
use blog_app;
select * from users;
で中身を確認すると
今回挿入した内容が反映されているのが確認できる

ちなみに、後から書き込むための
?,?,?
ではわかりにくい場合
別の書き方がある

この場合、?の代わりに :変数名
というようにする

今回なら
values (?,?,?)
の代わりに
values (:name,:email,:password)
というようにしている

この場合だと
execute() の中身も
execute(array("n","e","p"))
から
連想配列のように
execute(array(":name"=>"n2",":email"=>"e2",":password"=>"p2")
というように
先にプレースホルダーで指定した
:変数名=>
が各値につくようになる


確認するには
mysql -u root -p
でログインして
use blog_app;
select * from users;
で中身を確認すると
今回挿入した内容が反映されているのが確認できる

どちらでも同じだけど
ソースコードのメンテなどの保守も考えると
わかりやすいほうを選ぶほうがよいと思う

テーマ : プログラミング
ジャンル : コンピュータ

PHP でDBのデータの表示

PHP でDBのデータの表示

#02 データを全件表示してみよう
http://dotinstall.com/lessons/basic_php_advanced/6902
を参考に
DBアクセスして、テーブル内のデータ全件表示方法を学習
そして、レコード件数の表示についても学習

今回は処理について

sql 文は、PHPの場合変数へ格納することができる
$sql ="select * from users";

そして、この変数に格納したSQLを実行するには
query()
を使う

この query() で実行された結果も
PHPなら変数へ格納することが可能

$stmt =$dbh->query($sql);

ちなみに、$dbh は
接続するDB情報が格納されている変数で
$dbh = new PDO('mysql:host=localhost;dbname=blog_app','dbuser001','dbpwd0001');
となっている

この変数に格納されたSQL実行結果の取りだしには
fetchAll() を使う

今回は
$stmt に格納されているので

$stmt->fetchAll(PDO::FETCH_ASSOC)
というようにする

これを foreach() でまわしながら取得する
foreach($stmt-?fetchAll(PDO::FETCH_ASSOC) as $user){
var_dump($user['name']);
}

これは
$stmt->fetchAll(PDO::FETCH_ASSOC)
の中身を
$user に1つずつとりだして代入している

var_dump() のところの
$user は、いわばDBの内容になる
そして、
$user['name']

name は
DB の users にある name の部分ということ

これを追記して
結果が
string(7) "taguchi" string(6) "tanaka" success!
というようになれば成功

おなじになっているのか確かめるには
mysql -u root -p
でログインして
use blog_app;
select * from users;
を実行して、この結果とおなじか確かめることができる

次に、件数の表示

これは
まずは、query() の中に件数を表示するSQLを記述

$dbh->query("select count(*) from users")
そして、この結果を
fetchColumn() で取得
これで件数がわかるので
echo で出力すればOK
あとは、わかりやすいように

PHP では . で javascript の + みたいに文字をつなげられるので
. "records found"
というように文字をつなげる

これらをソースにすると

echo $dbh->query("select count(*) from users")->fetchColumn() . "records found";
というようになる

これで
2records found
と表示される

テーマ : プログラミング
ジャンル : コンピュータ

PDO で DB接続

#01 データベースに接続してみよう
http://dotinstall.com/lessons/basic_php_advanced/6901
を参考に、PODによるDBの接続

ただし、DBが必要なので
先に作成しておく

つかうDBは今回は mysql

vim setdata.sql
で sql ファイルを作成

create database blog_app;
grant all on blog_app.* to dbuser@localhost identified by 'dbpw0001';
use blog_app;
create table users (id int(11) not null auto_increment primary key,name varchar(50),email varchar(255),password varchar(16));
insert into users(id,name,email,password) values(10,'taguchi','taguchi@gmail.com',1234);
insert into users(id,name,email,password) values(11,'tanaka','taguchi-tanaka@gmail.com',1234555);

という内容で保存

mysql -u root -p < setdata.sql
でDB作成

作業ディレクトリ作成ということで
mkdir /var/www/myphp

ここに index.php を作成して実行

PHPからDB接続するには
try{
接続処理
}catch(){
例外処理
}

というようにする

PDO接続するには
$変数名 = new PDO();
というように書く

今回なら
$dbh = new PDO();
ちなみに、
dbh はdata base handler の略

実際にDB接続するときの構文は
$変数名 = new PDO('mysql:host=ホスト名;dbname=DB名','DBのユーザ名',.'DBのパスワード');
となる

今回は
DB=blog_app
ホスト名=localhost
DBユーザ名 = dbuser001
DBパスワード = dbpw0001
なので
$dbh = new PDO('mysql:host=localhost;dbname=blog_app','dbuser001','dbpwd0001');
となる

次にエラー処理
これは catch() のところに書く
catch(PODException $e){
var_dump($e->getMessage());
exit;
}
として終了する

もし、DB切断にしたいのなら

$dbh =null;

というように
$dbh のような変数に null をいれればOK

catch(PODException $e){
のところは java などでもよくみるので
経験あるとわかりやすいかも

ちなみに、exception は例外という意味

そして、DB接続成功なら
echo "success!";
と表示するようにする

これで
success
と表示されているなら成功

テーマ : プログラミング
ジャンル : コンピュータ

php-pdoとpdo_mysqlをインストール

SQLSTATE[28000] [1045] Access denied for user
がでてきたので、
php-pdoとpdo_mysqlをインストールしてみました

実際の問題は、ただ単に面倒だったのでコピペで sql ファイルを
作ったのが失敗で、全角文字が入っていたというだけでしたが

今回、使用した環境は
CentOS 6.4 64bit

http://www3441ui.sakura.ne.jp/wordpress/?p=479

を参考に実行

yum install mysql-devel
cd /usr/lib64/php/modules/
pecl install pdo_mysql
あとは
extension=pdo.so
extension=pdo_msql.so

/etc/php.ini の 937 行目あたりに追記して
apache再起動

これで設定完了

テーマ : Linux
ジャンル : コンピュータ

AmazonS3 でサイト運用

AmazonS3 でサイト運用

#16 S3でウェブサイトを運用する
http://dotinstall.com/lessons/basic_aws/9516
を参考に
S3でのサイト運営について学習

まず、Create Bucket でバケット作成

Bucket Name には
独自ドメインを設定する

作成できたら
バケットの設定を変更する
Permissions
Website
この2つを変更する

まず、permissions で
Add bucket policy
にチェックを入れる

すると
sample bucket policys へとんで
2番目をコピーしてはりつける

そして、bucket の部分を独自ドメインに変更

このbucket policy を設定することで
公開する設定を毎回やらなくてよくなる

次に web site

これは
Enabled にチェックをいれて
index Document に
最初に表示するファイル
大抵の場合は
自作した index.html になるので
index.html を記述
あと、Error Documents には
エラーのときのファイルを指定するけど
とくに指定しなくても稼働はできる

設定終了後、save をクリック

あとは、必要なファイルをアップロードしていけばサイトの出来上がり

テーマ : Linux
ジャンル : コンピュータ

フォームからのデータ受け取りについて

フォームからのデータの受け取りについて

#32 フォームからのデータを受け取ろう
http://dotinstall.com/lessons/basic_php_beginner/6832
でフォームからの値の受け取りについて学習

PHPのフォームから受けとったデータを処理するのに使う

今回の注目点は
<form action="get_info.php" method="post">
のところ
これは
get_info.php に送信して
送信はPOST形式で送るというもの

今回、送るデータは
<input type="text" name="birthday" value="">
のところ

受けとるほうは
$birthday = $_POST['birthday'];
として受けとる

ちなみに、送信方法が
method ="get" だった場合
$_GET になる


そして、このbirthday の値を元に曜日を返すようにする
これは
date() をつかう

フォーマットには l を使うと曜日になり
UNIXタイムで取得するので
strtotime($birthday)
という引数にする
$youbi = date("l",strtotime($birthday));
これで、
フォーマット l で 曜日にした birthday のデータが
$youbi に格納される

あとは、この $youbi をHTMLのソースのほうで
echo で出力する
<?php echo htmlspecialchars($youbi); ?>
とすればOK

出力するときには
htmlspecialchars() で無害化するのを忘れずに

テーマ : Linux
ジャンル : コンピュータ

PHP でファイルからデータ読み出し その2

PHP でファイルからデータ読み出し その2

#31 ファイルからデータを読み出そう (2)
http://dotinstall.com/lessons/basic_php_beginner/6831
に、もっと簡単なデータの読み出しがあったので
これも学習

これは
file_get_contensts()
を使う

これも変数に格納できるので
$contents = file_get_contents($testfile);

でもOK

また、URLを指定することも可能
$contents = file_get_contents("http://dotinstall.com");
とすれば、ドットインストールのソースを
とってくるということもできる

あと、
$contents =file($testfile);
というように
file() を使うと、指定したファイルの内容を
1行ずつ読み込むようになる

使い道としては
web api 関連が一番おおそう

テーマ : Linux
ジャンル : コンピュータ

PHP でファイルからデータ読み出し

PHP でファイルからデータ読み出し

#30 ファイルからデータを読み出そう (1)
http://dotinstall.com/lessons/basic_php_beginner/6830
を参考にファイルからデータ読み出しを学習

今回、書き込みに使ったように
読み込みでも
fopen() を使う
ただし、今回のモードは
r
となる

そして、できたかどうか判定するため
if を使って判定する
if(!$fp = fopen($testfile,"r")){

この判定がうまくいったら
ファイルの読み込みをするので
fread() を使う

第1引数に、ファイルポインタ
第2引数に、ファイルサイズを指定する

ファイルサイズ指定は、大抵の場合はファイルサイズの最大値になるので
filesize($testfile)
というように対象のファイルを格納した変数になることがほとんど

ちなみに、今回の動画だと
$testfile ="test.dat";
と指定しているので
filesize($testfile)
としている

この読みこんだものは変数に格納可能
$contents = fread($fp , filesize($testfile));

あとは
var_dump() で中身を確認

ファイルを開いた場合、クローズは閉じるのがセットなので
fclose($testfile);
で閉じることを忘れずに

テーマ : Linux
ジャンル : コンピュータ

PHP でファイル書き込み

PHP でファイル書き込み

#29 ファイルにデータを書き込もう (3)
http://dotinstall.com/lessons/basic_php_beginner/6829
を参考に、PHPでのファイル書き込みに付いて学習

この判定にはif を使う
if(fwrite($fp,$contens) === false){
echo "could not write";
exit;
}

これで false だった、つまり書き込みできないのなら
echo "could not write"
を実行して
exit で終了している
PHP の場合 === として == とおなじ意味になる
正確には、==より厳密な比較になる
これだと型まで比較できるようになる

if(fwrite($fp,$contens) === false){
echo "could not write";
exit;
}
で成功したら
echo "success";
で表示して

最後にファイルを開いたら閉じるので
これには fclose() をつかう
C言語でも ファイルのオープン、書き込み、ファイルクローズがあるけど似た様な処理になる

今回の場合には
fclose($fp);

となる

実行するとからのファイルへ
追記されているのがわかる

Ubuntu でおこなうときには
chmod 777 test.dat
としてパーミッションを変更する必要があるので注意

テーマ : Linux
ジャンル : コンピュータ

UNIXタイムの取得

UNIXタイムの取得

#25 日付/時間関数を使ってみよう (1)
http://dotinstall.com/lessons/basic_php_beginner/6825
を参考に
UNIXタイムの取得について学習

UNIXタイムからの経過時間をみるには

var_dump(time());
でみれる

また、mktime()で指定した時間のUNIXタイムで表示できる

引数は
時間、分、秒、月、日、年
の順番

例えば
2013/6/17 7:55:00
なら
mktime(7,55,0,6,17,2013)
となる

strtotime()
これは、日付の文字列からタイムスタンプを作成する

strtotime("2013/6/17 7:55:00")
とすると
UNIXタイムが表示される

このstrtotime()は使い勝手がよく
strtotime("last Sunday")
とすれば先週の日曜日のUNIXタイムを表示し
strtotime("+ 2day")
とすれば、2日後のUNIXタイムを表示できる


--
から送られてきた高速メモ帳
最新記事
検索フォーム
GREEハコニワ攻略サイト
リンク
カテゴリ
月別アーカイブ
フリーエリア
最新記事
FXプライムレート
最新コメント
最新トラックバック