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
として
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なので、まずこのサーバーを探すことから始まる

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になりました