PHP関西2014 メモ


断片的。ところどころ適当。

## Arduino をPHPで制御する

@oasynnoumさん

- SerailPort を制御するモジュール
	
	http://sandbox.n-3.so/Gorilla/

- USB制御モジュール (libusbラッパー)

	http://oasynnoum.hatenablog.com/entry/2013/03/22/013251

- ウィーンモジュール

	https://github.com/oasynnoum/php-eject
	http://eject.kokuda.org/


### アジェンダ

- firmata プロトコルを実装した PHPライブラリ PHPMake\Firmata を使う

Firmata<ファルマタ>

### About: Firmata Protocol


- ホストから(ArduinoやRasberryPi)デバイスを制御するためのプロトコル
- シリアル通信でする

ホストからデバイスにリクエストを投げ、デバイスはそれに応じて動作して、必要に応じてレスポンスを返す

- 必ずしも「リクエスト対レスポンス」ではない
	- デバイスが断片的にピンの状態を通知したり
	- ホストから一方的にピンの状態を変化させたり
- 通信データはMIDIメッセージ形式
- 色々なデバイス側の実装がある
	- https://github.com/firmata
	- Arduino Uno が有名. Rasberry Pi とか。
- 最大 0xF個のデジタルポートをサポート
	- 8このデジタルピンが1つのポート
	- 最大 128個のデジタルピン
- 最大 0xF個のアナログ入力ピンをサポート

- メリット
	- 手軽プロトタイピング（スクリプティング）
	- ホスト側でプログラムを書けば、言語は何でもいい
	- デバイスが firmata を実装していれば、デバイス専用のプログラミング(IDEなど)をしなくていい
	- ホストとデバイスが協調動作するようなアプリ開発
	- 場合によってはホストから電源供給

- デメリット
	- ケーブルで繋がっている必要がある
	- firmata over XBee とかアイデアはあるっぽい（実装がまだぽい
	- ホストが無いと何もできない
		- デバイスだけを動かせばいいようなアプリの場合、ホストの計算資源を要求するため無駄がでかい

### StandardFirmata 概要

- Firmata のデータ形式を大雑把に
	- シンプルな固定長コマンド
	- 可変長データを内包するコマンド(SysEx)
		- # define START_SYSEX 0XF0
		- # define END_SYSEX 0XF7

- リセット時、デバイスからメッセージが送られる

- ファームウェア情報の取得
	- pack("C3", START_SYSEX, REPORT_FIRMWARE, END_SYSEX)
	- これをシリアル通信に書き込む
	- ファームウェア名とバージョン番号がレスポンスで帰ってくる
- ピンを調べる
	- pack('C3', START_SYSEX, CAPABILITY_QUERY, END_SYSEX)
	- ピンの総数とピンそれぞれの機能がこれでわかる
	- 定義されてる Capability の一覧
		- digital input
		- digital output
		- analog read
		- PWM (パルス幅変調)
		- servo (サーボモータ)
		- I2C (シリアル通信機能)

スライドは後で流します: http://www.slideshare.com/oasynnoum/phpmake-firmata-36396063


デモ（宇宙旅行っぽいゲーム）

## PHP と Sencha Ext.Direct

@martini3oz さん

- Single Page Application
- Sencha
- What's Ext.Direct and How do run Ext.Direct
- まとめ

### Single Page Application

- ページ遷移をせず、 HTML5/JSを使ってクライアント側で画面を書き換え
- JSONでやりとりする

### Sencha とは？

- HTML5まわりの取り組みをしてる企業

### Sencha Ext JS 5

- HTML5/JS フレームワーク

### Ext.Direct

- Remote Procedure Callの実装

(ここで力尽きた)

## 安全なPHPアプリケーションの作り方2014

徳丸センセイ

関西は初めてなので基本的な事を。

### Adjenda

- 脆弱性の話
- プラットフォームの脆弱性
- パスワードの保護

#### CSRF

- Form を踏ませる罠。攻撃後の結果は攻撃者は見れない
- 最悪は、 SQL Injection や XSS ほどではない

- 横浜の。片山さんの。
	- CSRF のを。
	- demo
	- 日本で一番売れているPHP教科書のサンプル
		- 罠があるよね
		- いろいろ書き込めるよね
- 対策は
	- Token 一択でしょ
		- Tokenはワンタイムトークンじゃなくていいでしょ
		- セッション別に覚えておけばいいでしょ
		- 予測できたら困るので、 openssl_random_psud_bytes とか
		- /dev/urandom とか。

#### XSS

- 利用者のブラウザ上で攻撃対象のドメインで攻撃者が自由にJavascriptが実行できる
- XSS のデモ
	- alert で行けます。飽きました。
	- 一同成功すると、他人でも同じ内容の投稿ができてしまう
- 対策は？
	- htmlspecialchars
		- 引数に注意
		- 書かないと日本語がバッサリ切られてエロイことになる
		- PHP のバージョンでデフォルト引数が違うので。
	- 属性値はダブルクオート
	- レスポンスヘッダで文字エンコーディングを指定
	- Javascript の動的生成を避ける

#### SQLInjection

- SQL の内容を攻撃者が書き換えられる。
- 場合によっては中身の漏洩、改ざんできる
- 使い勝手のいい攻撃ツールが安く手に入る

```php
$id = '88-1';
sprintf('SELECT * FROM PORTS WHERE id=%d', mysql_real_escape_string($id));
```

実行すると、id=87のが引っ張ってこれる。

- 漏洩は？

```
$id = '88-(SELECT ID FROM MEMBERS WHERE ID LIKE CHAR(49) ESCAPE IF(SUBSTR((SELECT EMAIL FROM MEMBERS LIMIT 1,1), 1,1)>='M', 'a', 'ab'))
```

こんな感じで 1bit の情報を取り出してくる

sha1なら md5-database.org で引っ張ってこれる

- 対策
	- エスケープは難しいので、プレースホルダー一択
		- 動的の場合、エスケープの処理がはいるので、そこに脆弱性が入かもしれないので、静的をおすすめ
	- 接続時に文字エンコーディングを指定
	- ```
bindValue(':id', (int)$int, PDO::PARAM_INT); // ちゃんと値の方も指定しないと上手く
動かなことがあるので注意
```

### プラットフォームの脆弱性

例えば、PHPを避ける（今ではこの文は消えているが…IPA…）

1. PHP自身にも脆弱性が多い
2. PHPが脆弱性のあるコードを生み出す

でも過去の話。

1. しかし、たまにすごい脆弱性…
	
	1. CVE-2012-1823とか…

脆弱性対策はどの言語でも。

PHP5.3はそろそろ、終わり。
2〜3年でPHPのバージョンが変わるので少し大変。

#### バージョンアップに付き合うには

1. バージョンアップ方針を決める
	- とことん付き合う
	- 影響を受ける脆弱性があるときのみアップデート
	- Linux ディストリビューションに依存
2. フレームワークやDB,ライブラリなども
2.	サポート計画を検討
	- RH/CentOS のパッケージで入れれば10年サポート
	- Redhat/CentOS5 の PHP5.1.6もメンテされてる（2017年まで）

#### SNS/PHPMyAdmin などの脆弱性対策

情報通信研究機構webサイトの改ざんがあった。

研究者が自身で入れていた Joomal を1.5ヶ月前に発見された脆弱性の攻撃を受けた。

定期的に確認してアップデートするのをお勧め

### パスワードを保護しよう

最近多いよね。パスワードリスト攻撃。

Linkedinから650万のパスワード漏洩。一昨年ぐらい？。sha1のパスワードを、総当りで5.4Mのパスワード解読を1週間でけた。（実は 5.4Mの計算したわけではなく、同じパスワードの人が割りといたっぽい）

1. 塩をふる（salt）
	- パスワードの前に20文字の適当な文字列を入れたハッシュ値を入れる。
	- ソルトの要件
		- ある程度の長さ必要
1. stretching
	- ハッシュ値の計算を一万回（例え）やる。

#### パスワードをハッシュ値で保存する場合

- パスワードリマインダーが実装できない。パスワードリセット。
- php5.5 以上なら password_hash 関数を使う

詳細は徳丸本を :-)

## PHP4番フレームワーク乱戦

皆が流血、血みどろになり、血で血を争うとんでもない事に…なりません。

### CakePHP

@slywakerさん

- Cake 1.3 2010 PHP4.3.2~
- Cake 2.x.x 2011 PHP5.2.6~
- Cake 3.x.x 2014? PHP 5.4.19~

#### CakePHPの誤解

- 設定より規約: 各コード量を減らすが目的
- 甘い: 名前が。ここを掘り下げていきたい
- FullStackFramework
- CakePHP is a framework of enterprise

##### 長期間サポート

1. サポート期間長い。

RH := RedHat

- RH5 PHP5.1.6 2007-2017 : Cake1.3 2010〜2014/06/25
- RH6 PHP5.3.2 2010-2020 : Cake2.5.2 2011〜2014/06/15
- RH7 PHP5.4.x 2014-2024 : Cake3.0.0-alpha1 2014/06/26


1. Official Support

CakeDC (Cake Development Corporation)

細かい機能はPluginに移譲していってる形

### Symfony

@77web さん

#### Symfony = 嫁

口うるさくて面倒見の良い姉さん女房 (しゅうｔｍ…）
永く付き合える。

PHP5.3.17以上（PHP5.3.16以下だとバグあるからやめとけ）

#### Symfony1の方へ

Synfomy1 != Symfony2
doctrine1 != doctorine2

……(´；ω；｀)ﾌﾞﾜｯ

#### 日本Symfonyユーザ会

Twitter: #symfony_ja

東京を中心、関西も？

#### バージョンアップ

現在2.5.0、LTS2.3.16(安定動作バージョン)

### Laravel


@codebyjeffさん。from オーストラリア

#### Do you like?

```
// PHP:
<?= (isset($val)) ? $val : "" ?>

// Laravel on Blade:
{{$val or ''}}
```

Eloquent を使えば、ORM周りが短くなる

PHPMyAdmin → php artisan migrate !!

`The Blue Collar Framework`

Taylor(Laravelの製作者)も毎日webサイトなど作成している。彼のノウハウをLaravelに落とし込んでる。


#### Under ther Hood

Symfony + Composer = Laravel

#### What's Special?

- Eloquent: O/RM Active Recode : Many-to-Many is easy `$student->pivot->sync()`

- Authentication: Build-in: 拡張/置き換え可
- Resource Controller
	- Make Restful dead easy
	- great backend for js framework

- Tinker (REPL)
	- CLI Access to code, including models
	- コードの簡単なテストを試すことができる
- Artisan
	- cli for commands to handle migrations, generate scaffolding.

#### My Best think Laravel.

- Makes you think more about what you framework is?
	- Laravel is Encourages better design patterns.
	- Laravel を使っていくうちに、いいコンポーネントを使うこともできるし、他のコンポーネントを使うこともできる。

- Even if you neber replace components, teaches you to decouple and test.
	- コンポーネントが教えてくれることもある

- 6month minor release rollout schedule (May & Oct.) - in sync whth Symfony.
	- Symfony に追従してる形

### FuelPHP

@mkkn_info さん

CodeIgniter => FuelPHP

- PHP5.3~
	- namespace
	- closer
- 1.7。もうじき1.8

http://fuelphp.com/


#### 機能

- controller/action/param のURL構成
- View: PHPの標準パーサ
	- 他の parser Plugin がついてる
- Scaffolding
- CLI Task running

#### Why FuelPHP?

規約より設定

- フレームワークに縛られない方向
	- composer を後から入れたので、FuelPHPからcomposerの Autoload を呼ぶ

Simple

- コードが読みやすい
	- PHP5.3~
	- DIコンテナがなく、Autoloader を差し替える形
(力尽きた

http://fuelphp.jp/

#### Fuelphp2.0

- PHP5.4~
- Composer Base
- Coreを分割
- いつでるかわからない


(LT見たけど気力など無い