プログラミング

clock_nanosleepを使ったタイマ処理

タイマを使って定期的にサーバにPOSTするプログラムを組んだ際、途中でタイマが止まってしまう不具合が発生しました。
これは定期実行のために使っていたsetitimerの設定がlibcurlのタイムアウト処理で上書きされてしまうのが原因でした。
setitimerはプロセスごとに固有なため、lubcurlを使うならsetitimerは使えません。というわけで、clock_nanosleepを使ってやってみました。

interval秒ごとにfunc関数を呼び出します。
別スレッドやシグナルハンドラで*termがtrueにセットされるとループを抜けます。

CSS tips float の罠?

おはようございます。将来の夢はイタクァに宇宙旅行に連れて行ってもらうことなゆうきんです。

ちょっと FuelPHP のサンプルページを凝って作ってみようとしたら、悩んだことがあったのでメモ。

 

float: left のように要素の回りこみを指定していると、それより下に書いた要素が、回りこみを指定した要素の表示位置と重なってしまうという現象。

これ、地味に困りました。

例えば、 css が

これで、 view が

の場合、私は

css のテスト1

こうなって欲しかったのですが、実際は

css のテスト2

こうなります・・・。

緑の部分が、青と赤の下に行ってしまうんです、

仕様を考えれば当然のことなんですが、これでは困るんですよね。

というわけで、以下の様に直して下さい。

そうすれば、想定した通りの配置になります。

これでOKです。

擬似要素である :after で「何もない」要素を表示しています。

content に指定したものが表示されるんですが、 “” という空の文字列を指定することによって、何もない要素としてます。

display はその要素をどう表示するかの指定で、今回はインラインでは困るのでブロックを指定してます。

clear は回り込みの解除するかどうかの指定です。 both で全ての回りこみを解除しています。

これで、 div の後に回りこみを無視する空の要素を表示することによって、次に表示する要素を、既に表示している要素の下に表示させることができるのです。

しかし、先ほどのビューの場合、赤 div の回り込みが残っているため、直後に表示する要素は、緑と同じ運命を辿ります。

そこで、回り込みのない div で青と赤をくくることにより、解決を図っているのです。

 

今回は、div 全てに :after を指定しましたが、今回の場合は、くくった div にのみ指定するのが正しいのかもしれません。

通常の div を表示する場合でも特に害がない(?)ので、私は div 全ての指定していますけどね。

では、おやすみなさい。

認証 その4 SimpleAuthユーザ管理画面を整理

前の記事でデータ操作を一通りできるようになったので、ここで表示まわりを少し整理しましょう。

一覧のパスワード、ログインハッシュ、Profile fieldsを削除します。また、一覧からのViewもとくに必要ないので削除します。

 

fuel/app/views/admin/user/index.phpから該当部分を削除します。変更後のコードは以下のようになります。

Last loginはタイムスタンプを日付+時刻の形式で表示するようにしました。

 

表示してみましょう。

表示変更後の一覧

 

だいぶすっきりしました。

 

FuelPHP SimpleAuthをいじっていたらブラウザが310リダイレクトループエラーに

何かの拍子に、SimpleAuthがリダイレクトエラーでログインできなくなってしまった。

閲覧履歴を削除してもダメ。

一旦データベースのusersテーブルとmigrationsテーブルを削除して$ oil r migrateしたら直った。

詳しく調べていないので原因は判りません。

CSS tips FuelPHPのTemplateで使えそうなもの

おはようございます。実家の犬に会いたくて禁断症状が出てきたゆうきんです。

チュートリアルでCSSの説明をする気はないと言ったな?…あれは嘘だ。

ちょくちょく自分でも忘れるのでメモがてら、私がTemplateコントローラで使っているCSSを書きます。

 

まず。これが私のTemplateです。

これを使うことを前提に書きます。

 

div を左右に並べる

#menu と #main を左右に並べてみます。

float: left とは「要素を左に回りこませる」という意味です。

これで、左右に並べて表示できます。

しかし、画面を小さくしすぎると、配置が変わってしまうので注意です。

 

div を常に画面中央に表示

これで、ウィンドウのサイズを変えても #content が画面の中心に表示されるようになります。

さらに、widthを指定しているので、ウィンドウサイズを小さくしても #menu と #main の配置が変わることがなくなります。

 

とりあえず、こんなところでしょうか。

本当はもっとごちゃごちゃ書いてあるんですか。装飾なので気にしないで下さい。

この記事はもしかしたら、随時更新していくかも知れないです。

では、おやすみなさい。

チュートリアル 画像認証

前 チュートリアル セッション

次 未定

 

おはようございます。給料日前はいつもぎりぎり生活のゆうきんです。

captcha(キャプチャ) というものはご存知でしょうか。

よくユーザ登録などの際に、画像中の文字を入力して下さい とか言ってくるあれです。

主にスクリプトやBOT対策のために使用されます。

だって、機械がルーチンワークで登録繰り返したらあっという間にDBいっぱいになっちゃうじゃないですか。

そこで、画像認証は必要なものなのです。

FuelPHP で使える画像認証用のライブラリが公開されているので、簡単に実装できます。やったね!

 

導入

https://github.com/carlcraig/fuel-captcha から zip ファイルを落としてきて解凍して下さい。

解凍して出来たフォルダを captcha にリネームして、 fuel/package/ に突っ込んで下さい。

これで終わりです。

 

config.php の編集

app/config/config.php に以下の項目を追加して下さい。

既に packages がある場合は、 captcha を追加するだけでいいです。

 

captcha の config を編集

ここからsimplecaptcha を使うか、recaptcha を使うかで書き方が違います。

simplecaptcha を使う場合は以下のようにします。

逆に recaptcha を使いたい場合は、 simplecaptcha と書かれている部分を recaptcha にして下さい。

この設定は、デフォルトでどっちを使うかの設定なので、特にやる必要はないですが、多く使う方を指定しておくと楽になります。

 

simplecaptcha を使用する

controller フォルダに simplecaptcha.php という名のファイルを作り以下の通りにして下さい。

captcha 用の画像を生成して、返す関数を用意しています。

なお、forge に ‘simplecaptcha’ を渡していますが、何も書かなければデフォルトの方が渡されるようになっています。

が、このファイルでは絶対に省略しないで下さい。

ファイルを作ったら、 fuel/package/captcha/config/simplecaptcha.php を以下の様に編集して下さい。

特にいじってなければ58行目にあると思います。

これは、captcha 用の画像はどれを使うのかという指定をしています。

この場合は先程の get_image 関数を指定いるわけです。

肝心の使い方は以下のようになります。

これがビューです。名前は captchatest.smarty としてます。

で、これがコントローラです。captchatest.php としてます。

Captcha::forge(‘simplecaptcha’)->html() で入力フォーム付きの HMLT を生成してくれます。

んでもって Captcha::forege(‘simplecaptcha’)->check() で入力した文字列が正しいかチェックをかけてます。

 

recaptcha を使う

私はこちらを使うのをオススメします。セキュリティの問題で・・・。

recaptcha とはgoogleさんが提供している captcha です。

まず、http://www.google.com/recaptcha にアクセスし、USE reCAPTCHA YOUR SITE をクリックして下さい。

そしたら SIGN UP をクリック、出てきた画面で recaptcha を使用したい画面のURLを入力しって、Create Key ボタンを押して下さい。

※Enable this key on all domains (global key) にチェックを付けるかドウかはTipsをよく読んでください。

ボタンを押したあとに出てきた画面で、 Public Key と Private Key をメモしておきましょう。

fuel/package/captcha/config/recaptcha.php に同じ項目があるので、メモした内容をペーストして下さい。

で、肝心の使い方なんですが、ビューとコントローラーは simplecapthca とまったく同じです。

forge 関数に渡す文字列を simplecaptcha から recaptcha に変えるだけです。

もし、デフォルトを simplecatpcha にしてて、 forge 関数ではなくも渡してないなら。デフォルトを recaptcha に変えるだけで終わりです。

 

以上で、画像認証についての説明を終わります。

では、おやすみなさい。・

チュートリアル セッション

前 チュートリアル 複数のアプリケーションをフォルダごとにわける

次 チュートリアル 画像認証

 

おはようございます。何も買わないのに通販番組を見るのが好きなゆうきんです。

・・・セッション・・・。この単語を聞いただけで拒否反応が出るあなた。

そんなあなたに朗報です。

FuelPHP なら、なんと!簡単にセッション管理できるんです! オーディエンス<ナンダッテー!

 

セッション開始

これでセッションを開始できます。

古いセッションがある場合は破棄します。

 

セッションに値をセット

多分見ただけでわかりますよね。

第1引数でセッション名、第2引数で値を渡してあげるだけです。

サンプルのように連想配列も渡すことができます。

 

セッションから値の取得

これで、値の取得ができます。

格納したときと同じ型で返ってくるので、この場合は連想配列です。

 

セッションから値の削除

セッションから値を破棄するだけです。

セッション自体が破棄されるわけではありません。

 

セッションの破棄

これで、セッションを破棄します。

セッションにセットした値も全て破棄されます。

 

セッションにフラッシュ変数をセット

構成によってページのリクエストや変数の取得が行われたら、値が破棄される変数をセットします。

使い方は普通に値をセットするときと同じです。

 

セッションからフラッシュ変数を取得

フラッシュ変数を取得すると、フラッシュ変数が削除されます。

 

フラッシュ変数の寿命を延ばす

次の消されるタイミングまで、寿命を延ばすことができます。

 

セッションからフラッシュ変数を削除

削除したい場合これで。

 

基本的には、これだけでセッション管理できます。

他にも数個、関数があるのですが、使い方がわからないため説明できません。ごめんなさい。

でも、上記の関数だけで良いと思います。

 

以上でセッションの説明を終わります。

ちなみに、デフォルトではセッションはクッキーに保存されますが、ファイルやDBに保存することも可能らしいです。

今のところ必要性を感じないので、使うときが来たら説明します。

では、おやすみなさい。

FuelPHP tips Fuelのセキュリティ機能2

出力フィルタ
URIフィルタ
SQL文の自動エスケープ
・入力フィルタ
・XSSフィルタ
・バリデーション(検証)
・CSRF保護

はい、Fuelのセキュリティ機能1で説明できなかった残り4つ行きます。
微妙に順番が変わってるのは気にしない。

 

1. 入力フィルタ

入力フィルタとは、スーパーグローバル変数の内
$_POST
$_GET
$_COOKIE
この3つを処理する機能です。
フォームからの入力やクッキーの値などに独自のフィルタをかける事が可能です。
デフォルトではなにも設定されておらず全く機能しません。

ほら、coreの方のconfig見ても何もないでしょ?array()の中が空でしょ?
この中には自分で作った関数を入れる事ができます。(使う時はcoreじゃなくappの方を編集しましょう。)
例えば、出力フィルタやURIフィルタで使用されている「htmlentities」を指定できたりします。(公式ドキュメント引用)
このブログの住人が参考にしている書籍では文字エンコーディングのフィルタを用意していましたね。

指定の仕方は例えば次のようになります。

Oreクラスのruleメソッドを指定してます。
でもって次がそのクラスです。配置は app/class/ore.php

ランダムで100分の1の確率で処理を受け付ける的な感じになってます。
サンプルです。あくまでサンプルです。
普通だったら文字エンコーディングのチェックとかすると思います。

 

なぜこの入力フィルタがデフォルトで有効になってないかというと、公式ドキュメントが

「そんなことより出力フィルタが先だ」って言ってた気がする。

最終的に出力フィルタで全部エスケープするよ。って事だろうか。

 

2. XSSフィルタ

さぁ、なんて読むだろうか。
クロスサイトスクリプティングと読むらしい。
ちなみに、Fuelのセキュリティ機能1の出力フィルタでやった危ないサンプルがあったけど、あれがXSSです。
出力フィルタで使用しているhtmlentitiesだけでは対処が難しい場合、
Securityクラスが用意している「xss_clean()」っていう関数を使えばいいらしいです。
htmLawedというライブラリを使用してるらしいです。
なんでもかんでもタグ文字とかをエスケープするのではなく、危険なコードを安全なものに直したりするらしいんですがショウジキヨクワカラナイシシュツリョクフィルタニタヨリッキリナノデパスデオネガイシマス。

一応サンプル(Viewは割愛)

各3つのサンプルの2行目、xss_clean()の行をコメントアウトしたりして動作を確認できます。

1つ目はスクリプト実行によりアラートが出てきます。
フィルタに通すと「<SCRIPT></SCRIPT>」を取り除いてくれます。

2つ目はそのまま表示されます。全てのタグを取り除くわけではないようです。

3つ目はフィルタを通すと「javascript」の前に「deny:」を付けて無効化(?)してくれたりします。
「<A HREF=・・・」は「<a href=・・・」とか小文字に直してくれて残してくれます。

FuelPHPの公式ドキュメントには、「パフォーマンスの理由」により個別の変数に対して使用することを推奨しているようです。
それよりもなによりも出力フィルタを優先すべきだと言ってるので、出力フィルタをオフにしないように心がけたい。

 

 

3. バリデーション (検証)

バリデーションは、あらかじめ作って置いたルールに基づき変数を検証することです。
「ユーザー名は○文字以下まで」
「パスワードは○文字以上○文字以下」
などです。
使い方はこちらを参照してください。
チュートリアル フォームの作成とDBの使い方

 

4.CSRF保護

このCSRF、クロスサイトリクエストフォージェリって言います。
XSSと似てますが違います。
CSRFの恐怖はこちらを参照→Wikipedia:クロスサイトリクエストフォージェリ

このCSRFの対策とし
1.ページ作成時に次の2のためのトークンを生成
2.form送信の時にCSRF対策用のトークン(hiddenでおk)を一緒に送信
3.送られてきたトークンをチェックし有効ならそのまま、無効ならアウトォォォ!

では、1のコードから2の送信

Viewで作ってます。面倒なんで。
Config::get(〜〜〜)で「security」の「csrf_token_key」の値を取得します。
デフォルトでは「fuel_csrf_token」という文字列になってます。
Security::fetch_token()でトークンを生成しています。
そして、各フォームの値と一緒に送信します。

そして、次の3のコードでチェック

メッセージが長くてうざいけど、チェックする処理自体は非常に短いです。

このCSRF保護機能ですが、中身の実装がやや怪しいらしいです(暗号論的疑似乱数生成とか)
バージョンアップで強化されていくことを願いましょう。

 

 

 

これで一応終了。
もうセキュリティって言葉ってなんだ?
っていうゲシュタルト崩壊が起きてきそうです。

FuelPHP tips Fuelのセキュリティ機能1

そろそろFuelPHPにも慣れてきたんじゃないっすかぁ?
じゃぁちょっとセキュリティとかっていう面倒くさいものをやりましょうか。
大丈夫大丈夫!FuelPHP優秀だから大丈夫だって!諦めんなよ!あっつくなれよ!

 

FuelPHPにあるセキュリティ:Security

FuelPHPには最初から以下のセキュリティ機能が入ってたりします。

出力フィルタ
URIフィルタ
SQL文の自動エスケープ
・入力フィルタ
・CSRF保護
・XSSフィルタ
・バリデーション(検証)

上3つの太字で表したものはデフォルトで有効になっています。
多分意識してないと思いますが、コントローラーからビューに変数を渡すときに出力フィルタが働いています。
1つ1つ見ていきましょうか。

 

1. 出力フィルタ

Securityクラスにhtmlentities()って関数があって、出力フィルタとURIフィルタで使ったりしてます。
この関数は文字列をエスケープして返します。
なんのこっちゃって言う人のために、以下のサンプルをどうぞ。(Viewは適当に作ってね★)

このサンプルのページにいくと、javascriptのalertが出てきて「(・ω・)」とかふざけた顔文字が出てくる。
顔文字だったらカワイイだけで済むが(かわいいよねこれ(・ω・))
これをユーザーが自由に入力できるとしたら攻撃されまくりである。
例えばユーザー名に
「<script>有害コード</script>」
って入力されたりするかもね。

なんかヤバい感じを味わったら、次は

さっき作ったサンプルの上の部分を変更してみよう。
第3引数をfalseからtrueにするのだ。
すると、今度はサンプルで書いたScriptのコードがそのまま出てきたと思う。
ブラウザの機能の「ソースコードを表示」で見てみると、不思議な文字の羅列があったりする。
これは出力フィルタがhtmlタグをそのまんまじゃなく、それを示す違う記号にエスケープしたのです。

ちなみに、第3引数を省略すると、デフォルトでtrue設定になるので安心だ(・ω・)b

便利ですね。

 

2. URIフィルタ

URIフィルタとは。
まず以下のサンプルをどうぞ

これで 「http://~~~~~/test/index/<>」というURLにアクセスしましょう。(~~~の部分は当然各環境に合わせてください)

action_indexは本来指定しなくてもアクセス出来ますが、パラメーターを$aとして受けとるために記述が必要になってきます。
そしてパラメーターとして「<>」を渡しています。(あくまで例です。他にも試してみてください。)
サンプルでは、この「<>」をSecurityクラスのhtmlentitiesを使用して、URIフィルタが機能しているかどうかを判定しています。
まぁぶっちゃけ”URIフィルタおっふ”は表示される事はないだろう。。。or

オンとかオフとか書きましたが、このURIフィルタをオフにする方法がちょっと見つからなかったので設定はデフォルトのままで放置します。

 

 

3. SQL文の自動エスケープ

FuelPHPではSQLインジェクションに対する機能があります。
データベースを扱う部分で説明すると思いますが、クエリビルダーがその役目を負っています。
例えば「DB::select()->・・・」で始まる奴とかですね。
このクエリビルダー機能で発行されたクエリは全てエスケープ済みです。
DBクラスのクエリビルダーってすごく簡単でしかもセキュリティ対策もしてくれてるのです!
いやぁSQL文使わなくても(使えなくても)いいんですよー。

 

 

あとの4つはFuelのセキュリティ機能2で説明します。

チュートリアル 複数のアプリケーションをフォルダごとにわける

前 チュートリアル フォームの作成とDBの使い方

次 チュートリアル セッション

 

おはようございます。最近21時には寝て3時に起きる、超絶早寝早起き人間のゆうきんです。

FuelPHP にも大分、慣れたことだと思います。

今回は、複数のアプリケーションをフォルダごとにわける方法を説明します。

FuelPHP のモジュール機能を使っても、数が増えすぎると限界がきますからね。

やはり、プロジェクトはわけたいところです。

 

1.FuelPHPを配置する

これは、終わっていると思うので、配置してあるディレクトリだけ覚えておいて下さい。

今回は、 home/work/ に fuelphp という名前で配置してあるものとします。

 

2.アプリケーション用のフォルダを作成する

適当な場所にフォルダを作成して下さい。

今回は FuelPHP のフォルダと同じ階層に test というフォルダを作成するとします。

作成したらフォルダ内に FuelPHP から app フォルダ、 public フォルダ、 oil をコピーして下さい。

 

3.ファイルを書き換える

public/index.php と oil を書き換えます。

コアへのパスがデフォルトとは違うので、1で覚えておいたFuelPHPのパスに変更して下さい。

今回の場合は、以下のようになります。

public/index.php

oil

相対パスにしていますが、絶対パスでもいいです。

 

3.コマンド実行

配置した test フォルダに移動して、以下のコマンドを実行してください。

 

4.Apacheのドキュメントルートフォルダにアプリケーションフォルダのシンボリックリンクを貼り付ける

test/public のシンボリックリンクを、Apache の htdocs フォルダに作成してください。

これで、公開されます。

※本当は test フォルダのシンボリックリンクを作成するらしいのですが、ファルダ構成とか見られてしまう可能性があるので、test/public としてます。

 

アプリケーションを増やすたびに 2~4 を繰り返して下さい。

では、おやすみなさい。

ページのトップへ