[PHP] セキュアなPHPアプリケーションを作成するための7つの習慣

昨今は充分にテストされたフレームワークを使うことが多いので、アプリ開発者が自らセキュリティのベーシックな部分に関わるチャンスは薄れつつあるかもしれない。だけどセキュリティは絶対におろそかにしてはいけない領域。例えば、以下のような記事を定期的に読み返すなどして、プログラミングの基本的な習慣を再確認することも必要だな。

というわけで覚え書きリンク。サンプルコードを交えて短く解りやすくまとまってる。

セキュアな PHP アプリケーションを作成するための 7 つの習慣
https://www.ibm.com/developerworks/jp/opensource/library/os-php-secure-apps/

[動画処理] Aegisub – 字幕データ作成支援ソフト

以前にSubtitle Workshopというソフトを備忘録したけど、実際に使ってみると、字幕の表示開始/終了時刻を設定するのは結構大変。しょうがないんだろうなと思いつつ、他に良さげなソフトが無いか探してみたらAegisubというソフトが見つかった。

動画の音声トラックの波形を表示して、それをマウスでクリックして字幕の時刻を設定できるのが超便利。もともとはアニメファンが字幕を付けるために有志が開発したというオープンソースのソフトウェア。まだざっとしか試していないけど使い込んでみたい。

Aegisub Advanced Subtitle Editor
http://www.aegisub.org/

[Apache] mod_actionを使ってファイル保護の仕組みを実装する

会員制サイトなど、ログイン無しでの特定ファイルのアクセスを禁止したい。

手っ取り早いのは、Basic認証でディレクトリ以下を丸ごと保護する方法。だけど、いまどきBasic認証というのもちょっと。セッションを使ったログイン管理を行っているサイトにはそぐわないし。

別の方法としては、保護したいファイルをドキュメントルート外に配置して、プログラム経由でファイルにアクセスする方法。例えば、<img src=”cat.jpg”>とする代わりに<img src=”pic.php?name=cat.jpg”>とかして、pic.php中でユーザ認証を行えば良い。だけど、HTMLのカスタマイズが必要なので採用の敷居は高い。

mod_actionを使うと、HTMLのカスタマイズ無しに後者の方法が使えるらしい。以下参考サイトより覚え書き。

mod_actionsを使ってドキュメントや画像、Flashファイルを保護する|A Day In The Boy’s Life
http://ameblo.jp/itboy/entry-10696572358.html

1. mod_actionsモジュールをロードする

/etc/httpd/conf/httpd.conf

2. .htaccessでMIMEタイプとプログラムを紐付ける

3. 保護の仕組みを実装する

check_login.php

[ソフト] Cloudfogger – クラウドファイルを自動的に暗号化

Dropboxなどの共有フォルダ内のファイルを自動的に暗号化するソフト。暗号化には256ビットのAESが使われているとのこと。クラウドから流出した場合に内容が知れるリスクを低減することができる他、特定のユーザと暗号キーを共有してファイル共有することもできる。

Cloudfogger – Free File Encryption for Dropbox and the Cloud
https://www.cloudfogger.com/en/

参考サイト

クラウドファイルを暗号化!セキュリティを高める「Cloudfogger」 – Webworker’s Clip
http://www.webworkersclip.com/2805/

無料でDropbox・SkyDriveなどを国家レベルの暗号化で自動的に保護する「Cloudfogger」 – GIGAZINE
http://gigazine.net/news/20120424-cloudfogger/

[Git] ユーザ名、メールアドレスを設定する (デフォルト/リポジトリ毎)

なかなか覚えられないので、以下のサイトから引用させてもらって覚え書き。

transitive.info – git config 使い方
http://transitive.info/article/git/command/config/

デフォルトのユーザ名、メールアドレスを設定する

デフォルトのユーザ名とメールアドレスを登録するには「–global」オプションを使って

とする。個々のリポジトリで値が定まっていないときに、これらの値が使用される。

各リポジトリに固有のユーザ名、メールアドレスを設定する

いつも使用しているユーザ名、メールアドレスとは異なるものを、 特定のリポジトリで使いたい場合がある。 対象のリポジトリで「–global」オプションを使わずに設定すれば良い。

[Webサイト運営] curlコマンドを使ってダウンロード速度を測定する

大容量ファイルをサーバーからダウンロードするのに要する時間を測定して欲しいとの依頼あり。

curlコマンドを使って実装。

これをcronで毎時1回実行してログを取る。

参考サイト

Linuxコマンド集 – 【curl】ファイルのダウンロードやアップロードを行う:ITpro
http://itpro.nikkeibp.co.jp/atcl/column/14/230520/080400003/

curlコマンドによるウェブアプリのパフォーマンス測定 (1) time_starttransferの仕様 – wagavulin’s blog
http://wagavulin.hatenablog.com/entry/2015/11/22/073137

curlコマンドによるウェブアプリのパフォーマンス測定 (2) アップロード・ダウンロード速度測定パッチ – wagavulin’s blog
http://wagavulin.hatenablog.com/entry/2016/02/14/025944

[Laravel] FULLTEXTインデックスを使った全文検索

LaravelでFULLTEXTインデックスを使った検索を行うためのメモ。ざっくり。

マイグレーション

テーブルに検索対象ワードを格納するフィールド(keywords)を定義して、FULLTEXTインデックスを振る。

検索対象ワードのセット

記事登録時にタイトルや本文をNgram/形態素解析するなどして、keywordsフィールドに検索対象となるワードを格納する。何をセットするかで検索の精度が変わってくるだろうから工夫する。

全文検索

whereRawで全文検索のためのクエリーを記述する。

参考サイト

FULLTEXT Indexes at migrations
https://laracasts.com/discuss/channels/general-discussion/fulltext-indexes-at-migrations

How to do a full text search in laravel 5
https://laracasts.com/discuss/channels/laravel/how-to-do-a-full-text-search-in-laravel-5?page=1

[MySQL] 全文検索するための基礎知識 (FULLTEXTインデックスの使い方)

ネットで検索したらいろんな記事がヒットしたけど、以下の記事は執筆日が割と最近で、かつ、僕のような初心者にも解りやすく書かれていたので覚え書きリンク。

MySQLで全文検索をするために必要なこと – 小さな星がほらひとつ
http://quotto.hatenablog.com/entry/2016/03/21/221821

[MySQL] MariaDBを5から10にアップデートする

FULLTEXTを使いたいけど、MariaDB 5だとMyISAMでしか使えない。MySQLならInnoDBで使えるので、MariaDBからMySQLに乗り換えるしかないか。と思っていたら、MariaDB 10.0.5からはInnoDBでもFULLTEXTが使えるようになっていた。

Fulltext Index Overview – MariaDB Knowledge Base
https://mariadb.com/kb/en/mariadb/fulltext-index-overview/

この恩恵に預かるべく、ステージング環境のMariaDB 5.5.44を最新の10.1にアップデートする。

手順

環境はCentOS 7、インストールにはyumを使う。

yum による MariaDB のインストール – MariaDB Knowledge Base
https://mariadb.com/kb/ja/yum/

このページの手順にほぼ従って作業する。

1. オンラインのrepository generatorを使ってMariaDB.repoエントリを作成する。

MariaDB – Setting up MariaDB Repositories – MariaDB
https://downloads.mariadb.org/mariadb/repositories/#mirror=jmu

2. /etc/yum.repos.d/ にファイルを作成して貼り付ける。

3. MariaDBサーバーとクライアントをアップデートする。

確認。

4. 再起動

参考サイト

MariaDB5からMariaDB10にアップデート | ネットワークエンジニアの居酒屋
https://www.superweibu.com/archives/5092.html

[Laravel] クライアントのIPアドレスを取得する

クライアントのIPアドレスを取得するにはどうするか。

$_SERVERに直アクセスするのも手だけど、Laravel内でスマートなやり方はないものかなーと、調べてみたらRequestクラスにメソッドが用意されていたので覚え書き。

参考サイト

php – How to get Client Ip Address in Laravel 5.1? – Stack Overflow
http://stackoverflow.com/questions/33268683/how-to-get-client-ip-address-in-laravel-5-1