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なので、まずこのサーバーを探すことから始まる
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再起動
これで設定完了
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 をクリック
あとは、必要なファイルをアップロードしていけばサイトの出来上がり